SSE2

Streaming SIMD Extensions 2) SSE2) یکی از دستورالعمل های تکمیلی پردازنده اینتل SIMD (یک دستورالعمل، چند داده) است که ابتدا توسط Intel با نسخه اولیه Pentium 4 در سال 2000 معرفی شد. این مجموعه دستورالعمل های قبلی SSE را گسترش می دهد و به طور کامل جایگزین MMX می شود. اینتل SSE2 را برای ایجاد SSE3 در سال 2004 توسعه داد. SSE2 تعداد 144 دستورالعمل جدید برای SSE اضافه کرده است که دارای 70 دستورالعمل است. سازنده تراشه رقیب AMD، پشتیبانی از SSE2 را با معرفی پردازندههای 64 بیتی AMD64 ،Opteron و Athlon 64 خود در سال 2003 اضافه کرد.

امکانات

اکثر دستورالعمل های SSE2 اجرای عملیات برداری اعداد صحیح را پیاده سازی می کند که در MMX نیز پیدا می شوند. آن ها به جای ثبات های MMX، از ثبات های XMM استفاده می کنند که گسترده تر است و برای بهبود عملکرد قابل توجهی در برنامه های تخصصی امکان پذیر است. یکی دیگر از مزیت های جایگزینی MMX با SSE2 اجتناب از پنالتی تغییر حالت برای صدور دستورالعمل x87 موجود در MMX است زیرا فضای ثبات را با x87 FPU به اشتراک می گذارد. SSE2 همچنین عملیات بردار اعداد شناور دستورالعمل SSE را با اضافه کردن پشتیبانی از نوع داده دو برابر دقیق، کامل می کند.
سایر افزونه های SSE2 شامل مجموعه ای از دستورات کنترل کش هستند که عمدتاً برای به حداقل رساندن آلودگی کش هنگام پردازش بی نهایت اطلاعات و تکمیل کامل از دستورالعمل های تبدیل فرمت عددی است.
پیاده سازی SSE2 در پلتفرم (AMD64 (x86-64 توسط AMD، حاوی هشت ثبات اضافی است، که تعداد کل آنها را تا 2 برابر کرده و به 16 عدد می رساند (XMM0 تا XMM15). این ثبات های اضافی تنها زمانی که در حالت 64 بیتی اجرا می شوند قابل مشاهده هستند. اینتل این ثبات های اضافی را به عنوان بخشی از حمایت خود از معماری x86-64 ( یا در سخنرانی اینتل، "Intel 64" ) در سال 2004 تصویب کرد.

تفاوت های بین x87 FPU و SSE2

دستورالعمل های (FPU (x87 با محاسبه نتایج میانی با 80 بیت دقت، به طور پیش فرض، برای به حداقل رساندن خطای دورافتاده در الگوریتم های عددی ناپایدار (منطق طراحی IEEE 754 و منابع ان را ببینید) دقت بیشتری را به ارمغان می آورد. با این حال، FPU x87 تنها یک واحد اسکالر است در حالی که SSE2 می تواند یک بردار کوچک از operand ها را به صورت موازی پردازش کند.
اگر کدهای طراحی شده برای x87 به نقاط با کمترین دقت با دو رقم اعشار دقت SSE2 منتقل شوند، ترکیبات خاصی از عملیات ریاضی یا داده های ورودی می تواند منجر به انحراف عددی قابل ملاحظه ای شود که می تواند مسئله ای قابل بازبینی در محاسبات علمی باشد، مثلاً هنگامی که نتیجه محاسبات میبایست با نتایج ایجاد شده از معماری ماشین های مختلف مقایسه شود. یک مسئله مرطبت این است که از لحاظ تاریخی استانداردهای زبان و کامپایلر در معماری خود از رجیستر 80 بیتی x87 که دو متغیر دقت افزایش یافته را در مقایسه با فرمت های دو و یک دقت که در SSE2 پیاده سازی می شوند گرد هم آمده اند: گرد کردن دقت های اضافه شده در مقادیر متوسط به مقادیر با دو برابر دقت به طور کامل تعریف نشده و وابسته به جزئیات پیاده سازی است مانند زمانیکه رجیسترها حافظه را پر کرده بودند.

تفاوت های بین MMX و SSE2

SSE2 دستورالعمل های MMX را برای کار بر روی ثبات XMM گسترش می دهد. بنابراین، می توان تمام کد های MMX موجود را به معادل SSE2 تبدیل کرد. از آنجا که طول یک ثبات SSE2 دو برابر طول یک ثبات MMX می باشد، شمارنده های حلقه و دسترسی به حافظه ممکن است برای دستیابی به این هدف ممکن است به تغییر نیاز داشته باشند . با این حال، بارگیری و ذخیره 8 بایتی در XMM در دسترس هستند، بنابراین این مورد به خیلی مورد نیاز نیست.
اگر چه یک دستور SSE2 می تواند با دو برابر داده نسبت به یک دستور MMX عمل کند، عملکرد ممکن است به طور قابل توجه افزایش نیافته باشد. دو دلیل عمده این ها هستند: دسترسی به داده های SSE2 در حافظه که با یک مرز 16 بایت همسان نیستند می توانند پنالتی قابل توجهی را تحمل نمایند و کارایی دستورالعمل های SSE2 در اجرای پیاده سازی های x86 قدیمی تر از نصف دستورات MMX است. اینتل اولین مشکل را با اضافه کردن دستورالعمل در SSE3 به منظور کاهش هزینه بالای دسترسی به داده های غیر مشترک و بهبود عملکرد کلی بارگیری های ناهموار، و آخرین مشکل با گسترش موتور اجرایی در Core microarchitecture آن ها در Core 2 Duo و محصولات بعدی، خطاب کرد.
از آن ها که فایل های ثبات MMX و x87 را به جای یکدیگر می نامند، استفاده از MMX، از اجرای دستورات x87 به صورت پیش فرض جلوگیری خواهد کرد. هنگامی که MMX مورد استفاده قرار گرفته باشد، برنامه نویس باید از دستورات C: _mm_empty()) emms) برای بازگرداندن عملیات به فایل ثباتx87 استفاده کند. در برخی از سیستم عامل ها، x87 خیلی مورد استفاده قرار نمی‌گیرد اما هنوز ممکن است در بعضی از نقاط بحرانی مانند ()pow که در آن دقت زیاد مورد نیاز است، استفاده می شود. در چنین مواردی، حالت نادرست عدد شناور از عدم انتشار emms ممکن است برای میلیونها دستورالعمل قابل شناسایی نباشد، و در نهایت موجب خروجی نادرست در شناور شدن می شود و NaN باز می گرداند. از آنجا که این مشکل در کد MMX مشخص نیست، پیدا کردن و اصلاح اشکال می تواند بسیار وقت گیر باشد. از آن جا که SSE2 این مشکل را ندارد، معمولاً عملکرد بهتری را دربر دارد و رجیسترهای بیشتری را در کد 64 بیتی فراهم می کند، باید برای تقریباً تمام کارهای برداری ترجیح داده شود.

استفاده کامپایلر

هنگامی که برای اولین بار در سال 2000 معرفی شد، SSE2 با ابزارهای توسعه نرم‌افزار پشتیبانی نمی شد. برای مثال، برای استفاده از SSE2 در یک پروژه مایکروسافت ویژوال استودیو ، برنامه نویس مجبور بود که به صورت دستی کد اسمبلی درخط بنویسد یا کد مورد نظر را از یک منبع خارجی وارد کند. بعدها بسته پردازشگر ویژوال ++C پشتیبانی از SSE2 را به ++Visual C و MASM اضافه کرد.
کامپایلر ++C اینتل می تواند به طور خودکار SSE4 ، SSSE3 ، SSE3 ، SSE2 و SSE را بدون استفاده از کد دستی اسمبلی تولید کند.
از زمان 3 GCC ، GCC می تواند به طور خودکار کد اسکالر SSE / SSE2 را هنگامی که هدف از این دستورالعمل ها پشتیبانی می کند، تولید کند. برداربندی اتوماتیک برای SSE / SSE2 از زمان GCC 4 اضافه شده است.
Sun Studio Compiler Suite همچنین می تواند دستورالعمل های SSE2 را هنگام استفاده از گزینه کامپایلر xvector=simd- تولید کند.
از زمان مایکروسافت Visual C ++ 2012، گزینه کامپایلر برای تولید دستورالعمل SSE2 به طور پیش فرض فعال شده است.