Register Dependency — bir buyruqning registr operand qiymati boshqa buyruqning registrga yozgan yoki yozishi kerak bo‘lgan natijasiga bog‘liq bo‘lishi. U buyruqlar qaysi tartibda xavfsiz bajarilishi va qaysi darajada parallel ishga tushishi mumkinligini belgilaydi. Dependency turi haqiqiy ma’lumot oqimi yoki faqat registr nomining qayta ishlatilishidan kelishi mumkin.
Haqiqiy bog‘liqlik
Read-After-Write holatida keyingi buyruq oldingi ishlab chiqaruvchi natijasini o‘qiydi:
ADD r1, r2, r3
MUL r4, r1, r5
MUL ADD natijasi tayyor bo‘lmaguncha to‘g‘ri bajarila olmaydi. Forwarding qiymatni register file’ga yozishni kutmasdan uzatadi, ammo hisobning o‘zi tugashi shart. Bu dependency algoritmning ma’lumot oqimi bo‘lgani sabab renaming bilan yo‘qolmaydi.
Nom bog‘liqliklari
Write-After-Read’da yangi yozuv eski o‘quvchi qiymatni olishidan oldin sodir bo‘lishi xavfi bor. Write-After-Write’da ikki yozuv teskari tugasa yakuniy registr noto‘g‘ri versiyani oladi. Ular qiymat uzatish emas, bir arxitektura nomini qayta ishlatishdan keladi.
Physical Register renaming har yangi yozuvga boshqa katak berib, WAR va WAW’ni bartaraf etadi. Eski o‘quvchi eski tegni, yangi yozuv va undan keyingi o‘quvchilar yangi tegni ishlatadi. Commit dastur tartibidagi arxitektura nomini yangilaydi.
Yashirin registrlar
Condition code, predicate, link register va maxsus accumulator ham dependency yaratishi mumkin. Assembler satrida ular ochiq operand sifatida ko‘rinmasa ham opcode bayroqni yozishi yoki o‘qishi mumkin. Mikroarxitektura status bitlarini rename qilmasa, mustaqil arifmetik buyruqlar bitta yashirin registr ustida ketma-ketlashadi.
Partial register yozuvi eski yuqori bitlarni saqlasa, natija eski to‘liq registrga qisman bog‘liq bo‘ladi. Zero-extending yozuv esa to‘liq yangi qiymat yaratib dependency’ni uzishi mumkin. ISAning kenglik semantikasi bu farqni belgilaydi.
Aniqlash va rejalashtirish
Compiler dependency graph tugunlarda buyruq, qirralarda operand oqimini ifodalaydi. Instruction Scheduling mustaqil ishlarni uzoq latency oralig‘iga joylaydi. Apparata esa rename map va Issue Queue teglari dinamik bog‘liqlikni kuzatadi.
Uzoq dependency chain ko‘p execution unit mavjud bo‘lsa ham latency bilan cheklanadi. Bir nechta accumulator, loop unrolling yoki algoritmni qayta tuzish mustaqil zanjirlar yaratishi mumkin. Biroq floating-point reduction tartibi o‘zgarib, bitga teng natija buzilishi ehtimol.
Register dependency xotira dependency’sidan osonroq aniqlanadi, chunki registr indekslari decode vaqtida ma’lum. Load va store manzillari esa execute’gacha noma’lum bo‘lishi mumkin.
Dependency balandligi
Grafikdagi critical path kechikishlari yig‘indisi ideal cheksiz execution unitlarda ham minimal bajarish vaqtini belgilaydi. Mustaqil tugunlar parallel, bir zanjirdagi tugunlar ketma-ketdir. Compiler scheduling modeli har opcode latency’sini hisobga oladi, lekin cache miss kabi dinamik kechikishlarni aniq bilmaydi.
Software pipelining turli sikl iteratsiyalaridagi mustaqil amallarni ustma-ust bajaradi. Loop-carried dependency masofasi initiation interval’ni cheklaydi. Masalan, har iteratsiya bitta accumulator’ga yozsa ketma-ket zanjir hosil bo‘ladi; bir nechta accumulator ishlatish dependency masofasini oshiradi, yakunda ular birlashtiriladi.
Dependency tahlili subregister yozuvlarini ham ajratadi. Past baytga yozish yuqori bitlarni saqlaydigan ISA’da keyingi to‘liq registr o‘qishi eski va yangi qismlarga bog‘liq bo‘ladi. To‘liq kenglikdagi zeroing instruction esa oldingi qiymat bilan aloqani uzib, schedulerga mustaqil zanjir beradi.
Bog‘liq tushunchalar
data dependency, RAW hazard, WAR hazard, WAW hazard, register renaming, dependency graph