موازی‌سازی در سطح دستورالعمل

رایانه Atanasoff – Berry، اولین رایانه با پردازش موازی
موازی‌سازی در سطح دستورالعمل (ILP) (به انگلیسی: Instruction-level parallelism) معیاری برای تعیین این که چه تعداد از دستورالعمل‌ها می‌توانند در یک برنامه کامپیوتری به‌طور همزمان اجرا شوند نیز است.
ILP را نباید با همزمانی یا همروندی اشتباه گرفت:
ILP اجرای موازی دنباله ای از دستورالعمل‌ها است که متعلق به یک رشته خاص از اجرای یک فرایند است (یک برنامه در حال اجرا با مجموعه ای از منابع خودش: فضای آدرس، مجموعه ای از ثبات‌ها، شناسه‌های آن، وضعیت آن، شمارنده برنامه (اشاره گر دستورالعمل) و ...) .
از طرف دیگر، همزمانی، تخصیص رشته‌های یک یا چند فرایند مختلف به هسته پردازنده در یک تغییر دقیق یا در موازی سازی واقعی را دربرمی‌گیرد .اگر هسته‌های پردازنده کافی باشد، در بهترین و ایده‌آل‌ترین حالت یک هسته برای هر رشته در حال اجرا درگیر می‌باشد.
دو روش برای موازی‌سازی در سطح دستورالعمل وجود دارد: سخت‌افزار و نرم‌افزار.
سطح سخت‌افزار بر پایه موازی سازی پویا کار می‌کند، در حالی که سطح نرم‌افزار بر پایه موازی سازی استاتیک یا ایستا کار می‌کند.
موازی سازی پویا به این معنی است که پردازنده در زمان اجرا تصمیم می‌گیرد که کدام دستورالعمل‌ها را به‌طور موازی اجرا کند، در حالی که موازی سازی ایستا به این معنی است که کامپایلر تصمیم می‌گیرد که کدام دستورالعمل‌ها را به‌طور موازی اجرا کند. پردازنده پنتیوم روی توالی دینامیکی اجرای موازی کار می‌کند، اما پردازنده ایتانیوم روی موازی‌سازی سطح استاتیک یا ایستا کار می‌کند.
برنامه زیر را در نظر بگیرید:
e = a + b
f = c + d
m = e * f
عملیات ۳ به نتایج عملیات‌های ۱ و ۲ بستگی دارد، بنابراین تا زمانی که هر دو به اتمام نرسند نمی‌توان آن را محاسبه کرد. با این حال، عملیات ۱ و ۲ به هیچ عملیات دیگری بستگی ندارند، بنابراین می‌توان آنها را به‌طور همزمان محاسبه کرد.
اگر فرض کنیم که هر عملیات می‌تواند در یک واحد زمان به اتمام برسد، این سه دستورالعمل را می‌توان در مجموع، در دو واحد زمان انجام داد، در نتیجه در یک ILP 3/2 انجام می‌شود.
هدف طراحان کامپایلر و پردازنده شناسایی و استفاده حداکثری از ILP تا حد امکان است. برنامه‌های معمولی معمولاً تحت یک مدل اجرای متوالی نوشته می‌شوند که دستورالعمل‌ها یکی پس از دیگری و به ترتیب مشخص شده توسط برنامه‌نویس اجرا می‌شوند. ILP به کامپایلر و پردازنده اجازه می‌دهد تا اجرای چندین دستورالعمل ، با یکدیگر را همپوشانی کند یا حتی ترتیب اجرای آن‌ها را تغییر دهد.
میزان ILP موجود در برنامه‌ها، متفاوت نسبت به هر برنامه است. در زمینه‌های خاص، مانند گرافیک و محاسبات علمی، مقدار آن می‌تواند بسیار زیاد باشد. با این حال، ممکن است ظرفیت‌های کاری مانند رمزنگاری موازی‌سازی بسیار کمتری را از خود نشان دهند.
تکنیک‌های معماری خرد که برای بهره‌برداری از ILP استفاده می‌شود شامل موارد زیر است:
خط لوله  که در آن اجرای چندین دستورالعمل می‌تواند تا حدی با هم تداخل داشته باشد.
اجرای سوپراسکالر، VLIW و مفاهیم رایانش موازی صریح دستورالعمل‌ها که در آن چندین واحد اجرایی برای اجرای چند دستورالعمل به‌طور موازی استفاده می‌شود.
اجرای خارج از نوبت که دستورالعمل‌ها با هر نظمی که وابستگی به داده‌ها را نقض نکند، اجرا می‌شوند. توجه داشته باشید که این روش هم از خط لوله گذاری و هم از اجرای فوق مقیاس مستقل است. پیاده‌سازی‌های فعلی اجرای خارج از دستور به صورت پویا (یعنی در حالی که برنامه در حال اجرا است و بدون هیچ کمکی از کامپایلر) ILP را از برنامه‌های معمولی استخراج می‌کند. یک گزینه جایگزین استخراج این موازی کاری در زمان کامپایل و به نوعی انتقال این اطلاعات به سخت‌افزار است. به دلیل پیچیدگی مقیاس گذاری روش اجرای خارج از سفارش، این صنعت مجموعه دستورالعمل‌هایی را که صریحاً چندین عملیات مستقل را در هر دستورالعمل رمزگذاری می‌کند، مورد بررسی مجدد قرار داده‌است.
تغییر نام ثبات ها که به تکنیکی گفته می‌شود که برای جلوگیری از سریال سازی غیرضروری عملیات برنامه اعمال شده توسط استفاده مجدد از ثبات‌ها توسط آن عملیات، برای امکان اجرای خارج از دستور استفاده می‌شود.
پیش‌بینی کننده شاخه که برای جلوگیری از متوقف شدن برای رفع وابستگی‌های کنترل استفاده می‌شود. پیش‌بینی شاخه با اجرای حدس و گمان استفاده می‌شود.
مشهور است که ILP توسط کامپایلر و پشتیبانی سخت‌افزاری مورد سوءاستفاده قرار می‌گیرد اما کامپایلر همچنین با بهره از بهینه‌سازی تلفیقی، ILP ذاتی و ضمنی را در برنامه‌ها به سخت‌افزار ارائه می‌دهد. برخی از تکنیک‌های بهینه‌سازی برای استخراج ILP موجود در برنامه‌ها شامل برنامه‌ریزی، تخصیص / ثبت نام / تغییر نام و بهینه‌سازی دسترسی حافظه است.
معماری‌های جریان داده کلاس دیگری از معماری‌ها هستند که ILP به‌طور واضح مشخص شده‌است، برای مثال اخیر معماری TRIPS را ببینید.
در سال‌های اخیر، از تکنیک‌های ILP برای بهبود عملکرد، علی‌رغم اختلاف روزافزون بین فرکانس‌های عملکرد پردازنده و زمان دسترسی به حافظه، استفاده شده‌است .(طرح‌های اولیه ILP مانند IBM System / 360 Model 91 از تکنیک‌های ILP برای غلبه بر محدودیت‌های اعمال شده توسط یک فایل ثباتی نسبتاً کوچک استفاده می‌کردند). در حال حاضر، یک حافظه پنهان گمشده برای حافظه اصلی، صدها چرخه پردازنده هزینه دربردارد. در حالی که در اصل، استفاده از ILP برای تحمل و هموارسازی چنین تأخیرهایی از حافظه امکان‌پذیر است، هزینه‌های مربوط به منابع و هزینه‌های اتلاف برق غیر متناسب هستند. علاوه بر این، پیچیدگی و اغلب تأخیر در ساختارهای سخت‌افزاری زمینه ای منجر به کاهش فرکانس عملکرد می‌شود و باعث کاهش بیشتر مزایا نیز می‌شود. از این رو، تکنیک‌های ذکر شده برای جلوگیری از متوقف شدن پردازنده برای داده‌های خارج از تراشه ناکافی هستند. در عوض، صنعت به سمت بهره‌برداری از سطوح بالاتر موازی‌سازی حرکت می‌کند که می‌توان از میان آن‌ها تکنیک‌هایی مانند چند پردازشی و چند رشته‌ای یا چندریسمانی را نام برد.