Dynamic Branch Prediction — branch’ning oldingi bajarilish natijalari va boshqa nazorat oqimi tarixidan foydalanib kelajakdagi yo‘nalish yoki nishonni taxmin qiladigan apparat usuli. Predictor dastur xulqiga runtime moslashadi, shu sabab sikl, faza va korrelyatsiyali shartlarda statik qoidalardan yuqori aniqlik berishi mumkin.
Saturating counter
Keng tarqalgan entry ikki bitli saturating counter saqlaydi: kuchli not-taken, kuchsiz not-taken, kuchsiz taken va kuchli taken. Har haqiqiy taken natija counter’ni taken tomonga, not-taken teskari tomonga siljitadi. Qaror chegarani kesmaguncha bitta noodatiy natija predictionni darhol teskarilamaydi.
Sikl branch’i chiqishda bir marta xato qilgach, keyingi kirishda hali taken deb taxmin qilinadi. Bir bitli predictor esa chiqishda va yangi sikl boshida ikki xatoga moyil. Counter cheklangan qiymatda to‘xtaydi, overflow qilib qarama-qarshi holatga o‘tmaydi.
Lokal va global tarix
Local predictor har branch uchun uning so‘nggi yo‘nalish naqshini saqlaydi. Masalan, har uchinchi chaqiruvda taken bo‘ladigan branch Pattern History Table orqali o‘rganilishi mumkin. Global history so‘nggi bir nechta branch natijasini bitta shift register’da jamlab, turli branchlar orasidagi korrelyatsiyani topadi.
Indeks branch manzili, history va hash kombinatsiyasidan hosil qilinadi. Jadval cheklanganligi sabab turli branch bir entry’ni bo‘lishadi; aliasing biri o‘rgangan counter’ni boshqasi o‘zgartirishiga olib keladi. Hash va taglar salbiy interference’ni kamaytiradi, lekin maydon talab qiladi.
Yangilanish va recovery
Predictor branch resolve bo‘lganda actual natija bilan yangilanadi. Global tarix fetchni davom ettirish uchun spekulyativ ravishda oldin yangilanishi mumkin. Misprediction’da checkpoint’dagi history tiklanib, haqiqiy natija qo‘shiladi. Noto‘g‘ri yo‘l tarixini qoldirish keyingi predictionlarni ham buzadi.
Faqat commit’da yangilash wrong-path ifloslanishini kamaytiradi, ammo o‘rganishni kechiktiradi. Dizayn resolve va retire yangilanishlarini turlicha taqsimlashi mumkin.
Gibrid predictor
Tournament predictor lokal va global komponentni parallel hisoblab, meta-predictor qaysi biri shu branch uchun ishonchli ekanini tanlaydi. Zamonaviy uzun tarixli predictor turli history uzunliklaridagi tagged jadvallarni birlashtiradi. Loop predictor trip count’ni alohida kuzatishi mumkin.
Kattaroq tarix doim yaxshiroq emas: access latency, energiya, warm-up va aliasing xarajati oshadi. Front-end predictionni har takt va bir nechta fetch sloti uchun yetkazishi kerak.
Xavfsizlik
Predictor holati odatda me’moriy emas, lekin bir himoya domeni boshqasining branch’iga ta’sir qilishi mumkin. Hujumchi training orqali speculative yo‘lni boshqaradi. Context switch’da partition, flush, privilege tagging yoki software mitigation tahdid modeliga qarab qo‘llanadi. To‘liq tozalash performance warm-up xarajatiga ega.
Warm-up va fazalar
Program ishga tushganda jadval counterlari initial holatda bo‘ladi va takrorlanuvchi patternni o‘rganish uchun bir necha branch kerak. Qisqa funksiya predictor warm-up tugamasdan yakunlanishi mumkin. Code address o‘zgarsa oldingi entry mapping ham o‘zgaradi.
Uzoq ishlaydigan dastur fazasini almashtirganda eski history vaqtincha zarar qiladi. Adaptive predictor yangi natijalar bilan counter’larni asta o‘zgartiradi; kuchli holat barqaror shovqinga chidamli, lekin faza o‘zgarishiga sekinroq moslashadi. Confidence estimator ishonchsiz predictionda boshqa komponent yoki predikatsiyani tanlash uchun ishlatilishi mumkin.
Bir bitli counter faza almashishiga tezroq moslashadi, ikki bitli counter esa bitta noodatiy natijada yo‘nalishni darhol o‘zgartirmaydi.
Bog‘liq tushunchalar
branch history table, pattern history table, global history, saturating counter, tournament predictor, speculative execution