Ko'rsatmalarni rejalashtirish - Instruction scheduling

Yilda Kompyuter fanlari, ko'rsatmalarni rejalashtirish a kompilyatorni optimallashtirish takomillashtirish uchun ishlatiladi ko'rsatma darajasidagi parallellik, bu bilan ishlaydigan mashinalarda ishlashni yaxshilaydi ko'rsatma quvurlari. Oddiyroq qilib aytganda, kodning ma'nosini o'zgartirmasdan quyidagilarni bajarishga harakat qiladi:

  • Qoching quvur liniyasi rastalari ko'rsatmalar tartibini qayta tartibga solish orqali.[1]
  • Noqonuniy yoki semantik jihatdan noaniq operatsiyalarni bajarishdan saqlaning (odatda nozik ko'rsatmalar quvur liniyasi vaqtini belgilash muammolari yoki blokirovka qilinmagan manbalar bilan bog'liq).

Quvurlarning to'xtash joylari konstruktiv xavf (protsessor resurslari chegarasi), ma'lumotlar xavfi (boshqa yo'riqnomaga kerak bo'lgan bitta ko'rsatmaning chiqishi) va boshqarish xavfi (dallanish) sabab bo'lishi mumkin.

Ma'lumotlar uchun xavf

Ko'rsatmalarni rejalashtirish odatda bitta bittada amalga oshiriladi asosiy blok. Blok ko'rsatmalarini ma'lum bir tarzda qayta tuzish ushbu blokning xatti-harakatlarini saqlab qoladimi yoki yo'qligini aniqlash uchun biz a tushunchasiga muhtojmiz ma'lumotlarga bog'liqlik. Bog'liqlikning uch turi mavjud, ular ham uchtaga to'g'ri keladi ma'lumotlar xavfi:

  1. Yozgandan keyin o'qing (RAW yoki "True"): 1-ko'rsatma keyinchalik 2-ko'rsatma tomonidan ishlatiladigan qiymatni yozadi. 1-ko'rsatma birinchi o'rinda turishi kerak, yoki 2-ko'rsatma yangi o'rniga eski qiymatni o'qiydi.
  2. O'qishdan keyin yozing (WAR yoki "Anti"): 1-ko'rsatma keyinchalik 2-ko'rsatma bilan yozilgan joyni o'qiydi, 1-yo'riq birinchi o'rinda turishi kerak, aks holda u eski o'rniga yangi qiymatni o'qiydi.
  3. Yozishdan keyin yozing (WAW yoki "Chiqish"): Ikkala ko'rsatma ikkalasi bir xil joyni yozadi. Ular asl tartibda bo'lishi kerak.

Texnik jihatdan to'rtinchi turi mavjud, O'qishdan keyin o'qish (RAR yoki "Kirish"): Ikkala yo'riqnoma ham bir xil joyni o'qiydi. Kiritishga bog'liqlik ikkita bayonotning bajarilish tartibini cheklamaydi, ammo massiv elementlarini skaler bilan almashtirishda foydalidir.

Uch turdagi bog'liqliklarni hurmat qilishimizga ishonch hosil qilish uchun biz qaramlik grafigini tuzamiz, bu a yo'naltirilgan grafik bu erda har bir tepalik ko'rsatma va I dan chekka mavjud1 menga2 agar men1 mendan oldin kelishi kerak2 qaramlik tufayli. Agar ko'chadan o'tkaziladigan bog'liqliklar qoldirilsa, bog'liqlik grafigi a yo'naltirilgan asiklik grafik. Keyin, har qanday topologik tartib ushbu grafikning to'g'ri qo'llanma jadvali. Grafika qirralari odatda kechikish qaramlik. Bu quvur liniyasi to'xtab qolmasdan maqsadli ko'rsatmani bajarishdan oldin o'tishi kerak bo'lgan soat tsikllari soni.

Algoritmlar

Topologik tartibni topishning eng oddiy algoritmi tez-tez ishlatiladi va ma'lum ro'yxatni rejalashtirish. Kontseptual ravishda u qaramlik grafigi manbasini qayta-qayta tanlaydi, uni amaldagi ko'rsatmalar jadvaliga qo'shadi va grafikadan olib tashlaydi. Bu boshqa tepaliklarning manba bo'lishiga olib kelishi mumkin, keyinchalik rejalashtirish uchun ham ko'rib chiqiladi. Agar grafik bo'sh bo'lsa, algoritm tugaydi.

Yaxshi jadvalga kelish uchun savdo rastalarining oldini olish kerak. Bu rejalashtirilgan keyingi ko'rsatmani tanlash bilan belgilanadi. Bir qator evristika keng tarqalgan bo'lib qo'llaniladi:

  • Oldindan rejalashtirilgan ko'rsatmalar tomonidan ishlatiladigan protsessor resurslari qayd etiladi. Agar nomzod egallab olingan resursdan foydalansa, uning ustuvorligi pasayadi.
  • Agar nomzod avvalgilariga tegishli kechikishdan ko'ra yaqinroq rejalashtirilgan bo'lsa, uning ustuvorligi pasayadi.
  • Agar nomzod grafikaning muhim yo'lida yotsa, uning ustuvorligi ko'tariladi. Ushbu evristik, aks holda mahalliy qaror qabul qilish jarayonida qandaydir istiqbolni taqdim etadi.
  • Agar nomzodni tanlash ko'plab yangi manbalarni yaratadigan bo'lsa, uning ustuvorligi ko'tariladi. Ushbu evristik rejalashtiruvchi uchun ko'proq erkinlik yaratishga intiladi.

Bosqich tartibi

Ko'rsatmalarni rejalashtirish oldin yoki keyin amalga oshirilishi mumkin ro'yxatdan o'tkazishni taqsimlash yoki undan oldin ham, undan keyin ham. Ro'yxatdan o'tish taqsimotidan oldin buni amalga oshirishning afzalligi shundaki, bu maksimal parallellikka olib keladi. Ro'yxatdan o'tish taqsimotidan oldin bajarilishining zararli tomoni shundaki, bu reestrni taqsimlovchiga bir qator registrlardan foydalanish imkoniyatiga ega bo'lishiga olib kelishi mumkin. Bu to'kish / to'ldirish kodini kiritilishiga olib keladi, bu esa ko'rib chiqilayotgan kod bo'limining ishlashini pasaytiradi.

Agar rejalashtirilgan me'morchilikda potentsial noqonuniy kombinatsiyalarga ega bo'lgan ko'rsatmalar ketma-ketligi bo'lsa (ko'rsatmalar blokirovkalari etishmasligi sababli), ko'rsatmalar registr ajratilgandan keyin rejalashtirilgan bo'lishi kerak. Ushbu ikkinchi rejalashtirish pasporti shuningdek to'kish / to'ldirish kodini joylashtirishni yaxshilaydi.

Agar rejalashtirish faqat reestrni ajratgandan so'ng amalga oshirilsa, u holda reestrni taqsimlash bilan kiritilgan noto'g'ri bog'liqliklar bo'ladi, bu esa rejalashtiruvchi tomonidan ko'rsatmalarning harakatlanish hajmini cheklaydi.

Turlari

Ko'rsatmalarni rejalashtirishning bir necha turlari mavjud:

  1. Mahalliy (asosiy blok) rejalashtirish: ko'rsatmalar blokning asosiy chegaralari bo'ylab harakatlana olmaydi.
  2. Global rejalashtirish: ko'rsatmalar blokning asosiy chegaralari bo'ylab harakatlanishi mumkin.
  3. Modulni rejalashtirish: yaratish algoritmi dasturiy quvurlarni uzatish, bu ichki darajadagi turli xil takrorlanishlarni o'z ichiga olgan holda ko'rsatma darajasidagi parallellikni oshirishning bir usuli pastadir.
  4. Izlarni rejalashtirish: global rejalashtirish uchun birinchi amaliy yondashuv, kuzatishni rejalashtirish tez-tez bajariladigan boshqaruv oqimi yo'lini optimallashtirishga harakat qiladi.
  5. Superblokni rejalashtirish: izlarni rejalashtirishning soddalashtirilgan shakli, bu "yon kirish joylarida" iz oqimi yo'llarini birlashtirishga urinmaydi. Buning o'rniga kodni bir nechta jadvallar yordamida amalga oshirish mumkin, bu kod ishlab chiqaruvchisini juda soddalashtiradi.

Tuzuvchi misollar

The GNU kompilyatori to'plami buyrug'i yordamida rejalashtirishni bajarishi ma'lum bo'lgan bitta kompilyator - mart (ikkala ko'rsatma to'plami va rejalashtirish) yoki -mtune (faqat rejalashtirish) bayroqlar. Bu topshiriqni bajarish uchun har bir mikroarxitektura uchun ko'rsatmalarning kechikishi va qanday ko'rsatmalar parallel ravishda bajarilishi mumkinligi (yoki unga teng ravishda, har bir foydalaniladigan "port" ni) tavsiflaridan foydalanadi. Ushbu xususiyat GCC tomonidan qo'llab-quvvatlanadigan deyarli barcha arxitekturalarda mavjud.[2]

12.0.0 versiyasiga qadar ko'rsatmalarni rejalashtirish LLVM / Clang faqat a ni qabul qilishi mumkin edi - mart (deb nomlangan maqsad-CPU buyruqlar to'plami uchun ham, rejalashtirish uchun ham). 12-versiya qo'llab-quvvatlaydi -mtune (sozlash-CPU) faqat x86 uchun.[3]

Kechikish va portdan foydalanish to'g'risidagi ma'lumot manbalariga quyidagilar kiradi:

LLVM lvv-eksgeziya barcha mashinalarda, ayniqsa x86 bo'lmagan qurilmalarda ma'lumot to'plashda foydalanishga yaroqli bo'lishi kerak.[6]

Shuningdek qarang

Adabiyotlar

  1. ^ Su, Ching-Long; Tsuy, Chi-Ying; Despain, Alvin M. (1994). Kam quvvatli arxitekturani loyihalashtirish va yuqori samarali protsessorlar uchun kompilyatsiya usullari (PDF) (Hisobot). Murakkab kompyuter arxitekturasi laboratoriyasi. ACAL-TR-94-01. (Sovuq rejalashtirish)
  2. ^ "x86 parametrlari". GNU Compiler Collection (GCC) dan foydalanish.
  3. ^ "⚙ D85384 [X86] -mtune buyruq satri opsiyasi uchun asosiy yordamni qo'shish". sharhlar.llvm.org.
  4. ^ "Dasturiy ta'minotni optimallashtirish manbalari. C ++ va yig'ish. Windows, Linux, BSD, Mac OS X". Agner tuman.
  5. ^ "x86, x64 ko'rsatmalarining kechikishi, xotiraning kechikishi va CPUID dumplari". instlatx64.atw.hu. Shuningdek, sahifadagi "Fikrlar" havolasini ko'ring.
  6. ^ "llvm-exegesis - LLVM mashina ko'rsatmalarining mezonlari". LLVM 12 Hujjatlar.

Qo'shimcha o'qish