اولش که پیداش کردم فک کردم چرته و حقیقت نداره ولی بعد از تحقیقات متوجه شدم که کاملا واقعیه 🤯
قضیه از این قراره که CPU قبل از اینکه بفهمه به چه مسیری باید بره شروع به اجرای اون کرده باشه!
کد زیر رو در نظر بگیرید:
if(x < 10)
{
A();
}
else
{
B();
}
پردازنده نمیخاد منتظر بمونه که بفهمه باید کدوم مسیر رو بره. چون اینجا pipeline خالی میمونه و کلی سایکل بیکار میمونه.
پس Branch predictor حدس میزنه برای مثال احتمالا سرط True میشه. و Cpu شروع میکنه دستورات A رو به صورت especulative execution (جلو جلو اجرا کردن) اجرا کردن در صورتی که مطمئن نیست مسیری که انتخاب کرده درست هست یا نه!
حالا نتیجه مشخص میشه که ایا شرط True بوده یا نه. اگر درست بود که نتیجه کار حفظ میشه اگرم نبود CPU خروجی تولید شده رو دور میریزه (اصطلاحا pipeline flush میکنه) و مسیر درست رو اجرا میکنه!
شاید بپرسی چرا این کار رو انجام میده؟
چون CPU های مدرن خیلی pipeline های عمیقی دارن. اگر هر بار بخوان برای فهمیدن نتیجه یه برنچ صبر کنن pipeline خالی میمونه و کلی cycle هدر میره.
یکی از دلایلی که پردازنده های امروزی انقد سریعن و روز به روز هم سریعتر میشن همین روش های عجیب غریبه😭😂
(Branch predictor یکی از این روش هاست)
البته این غلط حدس زدنه هم یه ایرادی داره که توی پست بعدی میگمش.
یادم باشه درباره pipeline و cycle هم بنویسم!