Write-After-Write Hazard — bir xil registr yoki xotira manziliga yozadigan ikki buyruq bajarilish tartibini almashtirib, yakuniy holatda eski buyruq natijasi qolib ketishi xavfi. WAW output dependency deb ataladi. Dastur tartibida keyingi yozuv yakuniy qiymat bo‘lishi kerak.
Registr misoli
DIV r1, r2, r3
ADD r1, r4, r5
DIV uzoq, ADD qisqa davom etishi mumkin. Ikkalasi bitta fizik r1ga darhol yozsa, ADD avval yozib, DIV keyin uning ustidan eski dastur-tartib natijasini yozadi. Yakunda r1 ADD qiymati bo‘lishi kerak edi, lekin xato DIV qiymati qoladi.
In-order write-back barcha natijani dastur tartibida yozib WAW’ni oldini oladi, ammo tez tayyor amal uzoq buyruqni kutadi. Out-of-order yadro Register Renaming orqali har yozuvga boshqa physical register ajratadi. Keyingi o‘quvchilar eng yangi tegni oladi, commit esa ADD versiyasini me’moriy r1ga bog‘laydi.
Commit va recovery
Natijalar turli vaqtda tayyor bo‘lsa ham Reorder Buffer dastur tartibini saqlaydi. Oldingi DIV exception bersa, undan keyingi ADD physical natijasi mavjud bo‘lishi mumkin, ammo commit qilinmaydi va bekor qilinadi. Aniq istisno uchun me’moriy xarita DIVgacha bo‘lgan holatga mos qoladi.
Eski physical register faqat uning arxitektura versiyasi commit orqali almashtirilgach va hech bir iste’molchiga kerak bo‘lmagach ozod qilinadi. Free list xatosi WAW natijasidan ham jiddiy, boshqa mustaqil qiymatning ustidan yozishga olib keladi.
Xotira WAW
Bir manzilga ikki store tashqi kuzatuvchilarga memory model ruxsat etgan tartibda ko‘rinishi kerak. Bitta oqimdagi oddiy store’lar odatda dastur tartibidagi yakuniy qiymatni beradi. Store Queue ularni yosh bo‘yicha saqlaydi, write buffer birlashtirganda eng yangi tegishli baytni qoldiradi.
Qisman ustma-ust yozuvlarda har baytning eng yangi store’i farq qilishi mumkin. Combining mantiqi kenglik va byte mask’ni hisobga oladi. Memory-mapped I/O yozuvlarini birlashtirish mumkin bo‘lmasligi mumkin, chunki har biri alohida command yon ta’siriga ega.
Compiler va arxitektura
Compiler dead store elimination bilan keyingi yozuv butun qiymatni almashtirsa va orada o‘qish yoki yon ta’sir bo‘lmasa birinchisini olib tashlaydi. volatile, atomic va qurilma xotirasida bu shartlar boshqacha. WAW tahlili faqat registr nomiga emas, obyekt va bayt diapazoniga qaraydi.
WAW haqiqiy qiymat oqimi emas; keyingi buyruq oldingi natijani o‘qimaydi. Shu sabab registr renaming parallel bajarishni ochadi. Biroq ikkala yozuvning exception va commit tartibi baribir saqlanadi.
Partial write
Ikki buyruq registrning turli qismlarini yozsa, ular har doim mustaqil emas. ISA yuqori bitlarni saqlasa, har yangi partial write eski to‘liq qiymat bilan merge qilinadi. Birinchi yozuvning boshqa qismi keyingi yakuniy registrda qolishi kerak bo‘lsa, output dependency bilan birga haqiqiy data dependency paydo bo‘ladi.
Zeroing semantics to‘liq yangi qiymat yaratib, merge’ni olib tashlaydi. Compiler imkon bo‘lsa full-width write tanlaydi. Vektor maskalangan merge ham shu muammoga o‘xshaydi: faol lane yangi, nofaol lane eski destination’dan keladi. Rename tizimi har lane yoki butun registr bo‘yicha dependency’ni to‘g‘ri ifodalashi kerak.
Bog‘liq tushunchalar
output dependency, register renaming, reorder buffer, store queue, dead store elimination, physical register