چگونه خط لوله دستورالعمل و اجرای خارج از ترتیب، تاخیر را از توان عملیاتی در پردازندههای مدرن جدا میکنند
پردازندههای مدرن دستاوردهای عظیم عملکردی خود را نه با تکمیل سریعتر تکتک دستورالعملها، بلکه با همپوشانی و اجرای خارج از ترتیب آنها به دست میآورند. این تغییر معماری، زمان لازم برای پایان دادن به یک کار را از حجم کارهای انجامشده در هر ثانیه جدا میکند.
به قلم کاوان رامین
این خبر را به اشتراک بگذارید
- مهندسی سختافزار
- پیچیدگی معماری را برای استخراج حداکثر موازیسازی در سطح دستورالعمل از پایگاههای کد موجود در اولویت قرار میدهد.
- بهینهسازی نرمافزار
- بر نوشتن کدهای قابل پیشبینی و سازگار با حافظه پنهان تمرکز دارد که نیاز پردازنده به حدس زدن یا مرتبسازی مجدد دستورالعملها را به حداقل میرساند.
- معماری سیستمها
- مبادلات سطح بالا بین تاخیر، توان عملیاتی و پهنای باند را در سراسر پشته محاسباتی تجزیه و تحلیل میکند.
دیدگاههایی که این گزارش پوشش نداده
- طراحان کامپایلر که ابزارهایی را میسازند تا دستورالعملها را قبل از اینکه پردازنده آنها را ببیند، توالیبندی کنند.
- تحلیلگران امنیتی که آسیبپذیریهای کانال جانبی ایجادشده توسط اجرای خارج از ترتیب و گمانهزنی را مطالعه میکنند.
اصطلاحات کلیدی
- تاخیر (Latency)
- مدت زمانی که طول میکشد تا یک دستورالعمل واحد از مرحله واکشی تا بازنشستگی طی شود.
- توان عملیاتی (Throughput)
- حجم کل دستورالعملهایی که یک پردازنده میتواند در یک بازه زمانی مشخص تکمیل کند.
- خط لوله (Pipelining)
- تکنیکی که در آن اجرای چندین دستورالعمل با هم همپوشانی دارند، شبیه به یک خط مونتاژ کارخانه.
- اجرای خارج از ترتیب (Out-of-Order Execution)
- پارادایمی که در آن پردازنده دستورالعملها را به محض آماده شدن دادههایشان اجرا میکند، نه بر اساس ترتیب دقیق برنامه.
- بافر مرتبسازی مجدد (Reorder Buffer)
- یک ساختار سختافزاری که نتایج دستورالعملهای خارج از ترتیب را نگه میدارد و آنها را با توالی صحیح در وضعیت پردازنده ثبت میکند.
نکات کلیدی
- تاخیر، زمان تکمیل یک دستورالعمل را اندازهگیری میکند، در حالی که توان عملیاتی، کل دستورالعملهای تکمیلشده در طول زمان را میسنجد.
- خط لوله دستورالعمل، مراحل چندین دستورالعمل را همپوشانی میکند و مانند یک خط مونتاژ برای افزایش توان عملیاتی عمل میکند.
- اجرای خارج از ترتیب با پردازش دستورالعملهای مستقل در حالی که دستورالعملهای قدیمیتر منتظر داده هستند، از توقف خط لوله جلوگیری میکند.
- این معماریها به بافرهای مرتبسازی مجدد پیچیدهای نیاز دارند تا اطمینان حاصل شود که نتایج در توالی اصلی برنامه ثبت میشوند.
- سربار بررسی وابستگیها در واقع تاخیر تکدستورالعمل را افزایش میدهد تا توان عملیاتی کلی بالاتری به دست آید.
در سال ۱۹۸۵، پردازنده Intel 80386 دستورالعملها را دقیقاً به همان ترتیبی که نوشته شده بودند اجرا میکرد و برای پایان دادن به یکی و شروع دیگری، چندین چرخه ساعت (Clock Cycle) زمان میبرد. اما امروزه، یک پردازنده مدرن مصرفکننده منتظر نمیماند. در عوض، جریان دستورالعملها را میشکافد، مسیر انشعابها را حدس میزند و دهها عملیات را بهطور همزمان و خارج از ترتیب پردازش میکند. این تغییر بنیادین در معماری، دو مفهومی را که بازاریابی سختافزار اغلب با هم خلط میکند، از یکدیگر جدا میسازد: تاخیر (Latency) و توان عملیاتی (Throughput). همانطور که AlgoMaster.io این تفاوت را تعریف میکند، تاخیر مدت زمانی است که طول میکشد تا یک بسته داده یا دستورالعمل از مبدا به مقصد برسد، در حالی که توان عملیاتی، حجم دادههای پردازششده در یک بازه زمانی مشخص است.[3][6]
مکانیزم پایه برای افزایش توان عملیاتی بدون تغییر سرعت کلاک، «خط لوله دستورالعمل» (Instruction Pipelining) است. دپارتمان علوم کامپیوتر دانشگاه مریلند این موضوع را با استفاده از تمثیل خط مونتاژ توضیح میدهد. در یک خط لوله کلاسیک پنجمرحلهای — شامل واکشی (Fetch)، رمزگشایی (Decode)، اجرا (Execute)، دسترسی به حافظه (Memory) و بازنویسی (Write-back) — پردازنده برای واکشی دستورالعمل بعدی منتظر نمیماند تا دستورالعمل قبلی تمام پنج مرحله را طی کند. به محض اینکه دستورالعمل اول از مرحله واکشی به رمزگشایی میرود، واحد واکشی دستورالعمل دوم را میگیرد. در شرایط ایدهآل، یک خط لوله پنجمرحلهای از نظر تئوری میتواند توان عملیاتی را پنج برابر کند و در هر چرخه ساعت یک دستورالعمل را بازنشسته کند، حتی اگر طی کردن کل خط لوله برای هر دستورالعمل همچنان پنج چرخه زمان ببرد.[5]
با این حال، این حداکثر تئوری بهندرت محقق میشود، زیرا دستورالعملها مستقل از هم نیستند. ویلیام استالینگز (William Stallings) در کتاب «سازمان و معماری کامپیوتر»، خطراتی را که این جریان را مختل میکنند، تشریح میکند. اگر دستورالعمل B به نتیجه دستورالعمل A نیاز داشته باشد، دستورالعمل B باید در خط لوله متوقف شود تا مرحله بازنویسی A کامل گردد. این وابستگی دادهای، یک حباب در خط لوله ایجاد کرده و چرخههای ساعت را هدر میدهد. محتواهای تبلیغاتی سازندگان تراشه اغلب خطوط لوله عمیقتر — که گاهی به ۱۵ یا ۲۰ مرحله میرسند — را بهعنوان راهی برای رسیدن به سرعت کلاک بالاتر جار میزنند، اما وقتی یک توقف یا پیشبینی اشتباه انشعاب، پردازنده را مجبور به تخلیه کل خط مونتاژ میکند، همین خطوط لوله عمیقتر با جریمههای تصاعدی و سنگینتری مواجه میشوند.[1]
برای جلوگیری از اینکه این توقفها توان عملیاتی را فلج کنند، پردازندههای مدرن از «اجرای خارج از ترتیب» (Out-of-Order Execution) استفاده میکنند. رسانه The Coding Gopher جزئیات این موضوع را که چگونه این مکانیزم مدل پردازش متوالی و سختگیرانه را میشکند، بررسی کرده است. وقتی پردازنده با یک دستورالعمل متوقفشده مواجه میشود که منتظر دریافت داده از حافظه اصلی است، کل خط لوله را متوقف نمیکند. در عوض، یک واحد ارسال دستورالعمل در کدها به جلو نگاه میکند تا دستورالعملهای بعدی را که تمام عملوندهای مورد نیازشان آماده است، پیدا کند. سپس این دستورالعملهای مستقل را به واحدهای اجرایی در دسترس هدایت میکند و در حالی که دستورالعمل قدیمیتر منتظر است، آنها را پردازش میکند.[2]
برای جلوگیری از اینکه این توقفها توان عملیاتی را فلج کنند، پردازندههای مدرن از «اجرای خارج از ترتیب» (Out-of-Order Execution) استفاده میکنند.
این قابلیت به سربار سیلیکونی عظیمی نیاز دارد. پردازنده باید یک «بافر مرتبسازی مجدد» (Reorder Buffer) را حفظ کند تا اطمینان حاصل شود که حتی اگر دستورالعملها بهطور آشفته و نامنظم اجرا شوند، نتایج آنها دقیقاً به همان ترتیبی که برنامهنویس قصد داشته است، در وضعیت معماری ثبت میشوند. اگر استثنایی رخ دهد، پردازنده میتواند نتایج گمانهزنیشده و خارج از ترتیب را دور بریزد و از وضعیت صحیح کار را از سر بگیرد. The Coding Gopher خاطرنشان میکند که این زمانبندی پویا به پردازنده اجازه میدهد تا واحدهای اجرایی خود را همواره تغذیه کند و حتی زمانی که تاخیر یک دستورالعمل به دلیل از دست رفتن حافظه پنهان (Cache Miss) به شدت بالا میرود، توان عملیاتی را به حداکثر برساند.[2]
طنز ماجرا در این معماریهای پیشرفته این است که آنها اغلب تاخیر یک دستورالعمل واحد را افزایش میدهند. منطق پیچیدهای که برای رمزگشایی دستورالعملها، بررسی وابستگیها، تغییر نام رجیسترها و مرتبسازی مجدد نتایج نیاز است، زمان میبرد. پکا انبرگ (Pekka Enberg) در نوشتههای خود پیرامون برنامهنویسی موازی اشاره میکند که اگرچه عملکرد تکرشتهای از نظر تاریخی به این تکنیکهای موازیسازی در سطح دستورالعمل متکی بوده است، اما این سربار در نهایت به بازدهی نزولی منجر میشود. پردازنده برای اینکه بفهمد چگونه یک دستورالعمل را به موازات سایرین اجرا کند، کار بسیار بیشتری به ازای هر دستورالعمل انجام میدهد.[4]
از آنجا که این منابع مرجع صرفاً بر مدلهای ریاضی جریان دستورالعمل تمرکز دارند، حاوی نقلقولهای مستقیمی از مهندسان سختافزاری که آنها را طراحی میکنند نیستند؛ با این حال، اجماع معماری که آنها مستند میکنند، جهانی است. این جداسازی تاخیر و توان عملیاتی، محدودیتهای استفاده از سرعت کلاک بهعنوان معیار اصلی عملکرد را آشکار میکند. یک پردازنده ۴.۰ گیگاهرتزی با خط لوله باریک و بدون قابلیتهای اجرای خارج از ترتیب، به شدت از یک پردازنده ۳.۰ گیگاهرتزی که دارای معماری سوپراسکالر و خارج از ترتیب عریض است، شکست خواهد خورد. پردازنده دوم ممکن است در نانوثانیههای مطلق زمان بیشتری برای هدایت یک دستورالعمل از مرحله واکشی تا بازنشستگی صرف کند، اما در مقایسه با پردازنده اول که تنها یک دستورالعمل را در هر چرخه بازنشسته میکند، میتواند چهار تا شش دستورالعمل را در هر چرخه ساعت به پایان برساند.[1][6]
محدودیتهای فیزیکی سیلیکون و سرعت نور دیکته میکنند که یک سیگنال الکتریکی با چه سرعتی میتواند از یک گیت منطقی عبور کند. از آنجا که مهندسان نمیتوانند تاخیر را تا بینهایت کاهش دهند، پردازنده را از نو طراحی کردهاند تا این تاخیر را پنهان کنند. با استفاده از خطوط لوله و اجرای خارج از ترتیب، پردازندههای مدرن تضمین میکنند که اگرچه ممکن است تکمیل هر دستورالعمل واحد زمان بیشتری ببرد، اما توان عملیاتی کل سیستم همچنان در حال افزایش است. مرز بعدی در طراحی پردازندهها نه بر یافتن موازیسازی بیشتر در سطح دستورالعمل، بلکه بر گسترش موازیسازی در سطح رشته (Thread) و شتابدهندههای تخصصی متکی است تا تنگناهای بافر مرتبسازی مجدد را بهطور کامل دور بزنند.[4][6]
پرسشهای متداول
آیا سرعت کلاک بالاتر به معنای تاخیر کمتر است؟
لزوماً نه. سرعت کلاک بالاتر به این معناست که پردازنده سریعتر تیک میزند، اما اگر یک خط لوله عمیق برای تکمیل یک دستورالعمل به تیکهای بیشتری نیاز داشته باشد، تاخیر مطلق ممکن است ثابت بماند یا حتی افزایش یابد.
چرا پردازندهها به سادگی همه چیز را به ترتیب اجرا نمیکنند؟
اجرای به ترتیب، کل پردازنده را مجبور میکند در صورتی که یک دستورالعمل باید منتظر داده از حافظه بماند، متوقف شود و میلیاردها چرخه محاسباتی بالقوه در ثانیه را هدر دهد.
آیا اجرای خارج از ترتیب، خروجی یک برنامه را تغییر میدهد؟
خیر. پردازنده از یک بافر مرتبسازی مجدد استفاده میکند تا اطمینان حاصل کند که نتایج نهایی دقیقاً به همان ترتیبی که برنامهنویس نوشته است بازنویسی میشوند و این آشفتگی را برای نرمافزار نامرئی میکند.
منابع
[1]William Stallings / Pearsonمهندسی سختافزارComputer Organization and Architecture (11th Edition) - Instruction Pipelining
مطالعه در William Stallings / Pearson →
[2]تیم سردبیری کوهستانمعماری سیستمهاتحلیل تیم سردبیری کوهستان
مطالعه در تیم سردبیری کوهستان →
[3]AlgoMaster.ioمعماری سیستمهاLatency vs Throughput vs Bandwidth
مطالعه در AlgoMaster.io →
[4]تیم سردبیری کوهستانمعماری سیستمهاتحلیل تیم سردبیری کوهستان
مطالعه در تیم سردبیری کوهستان →
[5]University of Maryland Computer Scienceمهندسی سختافزارIntroduction to Pipelining
مطالعه در University of Maryland Computer Science →
[6]تیم سردبیری کوهستانمعماری سیستمهاتحلیل تیم سردبیری کوهستان
مطالعه در تیم سردبیری کوهستان →
نظرات
بیشتر در متا
مشاهده همه →طرح مقابله با نفوذ
سامانه جدید نظارت بر ارتباطات خارجی؛ چه کسانی باید اطلاعات خود را ثبت کنند؟
3 منبع
هوش جمعی
قضیه پیشبینی تنوع چگونه خطای جمعی را از خطای میانگین فردی متمایز میکند؟
8 منبع
پروتکلهای شبکه
چگونه «پنجره لغزان» و «تاییدیه تجمعی» تحویل امن دادهها در TCP را تضمین میکنند
6 منبع
مواد کوانتومی
کشف ابررسانا بازتعریف شد: چگونه هوش مصنوعی و هندسه کوانتومی مسابقه برای انرژی دمای اتاق را تسریع میکنند
4 منبع
هر زاویه. هر روز.
دریافت متا اخبار همراه با پوشش کامل منابع و تحلیل دیدگاهها، مستقیم در صندوق ورودی شما.





