اجرای پیش‌رو

اجرای پیش‌رو روشی است که به واحد پردازش مرکزی اجازه می‌دهد در طول چرخه‌های ناشی از نقص حافظهٔ نهان، دستورالعمل‌ها را به‌صورت گمانه‌زنانه پیش‌پردازش کند.دستورالعمل‌های پیش‌پردازش‌شده برای تولید واکشی‌های پیش‌دستانهٔ جریان داده و دستورالعمل به‌کار می‌روند؛ این کار از طریق اجرای دستورالعمل‌هایی انجام می‌شود که در نهایت به نقص‌های حافظهٔ نهان منجر می‌شوند (که معمولاً بارگذاری‌های با تأخیر طولانی هستند)، پیش از آنکه این نقص‌ها در حالت عادی رخ دهند، و بدین‌ترتیب تأخیر حافظه به‌طور مؤثری پنهان می‌شود. در اجرای پیش‌رو، پردازنده از منابع اجراییِ بیکار برای محاسبهٔ نشانی‌های جریان دستورالعمل و داده استفاده می‌کند، با تکیه بر اطلاعاتی که مستقل از نقص حافظهٔ نهان در دسترس هستند.
پس از آنکه پردازنده نقص اولیهٔ حافظهٔ نهان را برطرف کرد، تمام نتایج حاصل از اجرای پیش‌رو کنار گذاشته می‌شوند و پردازنده اجرای عادی را از سر می‌گیرد.
کاربرد اصلی این روش کاهش اثرات دیوار حافظه است.
این روش همچنین می‌تواند برای اهداف دیگری به‌کار رود؛ برای نمونه، پیش‌محاسبهٔ نتیجهٔ شاخه‌ها به‌منظور دستیابی به پیش‌بینی شاخه با دقت بسیار بالا.

هزینهٔ اصلی سخت‌افزاری این روش، فراهم‌کردن سازوکاری برای نقطه‌گذاری وضعیت پروندهٔ ثبات‌ است. به‌طور معمول، پردازنده‌های مبتنی بر اجرای پیش‌رو همچنین شامل یک حافظهٔ نهان اضافیِ کوچک هستند که به عملیات ذخیره‌سازی در حالت اجرای پیش‌رو اجازه می‌دهد بدون اعمال تغییر در حافظه اجرا شوند. برخی پیاده‌سازی‌ها نیز از واحدهای شتاب‌دهی سخت‌افزاری اختصاصی برای اجرای بخش‌های مشخصی از دستورالعمل‌های پیش‌پردازش‌شده استفاده می‌کنند.

اجرای پیش‌رو در ابتدا در چارچوب یک ریزپردازنده با اجرای ترتیبی مورد بررسی قرار گرفت؛
با این حال، این روش بعدها برای استفاده در ریزپردازنده‌های با اجرای خارج از ترتیب نیز گسترش داده شد.

 تحریک 
در اصل، هر رویدادی می‌تواند اجرای پیش‌رو را فعال کند؛ با این حال، در حالت معمول شرط ورود، بروز یک نقص در حافظهٔ نهانِ سطح آخرِ داده است که به ابتدای بافر بازترتیب می‌رسد.در یک پردازندهٔ معمولی با اجرای خارج از ترتیب، چنین دستورالعمل‌های بارگذاری با تأخیر طولانی، بازنشانی (retirement) تمام دستورالعمل‌های جوان‌تر را تا زمانی که نقص برطرف شود و بارگذاری بازنشسته گردد، مسدود می‌کنند.

وقتی پردازنده وارد حالت اجرای پیش‌رو می‌شود، از تمام ثبات‌های معماری یک نقطهٔ بازیابی (checkpoint) تهیه می‌کند و نشانیِ دستورالعمل بارگذاری‌ای را که موجب ورود به اجرای پیش‌رو شده است، ثبت می‌نماید. سپس تمام دستورالعمل‌های موجود در خط لوله به‌عنوان دستورالعمل‌های اجرای پیش‌رو علامت‌گذاری می‌شوند. از آنجا که مقدار بازگردانده‌شده از یک نقص حافظهٔ نهان از پیش قابل دانستن نیست، ممکن است دستورالعمل‌های پیش‌پردازش‌شده به داده‌های نامعلوم یا نامعتبر وابسته باشند. ثبات‌هایی که چنین داده‌هایی را نگه می‌دارند، یا داده‌هایی که به آن‌ها وابسته‌اند، با افزودن یک بیت «نامعتبر» یا INV به هر ثبات در فایل ثبات‌ها مشخص می‌شوند. دستورالعمل‌هایی که از این داده‌های نامعتبر استفاده می‌کنند یا آن‌ها را می‌نویسند نیز با بیت INV علامت‌گذاری می‌شوند. اگر دستورالعملی که اجرای پیش‌رو را آغاز کرده یک بارگذاری باشد، یک نتیجهٔ صوری به آن تخصیص داده می‌شود و به‌عنوان INV علامت‌گذاری می‌گردد؛ این کار به آن اجازه می‌دهد ثبات مقصد خود را INV علامت بزند و از خط لوله خارج شود.

 پیش‌پردازش دستورالعمل‌ها 
در حالت اجرای پیش‌رو، پردازنده اجرای دستورالعمل‌ها را پس از دستورالعملی که موجب آغاز اجرای پیش‌رو شده است ادامه می‌دهد. با این حال، اجرای پیش‌رو یک حالت گمانه‌زنانه در نظر گرفته می‌شود که در آن پردازنده صرفاً تلاش می‌کند نقص‌های اضافیِ حافظهٔ نهانِ داده و دستورالعمل را ایجاد کند؛ نقص‌هایی که عملاً به‌منزلهٔ واکشی‌های پیش‌دستانه هستند. طراح سامانه می‌تواند انتخاب کند که در اجرای پیش‌رو، دستورالعمل‌هایی که در حافظهٔ نهانِ دستورالعمل حضور ندارند نادیده گرفته شوند؛ با این درک که کیفیت هر واکشی پیش‌دستانه‌ای که تولید می‌شود کاهش خواهد یافت، زیرا اثر دستورالعمل‌های غایب نامعلوم است.

ثبات‌هایی که مقصدِ دستورالعملی هستند که یک یا چند ثبات منبعِ آن با برچسب INV علامت‌گذاری شده‌اند، خود نیز به‌عنوان INV علامت‌گذاری می‌شوند. این سازوکار به پردازنده امکان می‌دهد تشخیص دهد کدام مقادیر ثبات‌ها در حالت اجرای پیش‌رو (احتمالاً) قابل اعتماد هستند. دستورالعمل‌های شاخه‌ای که به‌دلیل وجود ثبات‌های منبعِ INV قابل حل نیستند، به‌سادگی به این صورت در نظر گرفته می‌شوند که به‌درستی پیش‌بینی شده‌اند. در صورتی که شاخه به‌اشتباه پیش‌بینی شده باشد، پردازنده اجرای دستورالعمل‌های مسیر نادرست را ادامه می‌دهد تا به نقطه‌ای مستقل از شاخه برسد؛ که این امر می‌تواند به اجرای بارگذاری‌های مسیر نادرست منجر شود و حافظهٔ نهان را با ورودی‌های دادهٔ بلااستفاده آلوده کند. نتایج معتبرِ دستورالعمل‌های شاخه‌ای می‌توانند برای استفاده‌های بعدی ذخیره شوند تا در اجرای عادی، به‌عنوان پیش‌بینی‌هایی با دقت بسیار بالا به کار روند.

از آنجا که اجرای پیش‌رو یک حالت گمانه‌زنانه است، نمی‌توان به دستورالعمل‌های ذخیره‌سازی اجازه داد حافظه را تغییر دهند. برای انتقال نتایج ذخیره‌سازی به بارگذاری‌های وابسته، می‌توان از یک حافظهٔ نهان بسیار کوچک که فقط توسط بارگذاری‌ها و نقص‌های اجرای پیش‌رو مورد دسترسی قرار می‌گیرد و حافظهٔ نهان اجرای پیش‌رو نام دارد، استفاده کرد.این حافظهٔ نهان از نظر کارکردی مشابه یک حافظهٔ نهان معمولی است، اما شامل بیت‌های INV برای ردیابی داده‌های نامعتبر است. ذخیره‌سازی‌های INV بیت INV خط متناظر حافظهٔ نهان مقصد را فعال می‌کنند، در حالی که ذخیره‌سازی‌های معتبر، بیت INV همان خط را بازنشانی می‌کنند. هر دستورالعمل بارگذاری در اجرای پیش‌رو باید هم حافظهٔ نهان واقعی و هم حافظهٔ نهان اجرای پیش‌رو را بررسی کند. اگر بارگذاری در حافظهٔ نهان اجرای پیش‌رو اصابت کند، نتیجهٔ حافظهٔ نهان واقعی کنار گذاشته می‌شود و دادهٔ حافظهٔ نهان اجرای پیش‌رو به‌کار می‌رود؛ داده‌ای که در صورت علامت‌گذاری خط حافظهٔ نهان با بیت INV ممکن است نامعتبر باشد. از آنجا که حافظهٔ نهان اجرای پیش‌رو از سلسله‌مراتب حافظه جداست، محلی برای بیرون‌رانی داده‌های قدیمی وجود ندارد؛ بنابراین، در صورت بروز یک تعارض حافظهٔ نهان، داده‌های قدیمی به‌سادگی از حافظهٔ نهان حذف می‌شوند. توجه داشته باشید که به‌دلیل اندازهٔ محدود حافظهٔ نهان اجرای پیش‌رو، ردیابی کامل داده‌های INV در طول حالت اجرای پیش‌رو امکان‌پذیر نیست (زیرا ممکن است داده‌های INV در اثر یک تعارض حافظهٔ نهان توسط داده‌های معتبر بازنویسی شوند). در عمل، این موضوع بحرانی نیست، زیرا تمام نتایجی که در طول اجرای پیش‌رو محاسبه می‌شوند کنار گذاشته می‌شوند.

 خروج 
همانند ورود به اجرای پیش‌رو، در اصل هر رویدادی می‌تواند علت خروج از اجرای پیش‌رو باشد. با این حال، در حالتی که دورهٔ اجرای پیش‌رو در اثر یک نقص حافظهٔ نهان آغاز شده باشد، معمولاً به‌محض آنکه نقص حافظهٔ نهان برطرف شود، از این حالت خارج می‌شود.

هنگامی که پردازنده از اجرای پیش‌رو خارج می‌شود، تمام دستورالعمل‌هایی که جوان‌تر از دستورالعمل آغازکنندهٔ اجرای پیش‌رو هستند و خود آن دستورالعمل حذف شده و از خط لوله تخلیه می‌شوند. سپس فایل ثبات‌های معماری از روی نقطهٔ بازیابی بازگردانی می‌شود. سپس یک جدول ازپیش‌تعیین‌شدهٔ نگاشت ثبات‌ها (RAT) در هر دو RAT بخش جلویی و پشتی کپی می‌شود. در نهایت، پردازنده به نشانیِ دستورالعملی که اجرای پیش‌رو را آغاز کرده بود هدایت می‌شود و سپس اجرای برنامه را در حالت عادی از سر می‌گیرد.

 روش‌های ذخیره و بازیابی وضعیت ثبات‌ها 
ساده‌ترین روش برای تهیهٔ نقطهٔ بازیابی از فایل ثبات‌های معماری (ARF) این است که هنگام ورود پردازنده به حالت اجرای پیش‌رو، یک کپی کامل از کل فایل ثبات‌های فیزیکی (PRF) از آن‌جا که PRF یک ابرمجموعه از ARF استدر یک فایل ثباتِ نقطهٔ بازیابی (CRF) ذخیره شود. هنگامی که از اجرای پیش‌رو خارج می‌شود، پردازنده می‌تواند یک کپی کامل از CRF به PRF انجام دهد. با این حال، گزینه‌های کارآمدتری نیز در دسترس هستند.

یکی از راه‌های حذف عملیات کپی این است که در اجرای عادی، نوشتن‌ها به‌طور هم‌زمان هم در فایل ثبات‌های فیزیکی (PRF) و هم در فایل ثباتِ نقطهٔ بازیابی (CRF) انجام شوند، اما در حالت اجرای پیش‌رو تنها در PRF نوشته شود. این رویکرددر صورتی که CRF و PRF به‌صورت موازی نوشته شوندمی‌تواند سربارِ نقطهٔ بازیابی را که در غیر این صورت هنگام آغاز اجرای پیش‌رو تحمیل می‌شود حذف کند؛ با این حال، پردازنده همچنان هنگام خروج از اجرای پیش‌رو ناچار است PRF را بازیابی کند.

از آن‌جا که تنها ثبات‌هایی که نیاز به ایجاد نقطهٔ بازگشت دارند ثبات‌های معماری هستند، پروندهٔ ثبات نقطهٔ بازگشت (CRF) فقط لازم است به تعداد ثبات‌های معماری موجود باشد؛ تعداد این ثبات‌ها توسط معماری مجموعه‌دستورالعمل‌ها تعیین می‌شود. از آن‌جایی که پردازنده‌ها معمولاً تعداد بسیار بیشتری ثبات فیزیکی نسبت به ثبات‌های معماری دارند، این موضوع باعث می‌شود اندازهٔ CRF به‌طور قابل‌توجهی کوچک‌تر شود.

رویکردی حتی تهاجمی‌تر آن است که در حالت اجرای پیش‌رو ، پردازنده تنها به مسیرهای ارسال عملوند در ریزمعماری تکیه کند تا مقادیر تغییر‌یافتهٔ موقت را در اختیار دستورالعمل‌ها قرار دهد. در این حالت، پروندهٔ ثبات به‌صورت ضمنی «چک‌پوینت» می‌شود؛ بدین معنا که در طول اجرای پیش‌رو، نوشتن در پروندهٔ ثبات‌ها غیرفعال می‌گردد.

 بهینه‌سازی‌ها 
اگرچه اجرای پیش‌رو با هدف افزایش کارایی پردازنده طراحی شده است، اما پیش‌پردازش دستورالعمل‌ها در زمانی که پردازنده در حالت عادی می‌توانست بیکار باشد، به‌دلیل افزایش توان پویا موجب کاهش بهره‌وری انرژی پردازنده می‌شود. افزون بر این، ورود به حالت اجرای پیش‌رو و خروج از آن با سربار کارایی همراه است؛ زیرا چک‌پوینت‌گیری از ثبات‌ها و به‌ویژه تخلیهٔ خط لوله ممکن است چرخه‌های ساعت زیادی را به خود اختصاص دهد. بنابراین، آغاز اجرای پیش‌رو در هر فرصت ممکن تصمیمی عاقلانه نیست.

برخی بهینه‌سازی‌هایی که می‌توانند بهره‌وری انرژی اجرای پیش‌رو را بهبود دهند عبارت‌اند از:

 ورود به حالت اجرای پیش‌رو تنها در صورتی که انتظار می‌رود پردازنده در طول اجرای پیش‌رو، بارگذاری‌های با تأخیر طولانی اجرا کند؛ که این کار باعث کاهش دوره‌های کوتاه و غیرمولد اجرای پیش‌رو می‌شود.

 محدود کردن طول دوره‌های اجرای پیش‌رو به‌گونه‌ای که فقط تا زمانی ادامه یابند که انتظار می‌رود نتایج مفید تولید کنند.

 پیش‌پردازش فقط آن دسته از دستورالعمل‌هایی که در نهایت به دستورالعمل‌های بارگذاری منتهی می‌شوند.

 استفاده از اجرای پیش‌رو تنها با تکیه بر منابع آزاد پردازنده برای پیش‌پردازش دستورالعمل‌ها.

 بافرکردن ریزعملیات‌ها که در طول اجرای پیش‌رو رمزگشایی شده‌اند، به‌منظور استفادهٔ مجدد از آن‌ها در حالت اجرای عادی.

 اثرات جانبی 
اجرای پیش‌رو به‌عنوان یک اثر جانبی، موجب بهبود نرخ خطاهای نرم در پردازنده‌ها می‌شود. هنگامی که پردازنده در انتظار رفع یک نقص حافظهٔ نهان است، کل وضعیت پردازنده در مدت زمان باقی‌ماندن نقص، در معرض خطاهای نرم قرار دارد. با ادامهٔ اجرای دستورالعمل‌ها، اجرای پیش‌رو به‌طور ناخواسته مدت زمانی را که وضعیت پردازنده در برابر خطاهای نرم آسیب‌پذیر است کاهش می‌دهد و در نتیجه، نرخ بروز خطاهای نرم نیز کاهش می‌یابد.

 جستارهای وابسته 

 پردازندهٔ خارج از ترتیب
 کاوشگر سخت‌افزاری

 منابع 

Pruett, Stephen; Patt, Yale (October 2021).
Branch Runahead: An Alternative to Branch Prediction for Impossible to Predict Branches.
MICRO-54: 54th Annual IEEE/ACM International Symposium on Microarchitecture (MICRO '21).
New York, NY, USA: Association for Computing Machinery.
pp. 804–815.
doi:10.1145/3466752.3480053.
ISBN 978-1-4503-8557-2.
S2CID 239011545.
Hashemi, Milad; Mutlu, Onur; Patt, Yale N. (October 2016).
Continuous runahead: Transparent hardware acceleration for memory intensive workloads.
Proceedings of the 49th Annual IEEE/ACM International Symposium on Microarchitecture (MICRO).
pp. 1–12.
doi:10.1109/MICRO.2016.7783764.
ISBN 978-1-5090-3508-3.
S2CID 439575.
Dundas, James D.; Mudge, Trevor N. (September 1996).
Using stall cycles to improve microprocessor performance.
Technical report.
Department of Electrical Engineering and Computer Science,
University of Michigan.
Mutlu, Onur; Stark, J.; Wilkerson, C.; Patt, Yale N. (February 2003).
Runahead execution: An alternative to very large instruction windows for out-of-order processors.
Proceedings of the Ninth International Symposium on High-Performance Computer Architecture (HPCA-9).
pp. 129–140.
doi:10.1109/HPCA.2003.1183532.
ISBN 0-7695-1871-0.
S2CID 9016814.
Van Craeynest, Kenzo; Eyerman, Stijn; Eeckhout, Lieven (2009).
MLP-Aware Runahead Threads in a Simultaneous Multithreading Processor.
In: Seznec, André; Emer, Joel; O’Boyle, Michael; Martonosi, Margaret (eds.).
High Performance Embedded Architectures and Compilers.
Lecture Notes in Computer Science, Vol. 5409.
Berlin, Heidelberg: Springer.
pp. 110–124.
doi:10.1007/978-3-540-92990-1_10.
ISBN 978-3-540-92989-5.
Van Craeynest, Kenzo; Eyerman, Stijn; Eeckhout, Lieven (2009).
MLP-Aware Runahead Threads in a Simultaneous Multithreading Processor.
In: Seznec, André; Emer, Joel; O’Boyle, Michael; Martonosi, Margaret; Ungerer, Theo (eds.).
High Performance Embedded Architectures and Compilers.
Lecture Notes in Computer Science, Vol. 5409.
Berlin, Heidelberg: Springer.
pp. 110–124.
doi:10.1007/978-3-540-92990-1_10.
ISBN 978-3-540-92990-1.
Hashemi, Milad; Patt, Yale N. (December 5, 2015).
Filtered runahead execution with a runahead buffer.
Proceedings of the 48th International Symposium on Microarchitecture (MICRO-48).
New York, NY, USA: Association for Computing Machinery.
pp. 358–369.
doi:10.1145/2830772.2830812.
ISBN 978-1-4503-4034-2.
S2CID 2897777.
Naithani, Ajeya; Feliu, Josué; Adileh, Almutaz; Eeckhout, Lieven (February 2020).
Precise Runahead Execution.
Proceedings of the 2020 IEEE International Symposium on High Performance Computer Architecture (HPCA).
pp. 397–410.
doi:10.1109/HPCA47549.2020.00040.
hdl:1854/LU-8668193.
ISBN 978-1-7281-6149-5.
S2CID 215817567.
Naithani, Ajeya; Eeckhout, Lieven (April 2022).
Reliability-Aware Runahead.
Proceedings of the 2022 IEEE International Symposium on High-Performance Computer Architecture (HPCA).
IEEE.
pp. 772–785.
doi:10.1109/HPCA53966.2022.00062.
ISBN 978-1-6654-2027-3.
S2CID 248865294.

رده:حافظه نهان
رده:پردازش دستورها
رده:همروندی