جلسه دوازدهم
مقدمه
پردازندههای خانواده x86 در نسلهای جدیدتر علاوه بر دستورالعملهای پایه، مجموعهای از دستورالعملهای پیشرفته برای افزایش سرعت پردازش ارائه میدهند. یکی از مهمترین این مجموعهها SSE (Streaming SIMD Extensions) است.
این دستورالعملها برای پردازش سریع دادههای چندگانه به صورت همزمان طراحی شدهاند و در کاربردهایی مانند پردازش تصویر، گرافیک، محاسبات علمی و چندرسانهای بسیار استفاده میشوند.
در این جلسه دانشجویان با موارد زیر آشنا میشوند:
- مفهوم SIMD و SSE
- رجیسترهای مخصوص SSE
- استفاده از دستورالعملهای SSE در اسمبلی
- نوشتن برنامه ترکیبی Assembly و C
- کامپایل و اجرای برنامه
۱) مفهوم SIMD
SIMD مخفف Single Instruction Multiple Data است.
در این روش:
- یک دستور واحد
- روی چند داده به صورت همزمان اجرا میشود.
در پردازندههای معمولی هر دستور فقط روی یک داده عمل میکند، اما در SIMD میتوان چند مقدار را همزمان پردازش کرد و سرعت برنامه را افزایش داد.
کاربردهای مهم SIMD:
- پردازش تصویر
- پردازش ویدئو
- پردازش سیگنال دیجیتال
- الگوریتمهای علمی
- بازیهای کامپیوتری
۲) مجموعه دستورالعمل SSE
SSE (Streaming SIMD Extensions) مجموعهای از دستورالعملهای پردازنده x86 است که برای پردازش موازی دادهها طراحی شده است.
ویژگیهای مهم SSE:
- پردازش چند داده به طور همزمان
- افزایش سرعت محاسبات عددی
- مناسب برای عملیات برداری
- استفاده از رجیسترهای خاص
نسخههای مختلف SSE شامل:
- SSE
- SSE2
- SSE3
- SSE4
هر نسخه قابلیتهای بیشتری نسبت به نسخه قبل اضافه میکند.
۳) رجیسترهای SSE
SSE از رجیسترهای مخصوصی به نام XMM Registers استفاده میکند.
ویژگیهای این رجیسترها:
- اندازه: 128 بیت
- تعداد در معماریهای اولیه: 8 رجیستر (XMM0 تا XMM7)
- در معماریهای جدید: تا 16 رجیستر
این رجیسترها میتوانند چند مقدار را همزمان نگهداری کنند، مثلاً:
- چهار عدد 32 بیتی
- دو عدد 64 بیتی
- یا شانزده عدد 8 بیتی
۴) نمونه عملیات با SSE
با استفاده از SSE میتوان عملیاتهایی مانند موارد زیر را به صورت موازی انجام داد:
- جمع برداری
- ضرب برداری
- مقایسه چند مقدار
- عملیات منطقی
- تبدیل نوع دادهها
به عنوان مثال میتوان چهار عدد اعشاری را در یک دستور جمع کرد.
این ویژگی باعث افزایش چشمگیر سرعت پردازش میشود.
۵) برنامه ترکیبی Assembly و C
در بسیاری از پروژهها، برنامه به طور کامل با اسمبلی نوشته نمیشود.
معمولاً ساختار کلی برنامه با C یا ++C نوشته میشود و بخشهای حساس از نظر سرعت با Assembly پیادهسازی میشوند.
این روش مزایای زیر را دارد:
- توسعه آسانتر با C
- کنترل دقیق سختافزار با اسمبلی
- افزایش کارایی در بخشهای حساس برنامه
۶) روش اتصال کد Assembly به C
برای ترکیب این دو زبان چند روش وجود دارد:
۱) Inline Assembly
در این روش کد اسمبلی مستقیماً داخل برنامه C نوشته میشود.
مزیت:
- ساده و سریع
۲) Separate Assembly File
در این روش:
- کد اسمبلی در یک فایل جدا نوشته میشود
- سپس با برنامه C لینک میشود
مزیت:
- ساختار منظمتر
- مناسب برای پروژههای بزرگ
۷) مراحل کامپایل و اجرای برنامه ترکیبی
فرایند اجرای برنامه شامل مراحل زیر است:
۱. نوشتن فایل C
۲. نوشتن فایل اسمبلی
۳. اسمبل کردن فایل اسمبلی
۴. کامپایل برنامه C
۵. لینک کردن فایلها
۶. تولید فایل اجرایی
۷. اجرای برنامه
این فرایند توسط کامپایلرهایی مانند:
- GCC
- Clang
- MSVC
انجام میشود.
۸) کاربردهای عملی SSE
استفاده از SSE در بسیاری از نرمافزارهای حرفهای دیده میشود:
- موتورهای گرافیکی
- نرمافزارهای پردازش تصویر
- فشردهسازی ویدئو
- الگوریتمهای یادگیری ماشین
- محاسبات علمی و مهندسی
به همین دلیل آشنایی با آن برای دانشجویان مهندسی کامپیوتر و الکترونیک اهمیت زیادی دارد.
جمعبندی جلسه
در این جلسه با مفاهیم زیر آشنا شدیم:
- مفهوم SIMD و پردازش موازی دادهها
- مجموعه دستورالعملهای SSE در معماری x86
- رجیسترهای XMM
- روش استفاده از SSE در برنامههای اسمبلی
- ترکیب برنامههای Assembly و C
- مراحل کامپایل و اجرای برنامه
این جلسه نشان میدهد چگونه میتوان از قابلیتهای پیشرفته پردازندههای x86 برای افزایش سرعت برنامهها استفاده کرد.