Pipeline Stall — protsessor quvurining bir yoki bir nechta bosqichi keyingi siklda odatdagi oldinga siljishni vaqtincha to‘xtatishi. Stall kerakli operand, kesh javobi yoki bo‘sh ichki resurs kutilganda yuz beradi. U dastur semantikasini saqlash uchun zarur nazorat bo‘lishi mumkin, ammo unumdorlikda bekor ketgan sikllar hosil qiladi.
Stallning tarqalishi
Bir bosqich chiqishidagi yozuvni keyingi bosqich qabul qila olmasa, u o‘z holatini saqlaydi. Oldingi bosqichlar ham yangi ma’lumot uzata olmay, backpressure orqali to‘xtaydi. Ayrim mustaqil yo‘llar ishlashda davom etishi mumkin; masalan, out-of-order yadro bitta load kutilayotganda boshqa bajarish portlarida mustaqil amallarni bajaradi.
In-order quvurda oldingi buyruqning RAW bog‘liqligi butun oqimni ushlashi mumkin. Forwarding natijani erta yetkazib ko‘p stallni bartaraf etadi. Load-use holatida ma’lumot bajarish bosqichiga kech kelgani uchun qo‘shimcha sikl kerak bo‘lishi mumkin. Kesh miss esa stallni xotira iyerarxiyasining javob vaqtigacha uzaytiradi.
Strukturaviy sabablar
Dekoder navbati, reorder buffer yoki store buffer to‘lsa, yangi buyruq dispatch qilinmaydi. Bajarish porti band bo‘lsa tayyor operatsiya issue navbatida qoladi. Bitta portli xotira fetch va data loadni bir vaqtda qabul qilmasa, ulardan biri kutadi. Bu holatlar ma’lumot to‘g‘riligidan emas, resurs sig‘imidan keladi.
Tarmoq buyruqlarida bashorat bo‘lmasa, nishon aniqlanguncha fetch stall qilinishi mumkin. Bashorat ishlatilganda to‘g‘ri yo‘l uchun stall kamayadi, ammo xato taxminda quvur flush qilinadi. Flush stallga o‘xshab foydali ishni kamaytiradi, lekin mexanizmi boshqacha: mavjud noto‘g‘ri yozuvlar bekor qilinadi.
Stall va bubble
Stall bosqichdagi haqiqiy yozuvni joyida ushlab turadi. Pipeline Bubble esa bir bosqich orqali “amal yo‘q” belgisi yurishini anglatadi. Load-use hazardida fetch va decode ushlab turilib, execute yo‘liga bubble kiritilishi mumkin. Shu farq boshqaruv signalini loyihalashda muhim: bitta yozuv ikki marta bajarilmasligi, bo‘sh yozuv esa yon ta’sir qilmasligi kerak.
O‘lchash
Umumiy sikl sonidan stallni chiqarish uchun apparat unumdorlik hisoblagichlari ishlatiladi. Front-end bound, bad speculation, back-end bound va retirement kabi toifalar sababni toraytiradi. “Protsessor 40 foiz kutdi” degan bitta raqam yetarli emas; xotira, port, bog‘liqlik yoki navbat bosimi ekanini ajratish zarur.
Kompilyator instruction scheduling bilan mustaqil amallarni kechikish oralig‘iga qo‘yishi, dasturchi esa ma’lumot joylashuvi va algoritmni yaxshilashi mumkin. Prefetch kesh kutishini yashiradi, ammo noto‘g‘ri manzil va ortiqcha trafik yangi muammo tug‘diradi. Optimallashtirish o‘lchangan asosiy stall sababiga yo‘naltiriladi.
Stallning energiya ta’siri ham bir xil emas. Clock gating ushlab turilgan bosqichning keraksiz almashishini kamaytirishi mumkin, lekin xotira so‘rovi kutilayotgan paytda kesh va interconnect faol qoladi. Uzoq stall davomida boshqa oqimni shu yadroga rejalashtirish yoki bir vaqtning o‘zida ko‘p oqim apparati bo‘sh issue slotlarini to‘ldirishi mumkin. Bu yechim resurs bo‘lishishni oshiradi va keshdagi raqobat sabab boshqa ishning kechikishini ham keltirishi ehtimol.
Rejalashtiruvchi operatsion tizim darajasida uzun xotira stallini to‘g‘ridan-to‘g‘ri har safar ko‘rmaydi, chunki u nanosekund miqyosida yuz beradi. Apparat oqimlari va out-of-order oynasi shu mayda kutishlarni yashiradi; konteksni almashtirish esa ancha qimmat.
Bog‘liq tushunchalar
pipeline bubble, backpressure, cache miss, data hazard, instruction scheduling, performance counter