Loop optimallashtirish - Loop optimization

Yilda kompilyator nazariyasi, pastadirni optimallashtirish - bu bajarilish tezligini oshirish va qo'shimcha xarajatlarni kamaytirish jarayoni ko'chadan. Bu takomillashtirishda muhim rol o'ynaydi kesh ishlash va ulardan samarali foydalanish parallel ishlov berish imkoniyatlar. A-ning eng ko'p bajarilish vaqti ilmiy dastur ilmoqlarga sarflanadi; kabi, ko'p kompilyatorni optimallashtirish ularni tezroq bajarish uchun texnikalar ishlab chiqilgan.

Hisoblash va o'zgartirishni aks ettirish

Loop ichidagi ko'rsatmalar bir necha marta bajarilishi mumkinligi sababli, tez-tez loop optimallashtirishga ta'sir ko'rsatadigan buyruqlar sonini cheklash mumkin emas. Bu pastadir optimallashtirishning to'g'riligi va foydalari haqida fikr yuritishda qiyinchiliklarni keltirib chiqaradi, xususan hisoblashning optimallashtirilishi va optimallashtirish (lar) ning namoyishlari.[1]

Loop konvertatsiyasi ketma-ketligi orqali optimallashtirish

Loop optimallashtirishni o'ziga xos ketma-ketlikni qo'llash sifatida ko'rish mumkin pastadir konvertatsiyalari (quyida yoki ichida keltirilgan Yuqori samarali hisoblash uchun kompilyator transformatsiyalari[2]) manba kodiga yoki oraliq vakillik, har biri bilan transformatsiya qonuniylik uchun tegishli testdan o'tish. Transformatsiya (yoki o'zgarishlarning ketma-ketligi) odatda barchaning vaqtinchalik ketma-ketligini saqlab qolishi kerak bog'liqliklar agar bu dastur natijasini saqlab qolish uchun bo'lsa (ya'ni, qonuniy o'zgarish bo'lsa). Ushbu yondashuv doirasida transformatsiyaning foydasini yoki o'zgarishlarning ketma-ketligini baholash juda qiyin bo'lishi mumkin, chunki bitta foydali transformatsiyani qo'llash, o'z-o'zidan, ishlashning pasayishiga olib keladigan bir yoki bir nechta boshqa transformatsiyalardan oldindan foydalanishni talab qilishi mumkin.

Umumiy halqa konvertatsiyasiga quyidagilar kiradi:

  • Bo'linish yoki tarqatish - halqa bo'linishi bir xil indeks oralig'ida bir nechta tsikllarga tsiklni sindirishga urinadi, lekin har bir yangi tsikl asl tsikl tanasining faqat bir qismini oladi. Bu yaxshilanishi mumkin ma'lumotlarning joylashuvi, tsikldagi ikkala ma'lumot va loop tanasidagi kod.
  • Birlashma yoki birlashtiruvchi - bu bir-birining ma'lumotlariga ishora qilmasa, bir xil sonda takrorlanadigan (bu raqam kompilyatsiya paytida ma'lum bo'ladimi yoki yo'qmi) ikkita qo'shni ko'chadan tanalarini birlashtiradi.
  • O'zaro almashish yoki almashtirish - bu optimallashtirish ichki halqalarni tashqi halqalar bilan almashtiradi. Agar tsikl o'zgaruvchilari qatorga kiritilsa, bunday konvertatsiya massivning joylashishiga qarab mos yozuvlar manzilini yaxshilashi mumkin.
  • Inversiya - ushbu uslub standartni o'zgartiradi esa ga aylantiring do / while (a.k.a.) takrorlang / qadar ) halqa bilan o'ralgan agar shartli, ko'chadan bajarilgan holatlar uchun sakrashlar sonini ikkitaga kamaytirish. Buni amalga oshirish shartni tekshirishni takrorlaydi (kod hajmini oshirish), ammo samaraliroq, chunki sakrashlar odatda a sabab bo'ladi quvur trubkasi. Bundan tashqari, agar dastlabki shart kompilyatsiya vaqtida ma'lum bo'lsa va ma'lum bo'lsa yon ta'sir - bepul, boshlang'ich agar- qo'riqchini o'tkazib yuborish mumkin.
  • Kodning o'zgarmas harakati - bu hisoblashni natija miqdori har bir tsiklning takrorlanishi uchun bir xil bo'lsa (ya'ni, tsikl), tsikl boshlanishidan bir marta oldinroq qiymatni hisoblash orqali hisoblashni ko'chadan ichkariga ko'chirish orqali samaradorlikni sezilarli darajada yaxshilaydi. o'zgarmas miqdor). Bu, ayniqsa, massivlar bo'ylab ko'chadan hosil bo'lgan manzilni hisoblash ifodalari bilan juda muhimdir. To'g'ri amalga oshirish uchun ushbu texnikani inversiya bilan ishlatish kerak, chunki barcha kodlarni ko'chadan tashqariga ko'chirish xavfsiz emas.
  • Parallelizatsiya - bu alohida holat avtomatik parallellashtirish tsikllarga e'tibor qaratish, ularni ko'p protsessorli tizimlarda samarali ishlashini qayta qurish. Avtomatik ravishda kompilyatorlar tomonidan bajarilishi mumkin (avtomatik parallellashtirish ) yoki qo'lda (kabi parallel direktivalarni qo'shish OpenMP ).
  • Orqaga qaytarish - indeks o'zgaruvchisiga qiymatlarni berish tartibini o'zgartiradigan nozik optimallashtirish. Bu yo'q qilishga yordam beradi bog'liqliklar va shu bilan boshqa optimallashtirishga imkon beradi. Ba'zi arxitekturalar pastadirli konstruktsiyalardan foydalanadi yig'ilish faqat bitta yo'nalishda hisoblanadigan daraja (masalan, kamayish-sakrash-agar-bo'lmasa-nol [DJNZ][3]).
  • Rejalashtirish - bu loopni bir nechta protsessorlarda bir vaqtning o'zida ishlashi mumkin bo'lgan bir nechta qismlarga ajratadi.
  • Skewing - bu usul ko'p o'lchovli massiv ustida takrorlanadigan joylashtirilgan pastadirga qo'llaniladi, bu erda har bir takrorlash ichki halqa oldingi takrorlanishlarga bog'liq bo'lib, uning qatoriga kirishni qayta tartibga soladi, shunda yagona bog'liqliklar tashqi tsiklning takrorlanishi orasida bo'ladi.
  • Dasturiy ta'minot tarmog'i - turi buyurtmadan tashqari ijro protsessor funktsiyalari bo'linmalarining kechikishini yashirish uchun ko'chadan takrorlash.
  • Bo'linish yoki peeling - bu pastadirni soddalashtirish yoki yo'q qilishga urinishlar bog'liqliklar uni bir xil tanaga ega bo'lgan, lekin indeks oralig'ining turli qismlarida takrorlanadigan bir nechta ko'chadan ajratish orqali. Maxsus holat pastadirni tozalash, bu muammoni birinchi takrorlash bilan pastadirni soddalashtirishi mumkin, bu loopni kiritmasdan oldin ushbu takrorlashni alohida bajaring.
  • Plitka qo'yish yoki blokirovka qilish - keshga mos keladigan hajmdagi ma'lumotlar bloklari ustida takrorlash uchun tsiklni qayta tashkil qiladi.
  • Vektorizatsiya - a-da bir vaqtning o'zida ilmoqning ko'p takrorlanishini bajarishga urinishlar SIMD tizim.
  • Yozib olinmoqda - tsiklning tanasini bir necha marta takrorlaydi, bu esa pastadir holatini sinash va pasaytirish sonini kamaytirish uchun ko'rsatma quvur liniyasini buzishi bilan ish faoliyatini pasaytirishi mumkin. To'liq tsiklni bekor qilish barcha ortiqcha yuklarni yo'q qiladi (bir nechta ko'rsatmalar olinishi va dasturning yuklanish vaqtining ko'payishi bundan mustasno), lekin takrorlashlar soni kompilyatsiya vaqtida ma'lum bo'lishini talab qiladi (bundan mustasno Vaqti-vaqti bilan tuzilgan kompilyatsiya ). Shuningdek, indekslangan o'zgaruvchilarni bir necha bor qayta hisoblash dastlabki tsikl ichidagi ilgarilab boruvchi ko'rsatkichlardan kattaroq qo'shimcha xarajat emasligiga ishonch hosil qilish kerak.
  • Yoqish - tsiklning korpusini takrorlash va uning versiyasini har birining ichiga joylashtirish orqali shartli ko'chadan ichkaridan tashqariga ko'chiradi agar va boshqa shartli bandlar.
  • Bo'limlarni ajratish yoki konlarni qazib olish - uchun kiritilgan vektorli protsessorlar, loop-sectioning - bu imkon beradigan tsiklni o'zgartirish usuli SIMD (bitta ko'rsatma, bir nechta ma'lumotlar) - ko'chadan kodlash va xotira ish faoliyatini yaxshilash. Bu ma'lum bir vektor mashinasida maksimal vektor uzunligidan kichik yoki teng bo'lgan o'lchov uchun har bir vektor operatsiyasini o'z ichiga oladi.[4][5]

Bir xil bo'lmagan transformatsiya doirasi

Bir xil bo'lmagan transformatsiya yondashuvi[6] bitta ishlatadi bir xil bo'lmagan matritsa yuqoridagi ko'plab o'zgarishlarning ketma-ketligining birlashtirilgan natijasini tavsiflash. Ushbu yondashuvning ichida markaziy bayonotning barcha bajarilishlar to'plamining ko'rinishi mavjud n an ning butun sonli nuqtalari to'plami sifatida ko'chadan n- nuqtalar bajarilgan holda o'lchovli bo'shliq leksikografik tartib. Masalan, indeksli tashqi tsikl ichida joylashtirilgan bayonotning bajarilishi men va indeksli ichki tsikl j juft sonlar bilan bog'lanishi mumkin . Nomodulli transformatsiyani qo'llash ushbu bo'shliq ichidagi nuqtalarni matritsaga ko'payishiga mos keladi. Masalan, ikkita tsiklning almashinuvi matritsaga to'g'ri keladi .

Nomodular o'zgarish, agar u barchaning vaqtinchalik ketma-ketligini saqlab qolsa, qonuniydir bog'liqliklar; bir xil bo'lmagan transformatsiyaning ishlash ta'sirini o'lchash qiyinroq. Nomukammal joylashtirilgan tsikllar va ba'zi bir o'zgartirishlar (masalan, plitka qo'yish) ushbu ramkaga osonlikcha mos kelmaydi.

Ko'p qirrali yoki cheklovga asoslangan ramka

The ko'p qirrali model[7] oddiy bo'lmagan ramkaga qaraganda kengroq dasturlar va transformatsiyalar sinfini boshqaradi. Balki nomukammal joylashtirilgan ilmoqlar to'plami ichidagi bayonotlar to'plamining bajarilishi majmui, bu bayonotlarning bajarilishini ifodalovchi politoplar to'plamining birlashishi sifatida qaraladi. Afinaning o'zgarishi yangi ijro tartibining tavsifini ishlab chiqaradigan ushbu polytoplarga qo'llaniladi. Politoplarning chegaralari, ma'lumotlarga bog'liqligi va o'zgarishlari ko'pincha cheklovlar tizimidan foydalangan holda tavsiflanadi va bu yondashuv ko'pincha cheklovga asoslangan pastadirni optimallashtirishga yondashish. Masalan, tashqi tsikldagi bitta gap 'i: = 0 dan n gacha"va ichki halqa"j: = 0 dan i + 2 gacha'har biri uchun bir martadan bajariladi (men, j) shunday juftlik 0 <= i <= n va 0 <= j <= i + 2.

Yana bir bor ta'kidlash joizki, konvertatsiya, agar u barchaning vaqtinchalik ketma-ketligini saqlab qolsa, qonuniydir bog'liqliklar. Transformatsiyaning afzalliklarini baholash yoki ushbu kompyuter uchun berilgan kod uchun eng yaxshi transformatsiyani topish ushbu maqolani yozish paytida davom etayotgan tadqiqot mavzusi bo'lib qolmoqda (2010).

Shuningdek qarang

Adabiyotlar

  1. ^ Kitobda Dasturni o'zgartirishi haqida mulohaza yuritish, Jan-Fransua Kollard statik optimallashtirish sharoitida dastur matni emas, balki dasturlarning bajarilishini aks ettirishning umumiy masalasini chuqur muhokama qiladi.
  2. ^ Devid F. Bekon, Syuzan L. Grem va Oliver J. Sharp. Yuqori samarali hisoblash uchun kompilyator transformatsiyalari. Hisobot № UCB / CSD 93/781, Kompyuter fanlari bo'limi-EECS, Kaliforniya universiteti, Berkli, Berkli, Kaliforniya, 94720, 1993 yil noyabr (mavjud CiteSeer [1] ). Ma'lumotlarga bog'liqlikni tahlil qilish va protseduralararo tahlil kabi kompilyator tahlilini hamda tsikl transformatsiyalarining to'liq ro'yxatini taqdim etadi.
  3. ^ "8051 ko'rsatmalar to'plami". www.win.tue.nl. Olingan 2019-12-09.
  4. ^ [2]
  5. ^ [3]
  6. ^ Stiven S. Muchnik, Murakkab kompilyatorni loyihalash va amalga oshirish, 1997 yil Morgan Kaufmann. 20.4.2-bo'limda loop optimallashtirish muhokama qilinadi.
  7. ^ R. Allen va K. Kennedi. Zamonaviy me'morchilik uchun kompilyatorlarni optimallashtirish. Morgan Kaufmann, 2002 yil.