Fence Instruction — protsessor yoki kompilyatorning ayrim xotira operatsiyalarini belgilangan chegara orqali qayta tartiblashini cheklaydigan mashina buyrug‘i. U ko‘p yadroli sinxronizatsiya, qurilma registrlari va o‘zini o‘zgartiruvchi kodda oldingi ta’sirlar kerakli darajada ko‘rinmasdan keyingi bosqich boshlanmasligini ta’minlaydi.
Qayta tartiblash sababi
Protsessor loadni oldinroq bajarishi, store’ni bufferda ushlab turishi va mustaqil murojaatlarni kesh samaradorligi uchun almashtirishi mumkin. Kompilyator ham bir oqim semantikasiga zarar bermasa buyruqlarni ko‘chiradi. Boshqa yadro esa bu tartibni dastur matnidagidan farqli kuzatishi mumkin.
Fence oldingi load, oldingi store, keyingi load yoki keyingi store orasidagi aniq yo‘nalishlarni tartiblaydi. Ba’zi ISA bitta umumiy barrier, boshqalari load-load, store-store yoki to‘liq variantlarni beradi. Eng kuchli fence barcha oldingi operatsiya fizik xotiraga yozilganini har doim anglatmaydi; u arxitektura belgilagan kuzatuv tartibini beradi.
Acquire va release
Acquire odatda undan keyingi xotira amallarining oldinga o‘tishini to‘sadi. Release undan oldingi amallarning keyin qolishini cheklaydi. Ular alohida fence yoki atomik load/store semantikasiga biriktirilishi mumkin. Producer ma’lumotni yozib, release bilan tayyorlik bayrog‘ini e’lon qiladi; consumer acquire orqali bayroqni ko‘rgach ma’lumotni izchil o‘qiydi.
Fence noto‘g‘ri joylashtirilsa, data race yo‘qolmasligi mumkin. Sinxronizatsiya qiluvchi atomik o‘zgaruvchi va “happens-before” munosabati zarur. Oddiy bayroq atrofidagi tasodifiy barrier til kompilyatori uchun yetarli signal bo‘lmasligi mumkin.
Qurilma va buyruq oqimi
Memory-mapped I/O yozuvlarida qurilma konfiguratsiyasi tugamasdan “start” registriga yozish xavfli. I/O barrier platforma interconnect’ida kerakli tartibni ta’minlaydi. Qurilma hujjati qaysi o‘qish qayta yozuvlarni chiqarishi yoki qaysi to‘siq zarurligini belgilaydi.
Yangi kod baytlari yozilgach data cache tozalash, instruction cache invalidatsiyasi va instruction-synchronization barrier talab qilinishi mumkin. Oddiy data fence dekoder eski buyruq oqimini tashlashiga kafolat bermaydi; arxitekturaning maxsus ko‘rsatmasi qo‘llanadi.
Xarajat va qo‘llanish
Fence store buffer’ni kutishi, spekulyativ loadlarni bekor qilishi va quvur parallelizmini kamaytirishi mumkin. Shu sabab u “ishonch uchun hamma joyga qo‘yiladigan” vosita emas. Tilning mutex, channel va atomic API’lari zarur orderingni portativ tarzda beradi; past darajadagi fence lock-free algoritm yoki drayverda aniq isbot bilan ishlatiladi.
Benchmark fence narxini faqat bitta yadroda emas, turli yadro va socketlar o‘rtasidagi coherence bilan o‘lchashi kerak. Xarajat ish yuki, xotira turi va mikroarxitekturaga bog‘liq.
Compiler barrier
Compiler barrier faqat kompilyatorning xotira operatsiyalarini o‘zidan o‘tkazib ko‘chirishini cheklaydi; u protsessorga alohida fence opcode chiqarmasligi mumkin. Hardware fence esa mikroarxitektura ordering’iga ta’sir qiladi. Past darajadagi kodda ikkalasi birga kerak bo‘lishi mumkin, lekin tilning atomik API’si odatda compiler va hardware talabini bitta portativ abstraksiyada ifodalaydi.
DMA qurilmasi bilan ishlaganda CPU store’lari qurilmaga ko‘rinishi va qurilma yozgan ma’lumot CPU load’idan oldin yakunlanishi kerak. Coherent bo‘lmagan platformada barrier bilan birga cache clean yoki invalidate ham talab qilinadi. Fence iflos cache satrini o‘zi avtomatik chiqaradi deb taxmin qilish mumkin emas.
Fence bajarilgandan keyin ham boshqa yadro qachon rejalashtirilishi yoki qurilma ishni qachon tugatishi kafolatlanmaydi. Ordering faqat kuzatuv tartibini belgilaydi; yakunlanishni kutish uchun status polling, interrupt yoki completion protokoli kerak.
Bog‘liq tushunchalar
memory barrier, acquire semantics, release semantics, memory model, store buffer, atomic instruction