Instruction Scheduling — machine instructionlarni data dependence va target protsessor resurslarini hisobga olgan holda semantikani buzmasdan qayta tartiblash bosqichi. Maqsad pipeline stalllarni kamaytirish, latencyni yashirish va functional unitlardan samarali foydalanishdir.
Bog‘lanish grafigi
Scheduler instructionlarni tugun, true, anti va output dependence’larni edge sifatida ko‘rsatadigan graph quradi. Edge latency consumer qachon ishga tushishi mumkinligini belgilaydi. Ready listdagi barcha predecessorlar bajarilgan instructionlar priority bo‘yicha tanlanadi. Register renaming ayrim soxta dependence’larni olib tashlashi mumkin.
Scheduling ko‘lami
Local scheduling bitta basic block ichida ishlaydi; global scheduling instructionni blocklar orasida ko‘chiradi va control dependence, exception hamda speculative safety talablarini tekshiradi. Trace scheduling tez-tez bajariladigan yo‘lni bir butun ko‘rib, kam uchraydigan side exitlar uchun compensation code yaratishi mumkin.
Pipeline misoli
Masalan, uzoq latencyli load’dan keyin uning natijasiga bog‘liq addni darhol qo‘yish stall yaratadi. Oraga mustaqil integer amallar joylashtirilsa load yakunlanguncha foydali ish bajariladi. Biroq load exception chiqarishi mumkin bo‘lsa, uni branchdan oldinga ko‘chirish tilning observable fault tartibini o‘zgartirmasligi kerak.
Register bosimi
Pre-register-allocation scheduling ko‘proq virtual register erkinligiga ega, ammo live range’larni uzaytirib register pressure va spillni oshirishi mumkin. Post-allocation scheduling physical register hamda real hazardlarni biladi, lekin tartib erkinligi kamroq. Ko‘p backend ikkala bosqichni turli maqsadda ishlatadi.
Target modeli
Out-of-order CPU runtime scheduling qilsa ham compiler tartibi decode width, port pressure, code size va in-order arxitekturalar uchun muhim. VLIW targetda compiler parallel issue slotlarini bevosita to‘ldiradi. Target itinerary yoki scheduling model instruction latency, throughput va resource occupancyni tavsiflaydi.
Tekshirish
Tekshiruv scheduled graphdagi har dependence edge producer consumerdan oldin qolganini, branch target va side effect tartibi saqlanganini nazorat qiladi. Cycle-accurate simulator yoki hardware counter stall va throughputni o‘lchaydi. Instruction soni o‘zgarmasa ham bajarilish sikli yaxshilanishi mumkin.
Scheduling modeli target tavsifining versiyasi bilan bog‘lanadi; latency jadvali yangilanganda eski benchmark xulosasi avtomatik universal deb olinmaydi. Compiler remark tanlangan priority, critical path va register-pressure taxminini chiqaradi. Shu ma’lumot correctness tekshiruvidan alohida performance audit qilishga imkon beradi.
+## Amaliy boshqaruv
Instruction Scheduling implementatsiyasida dependence DAG, critical path va execution portlar alohida ma’lumot modeli sifatida yuritiladi. load latency, issue width va register pressure kabi parametrlar global taxmin sifatida yashirilmaydi, balki artefakt versiyasi va target bilan bog‘lanadi. Shu sabab incremental build yoki runtime qayta yuklashda eskirgan natija ishlatilmaydi. Har bir qaror uchun manba, qo‘llangan qoida va hosil bo‘lgan natija debug rejimida qayta ko‘rish mumkin bo‘lgan shaklda saqlanadi.
Muhim xato sinfi — memory barrier yoki precise exceptiondan oshib ketish. Bunday holatda vosita optimistik taxmin bilan davom etmaydi: zarur bo‘lsa sekinroq, lekin xavfsiz yo‘l tanlanadi yoki aniq diagnostika bilan jarayon to‘xtatiladi. Xatoni qayta ishlab bo‘ladigan qilish uchun target, optionlar, kirish identifikatori va tegishli metadata qayd etiladi. Foydalanuvchi ma’lumoti xom shaklda loglanmaydi; hash, build-id yoki cheklangan kontekst yetarli bo‘lgan joyda shular ishlatiladi.
Sifat nazorati scheduled instruction oqimini simulator va hardware counter bilan solishtirish orqali bajariladi. Testlar normal misol bilan cheklanmay, bo‘sh kirish, minimal va maksimal o‘lcham, mos kelmaydigan versiya, yo‘qolgan komponent hamda parallel holatlarni qamraydi. Natijaning to‘g‘riligi performance o‘lchovidan alohida baholanadi. Keyin vaqt, xotira, artefakt hajmi yoki runtime kechikishi kabi mavzuga mos metrikalar baseline bilan solishtiriladi. Regressiya topilsa, minimal takrorlanuvchi holat saqlanib, keyingi release uchun doimiy testga aylantiriladi.
Bog‘liq tushunchalar
data dependence, machine instruction, pipeline hazard, list scheduling, register allocation, compiler backend