خطرهای کنترلی: مدیریت شاخه‌ها در یک پردازنده پایپ‌لاین‌شده

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

خطرهای کنترلیپیش‌بینی شاخه,تخلیه پایپ‌لاین

~3 دقیقه مطالعه · آخرین به‌روزرسانی ۱۵ شهریور ۱۴۰۵

خطر کنترلی چیست

یک Control Hazard از دستورات شاخه شرطی ناشی می‌شود. در یک پردازنده پایپ‌لاین‌شده، دستور بعدی باید بلافاصله، یک سیکل پس از دستور فعلی واکشی شود، اما نتیجه یک شاخه، اینکه گرفته می‌شود یا نه، تا زمانی که به یک مرحله بعدی پایپ‌لاین برسد مشخص نیست. این یک عدم‌قطعیت واقعی ایجاد می‌کند: پردازنده باید کدام دستور را بعد واکشی کند؟

چرا این مسئله را نمی‌توان به‌سادگی نادیده گرفت

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

استراتژی اول: فرض عدم گرفته شدن شاخه

ساده‌ترین استراتژی این است که همیشه فرض شود یک شاخه گرفته نخواهد شد و واکشی دستورات به‌صورت پی‌درپی ادامه یابد. اگر این فرض درست باشد، هیچ زمانی از دست نمی‌رود. اما اگر شاخه واقعاً گرفته شود، دستوراتی که بر اساس فرض نادرست واکشی شده‌اند باید کنار گذاشته شوند، عملی به نام Pipeline Flush.

دستور شاخه:      IF ID EX  MEM WB
دستور بعدی (حدس): IF ID [اگر شاخه گرفته شد کنار گذاشته می‌شود]
دستور مقصد درست:           IF  [دیر واکشی شده، پس از flush]

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

طرح‌های پیچیده‌تر از Branch Prediction استفاده می‌کنند، جایی که سخت‌افزار رفتار گذشته یک شاخه را دنبال می‌کند و نتیجه محتمل آن را بر اساس تاریخچه، به‌جای همیشه فرض کردن همان جهت ثابت، حدس می‌زند. یک Dynamic Predictor می‌تواند یاد بگیرد یک شاخه خاص، مانند یکی در انتهای یک حلقه، معمولاً گرفته می‌شود، و بر همین اساس پیش‌بینی کند، که دقت را به‌طور قابل‌توجهی فراتر از فرض ثابت همیشه-گرفته-نشده بهبود می‌بخشد.

حل شاخه در اسرع وقت

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

هزینه یک پیش‌بینی اشتباه

هر وقت فرض یا پیش‌بینی نادرست از آب دربیاید، هر دستوری که بر اساس آن حدس نادرست واکشی شده باید از پایپ‌لاین تخلیه شود، و دستور درست باید از ابتدا واکشی شود. تعداد سیکل‌های هدررفته در این وضعیت Branch Penalty نامیده می‌شود، و مستقیماً با تعداد مراحل پایپ‌لاینی که پیش از مشخص شدن نتیجه شاخه رخ می‌دهند رشد می‌کند.

چرا این موضوع برای کارایی کلی اهمیت دارد

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

نوشته و پژوهش‌شده توسط دکتر شاهین صیامی

مقالات مرتبط

اصول کش: حافظه کوچک و سریع چگونه پیش‌بینی می‌کند بعداً چه چیزی نیاز است

یک کش فقط به این دلیل کار می‌کند که برنامه‌ها تمایل دارند داده یکسان یا نزدیک به هم را به‌طور تکراری دسترسی کنند نه به‌صورت تصادفی. این مقاله اصل محلیت که کش را مؤثر می‌کند را توضیح می‌دهد، یک کش مستقیم‌نگاشت‌شده چگونه داده را با استفاده از یک آدرس مکان‌یابی می‌کند، و در یک hit کش در مقابل یک miss کش چه اتفاقی می‌افتد.

ادامه

سلسله‌مراتب حافظه: چرا کامپیوترها از چند نوع حافظه استفاده می‌کنند

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

ادامه

تصورات غلط رایج درباره طراحی پردازنده و تصویر کلی فصل چهارم

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

ادامه

پایپ‌لاین‌های دنیای واقعی: مقایسه ARM و Intel، و تسریع ضرب ماتریس

مفاهیم نظری پایپ‌لاین در پردازنده‌های تجاری واقعی شکل مشخصی به خود می‌گیرند، که بسته به اهداف طراحی‌شان از نظر عمق پایپ‌لاین و عرض صدور به‌طور گسترده متفاوت‌اند. این مقاله مقایسه می‌کند ARM Cortex-A53 و Intel Core i7 چگونه پایپ‌لاینینگ را متفاوت برای کارایی توان در مقابل کارایی خام پیاده‌سازی می‌کنند، سپس نشان می‌دهد موازی‌سازی سطح دستور چگونه ضرب ماتریس را در عمل تسریع می‌کند.

ادامه

موازی‌سموازی‌سازی سطح دستور: اجرای بیش از یک دستور به‌طور هم‌زمانازی سطح دستور: اجرای بیش از یک دستور به‌طور هم‌زمان

موازی‌سازی سطح دستور: اجرای بیش از یک دستور به‌طور هم‌زمان

ادامه

یک پردازنده پایپ‌لاین‌شده چگونه استثناها را مدیریت می‌کند

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

ادامه