Bosh sahifa Wiki Data Hazard

Data Hazard

Data Hazard — quvurdagi buyruqlar bir xil operandga bog‘liq bo‘lgani uchun ularni sodda vaqt tartibida bajarish xavfli bo‘ladigan holat. Buyruq kerakli qiymat hali ishlab chiqilmasdan o‘qishi yoki yozuvlar noto‘g‘ri tartibda ko‘rinishi mumkin. Hazardni boshqarish dastur belgilagan ma’lumot oqimini saqlab, imkon qadar parallel ishlashga xizmat qiladi.

Bog‘liqlik turlari

Read After Write (RAW) haqiqiy bog‘liqlikdir: keyingi buyruq oldingisi yozadigan qiymatni o‘qiydi. Write After Read (WAR) keyingi yozuv oldingi o‘qishdan avval sodir bo‘lish xavfini bildiradi. Write After Write (WAW) ikki yozuv teskari tugab, yakuniy qiymat noto‘g‘ri bo‘lishi mumkinligini anglatadi.

Oddiy in-order quvurda o‘qish va yozish qat’iy bosqichlarda sodir bo‘lsa, asosan RAW muhim bo‘ladi. Out-of-order bajarishda WAR va WAW ham ichki rejalashtirishni cheklashi mumkin. Register renaming har bir mantiqiy yozuvga yangi fizik registr berib, WAR va WAW kabi nom bog‘liqliklarini yo‘qotadi; RAW esa haqiqiy ma’lumot oqimi bo‘lgani uchun saqlanadi.

Forwarding va stall

Quyidagi ketma-ketlikda ikkinchi amal birinchining natijasiga muhtoj:

ADD r1, r2, r3
SUB r4, r1, r5

Natija bajarish blokidan tayyor bo‘lishi bilan SUB operand kirishiga uzatilsa, registr fayliga yozishni kutish shart emas. Bu bypass yoki forwarding yo‘li deyiladi. Agar birinchi buyruq load bo‘lib, ma’lumot faqat keyingi bosqich oxirida kelsa, ikkinchi buyruq bir sikl yoki kesh xatosida ancha uzoq kutadi.

Hazard detection mantiqi faqat registr raqamlarini emas, operand haqiqatan o‘qiladimi va natija qachon tayyor bo‘lishini bilishi kerak. Immediate maydon ichidagi bitlar registr raqamiga o‘xshasa ham bog‘liqlik emas. Noto‘g‘ri musbat aniqlash ortiqcha stall, noto‘g‘ri manfiy aniqlash esa hisob xatosiga olib keladi.

Xotira bog‘liqligi

Load va store manzillari hisoblanmaguncha ularning bir xil joyga tegishli ekanini bilish qiyin. Eski store bilan bir manzilga load kelganda qiymat store buffer’dan uzatilishi mumkin. Protsessor manzillar mustaqil deb taxmin qilib loadni erta bajarsa va keyin to‘qnashuv aniqlansa, load hamda undan qaram ishlar qayta bajariladi.

Alias tahlili kompilyatorga xotira murojaatlarini qayta tartiblash mumkinligini aniqlashda yordam beradi. restrict kabi til vositalari yoki aniq obyekt chegaralari soxta ehtimoliy bog‘liqlikni kamaytiradi. Biroq kompilyator tilning xotira modeli va ko‘p oqimli sinxronizatsiya qoidalarini buzmasligi kerak.

Unumdorlik mazmuni

Uzoq RAW zanjirida ko‘proq bajarish birligi yordam bermaydi, chunki har amal oldingi natijani kutadi. Mustaqil akkumulyatorlar, vektorlashtirish yoki algoritmni qayta tuzish parallelizm yaratishi mumkin. Profil vositalari faqat stall sonini emas, qaysi operand zanjiri kritik yo‘l ekanini ko‘rsatganda tahlil samarali bo‘ladi.

Bayroq registri ham yashirin bog‘liqlik manbai bo‘lishi mumkin. Bir arifmetik buyruq condition code’larni yozib, keyingi branch ularni o‘qiydi; assemblerda umumiy registr nomi ko‘rinmasa ham RAW mavjud. Ayrim ISA bayroq yozmaydigan variant yoki natijani oddiy registrga chiqaradigan compare beradi. Kompilyator shu shakllarni tanlab mustaqil hisoblarni ajratadi. Mikroarxitektura esa bayroq bitlarini ham renaming qilib, keraksiz WAW va WAR cheklovlarini kamaytirishi mumkin.

Vektor ko‘rsatmasida qisman registr yozuvi alohida murakkablik yaratadi. Keyingi amal eski va yangi elementlarning aralashmasini talab qilishi mumkin; maska va merge semantikasi qaysi qismlar haqiqiy ishlab chiqaruvchiga bog‘liqligini belgilaydi.

Bog‘liq tushunchalar

RAW dependency, WAR dependency, WAW dependency, register renaming, forwarding, memory aliasing