خطر کنترلی چیست
یک Control Hazard از دستورات شاخه شرطی ناشی میشود. در یک پردازنده پایپلاینشده، دستور بعدی باید بلافاصله، یک سیکل پس از دستور فعلی واکشی شود، اما نتیجه یک شاخه، اینکه گرفته میشود یا نه، تا زمانی که به یک مرحله بعدی پایپلاین برسد مشخص نیست. این یک عدمقطعیت واقعی ایجاد میکند: پردازنده باید کدام دستور را بعد واکشی کند؟
چرا این مسئله را نمیتوان بهسادگی نادیده گرفت
برخلاف یک خطر داده، که در آن مقدار مورد نیاز صرفاً هنوز آماده نیست، یک خطر کنترلی شامل ندانستن اینکه کدام دستور اصلاً درست است برای واکشی است. واکشی کورکورانه و حدس نادرست یعنی پردازنده کار بیفایدهای روی دستوراتی انجام داده که هرگز نباید اجرا میشدند.
استراتژی اول: فرض عدم گرفته شدن شاخه
سادهترین استراتژی این است که همیشه فرض شود یک شاخه گرفته نخواهد شد و واکشی دستورات بهصورت پیدرپی ادامه یابد. اگر این فرض درست باشد، هیچ زمانی از دست نمیرود. اما اگر شاخه واقعاً گرفته شود، دستوراتی که بر اساس فرض نادرست واکشی شدهاند باید کنار گذاشته شوند، عملی به نام Pipeline Flush.
دستور شاخه: IF ID EX MEM WB
دستور بعدی (حدس): IF ID [اگر شاخه گرفته شد کنار گذاشته میشود]
دستور مقصد درست: IF [دیر واکشی شده، پس از flush]استراتژی دوم: پیشبینی جهت شاخه
طرحهای پیچیدهتر از Branch Prediction استفاده میکنند، جایی که سختافزار رفتار گذشته یک شاخه را دنبال میکند و نتیجه محتمل آن را بر اساس تاریخچه، بهجای همیشه فرض کردن همان جهت ثابت، حدس میزند. یک Dynamic Predictor میتواند یاد بگیرد یک شاخه خاص، مانند یکی در انتهای یک حلقه، معمولاً گرفته میشود، و بر همین اساس پیشبینی کند، که دقت را بهطور قابلتوجهی فراتر از فرض ثابت همیشه-گرفته-نشده بهبود میبخشد.
حل شاخه در اسرع وقت
راه دیگر برای کاهش هزینه خطرهای کنترلی، صرفاً محاسبه نتیجه شاخه زودتر در پایپلاین است، بهجای انتظار تا یک مرحله بعدی. جابهجایی منطق مقایسه مورد نیاز برای حل یک شاخه به یک مرحله زودتر، تعداد دستورات نادرست واکشیشدهای که باید هنگام رخ دادن یک پیشبینی اشتباه کنار گذاشته شوند را کوتاهتر میکند، و مستقیماً جریمه کارایی میانگین را کاهش میدهد.
هزینه یک پیشبینی اشتباه
هر وقت فرض یا پیشبینی نادرست از آب دربیاید، هر دستوری که بر اساس آن حدس نادرست واکشی شده باید از پایپلاین تخلیه شود، و دستور درست باید از ابتدا واکشی شود. تعداد سیکلهای هدررفته در این وضعیت Branch Penalty نامیده میشود، و مستقیماً با تعداد مراحل پایپلاینی که پیش از مشخص شدن نتیجه شاخه رخ میدهند رشد میکند.
چرا این موضوع برای کارایی کلی اهمیت دارد
برنامههایی با شاخههای مکرر و سختبرایپیشبینی، بیشتر از آنهایی با شاخهزنی قابلپیشبینی یا کمتکرار از خطرهای کنترلی رنج میبرند. این یکی از دلایلی است که کامپایلرها و طراحان پردازنده بهشدت روی پیشبینی دقیق شاخه سرمایهگذاری میکنند، چون حتی یک بهبود متوسط در دقت پیشبینی میتواند بهره قابلتوجهی در سرعت اجرای کلی برنامه تولید کند.