15-bo‘lim

Keshga do'st kod

Matritsa ko'paytirishda murojaat tartibini o'zgartirish, AoS va SoA joylashuvi, bo'laklab ishlash va o'lchash metodikasi.

🕑 7 daqiqa o‘qish 📄 1 025 so‘z 👁 0 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Matritsa ko'paytirish
  2. Tuzilmalar massivi va massivlar tuzilmasi
  3. Yana uchta amaliy usul
  4. Xulosa

14-bo'limda kesh qanday ishlashini ko'rdik. Endi undan foydalanishni o'rganamiz.

Muhim nuqta: bu bo'limdagi o'zgarishlar algoritmni o'zgartirmaydi. Amallar soni bir xil qoladi - faqat tartib boshqacha bo'ladi.

Matritsa ko'paytirish #

Klassik misol. C = A × B da B matritsasi ustun bo'ylab o'qiladi - bu 14-bo'limda ko'rgan eng yomon holat.

128×128 matritsalarni ko'paytirishda xotiraga murojaatlarni sanaymiz:

UsulKeshda topildiTopilmadiFoiz
Oddiy2 069 8802 124 42449%
B ko'chirilgan3 684 480509 82487%

Ikkala usul ham bir xil sondagi murojaat qildi va bir xil natijani berdi. Farq faqat B matritsaning o'qilish tartibida.

Oddiy usulda B ustun bo'ylab o'qiladi - har element yangi kesh qatorini talab qiladi. Ko'chirilgandan keyin esa u qator bo'ylab o'qiladi.

Ko'chirishning o'zi ham vaqt oladi, lekin u bir marta bajariladi - keyingi millionlab murojaat esa tez ketadi.

49% dan 87% ga. Kesh xatolari to'rt barobardan ko'proq kamaydi.

E'tibor bering: ko'chirish qo'shimcha ish talab qiladi - ta nusxalash. Lekin ko'paytirishning o'zi amal, shuning uchun qo'shimcha xarajat tez qoplanadi.

Nima uchun vaqt emas, murojaatlar sanaldi?

Bu darslikdagi boshqa o'lchovlar haqiqiy vaqtni o'lchaydi. Bu yerda esa model ishlatildi. Sababi ochiq aytilishi kerak.

Sabab shundaki, talqin qilinadigan tillarda har bir amal qo'shimcha xarajat bilan keladi va u kesh xatosidan ancha qimmat. Natijada kesh ta'siri shovqin ostida qolib ketadi.

Sinab ko'rildi: 200x200 matritsada natija ishga tushirishdan ishga tushirishga o'zgarib turdi - ba'zan ko'chirilgan variant tezroq, ba'zan sekinroq chiqdi.

Shuning uchun bu yerda mexanizmni ko'rsatadigan model tanlandi. C yoki Rust da xuddi shu o'zgarish real va barqaror tezlanish beradi - o'sha tillarda ustama xarajat yo'q.

Xulosa metodik: o'lchov nimani o'lchayotganini biling. Noto'g'ri sharoitda olingan raqam yo'q raqamdan yomonroq.

Tuzilmalar massivi va massivlar tuzilmasi #

Ikkinchi klassik naqsh. Bir xil ma'lumotni ikki xil joylashtirish mumkin:

UsulJoylashuv
AoS (array of structs)[x,y,z,...][x,y,z,...]
SoA (struct of arrays)[x,x,x,...][y,y,y,...]
Bir xil ma'lumot, ikki xil joylashuv AoS - tuzilmalar massivi x y z m x y z m x y faqat x kerak, lekin y,z,m ham keladi SoA - massivlar tuzilmasi x x x x x x y y y y butun kesh qatori foydali Qaysi biri yaxshi - VAZIFAGA bog'liq Bitta maydon hamma obyektda -> SoA | Bitta obyektning hamma maydoni -> AoS SIMD (17-bo'lim) uchun ham SoA zarur
Ma'lumotni ishlatish tartibiga qarab joylashtiring

4096 ta zarrachaning faqat x koordinatasini yig'moqchimiz. Har zarrachada 8 ta maydon bor, bizga esa faqat bittasi kerak.

JoylashuvKeshda topildiTopilmadiFoiz
Tuzilmalar massivi (AoS)04 0960%
Massivlar tuzilmasi (SoA)3 58451287%

Sabab shundaki, AoS da har kesh qatorida bizga kerak bo'lgan 1 ta element va kerak bo'lmagan 7 tasi keladi.

Foydali baytlar ulushini hisoblasak:

JoylashuvOlib kelinganIshlatilganFoydali ulush
AoS64 bayt8 bayt12%
SoA64 bayt64 bayt100%

Ya'ni AoS da xotira kanalining 88 foizi bekorga band bo'ladi.

SoA har doim yaxshi degani emas

AoS yomon emas - u boshqa vazifa uchun yaxshi.

VazifaQaysi biri yaxshi
Bitta maydonni hamma obyektda o'qishSoA
Bitta obyektning hamma maydonini o'qishAoS
Obyektlarni ro'yxatga qo'shish/olib tashlashAoS
SIMD bilan ishlash (17-bo'lim)SoA

O'yin dvigatellarida ko'pincha ikkalasi aralash ishlatiladi: tez-tez birga o'qiladigan maydonlar birga, qolganlari alohida.

Qoida: ma'lumotni ishlatish tartibiga qarab joylashtiring, kontseptual chiroylilikka qarab emas.

Yana uchta amaliy usul #

1. Bo'laklab ishlash (blocking). Katta massivni keshga sig'adigan bo'laklarga bo'lib ishlash. Matritsa ko'paytirishda bu ko'chirishdan ham yaxshiroq natija beradi.

2. Maydonlarni tartiblash. 7-bo'limda ko'rgandik: cdi 20 bayt, dic 13 bayt. Kichikroq tuzilma - kesh qatoriga ko'proq element sig'adi.

3. Ko'rsatkichlardan qochish. Bog'langan ro'yxat, daraxt va ko'rsatkichli tuzilmalar xotira bo'ylab tarqalib ketadi. Massiv esa qo'shni.

Qachon optimallashtirish kerak?

Bu bo'limdagi usullar kuchli, lekin ular kodni murakkablashtiradi.

Tartib shunday bo'lishi kerak:

QadamNima qilinadi
1Ishlaydigan, o'qiladigan kod yozing
2Sekinlik haqiqatan muammomi - o'lchang
3Qaysi joy sekinligini profilchi bilan toping
4Faqat o'sha joyni optimallashtiring
5Yana o'lchang - yaxshilandimi

Eng ko'p uchraydigan xato - 3-qadamni tashlab ketish. Dasturchilar qaysi joy sekin ekanini taxmin qilishda juda yomon.

Va ko'pincha javob bu bo'limda emas: sekinlik algoritmda (O(n²) o'rniga O(n log n)), keraksiz baza so'rovlarida yoki tarmoq kutishida bo'ladi.

Kesh optimallashtirish - oxirgi chora, birinchi emas.

Yolg'on almashish - ko'p oqimli koddagi tuzoq

Ikki oqim turli o'zgaruvchilar bilan ishlayotgan bo'lsa ham, agar ular bitta kesh qatorida yotsa, protsessor ularni doimo bir-biriga moslashtirib turadi.

Natijada kod parallel bo'lsa ham sekinlashadi - ba'zan bir oqimlisidan ham sekin.

Bunga yolg'on almashish (false sharing) deyiladi.

BelgisiYechim
Oqim qo'shilsa tezlik pasayadiHar oqimning ma'lumotini alohida kesh qatoriga qo'ying
Hisoblagichlar massivi sekinUlar orasiga to'ldiruvchi qo'shing

Buni topish qiyin, chunki kodga qaraganda hech qanday umumiy ma'lumot ko'rinmaydi. U faqat xotira joylashuvida bor.

Ko'p oqimli kod 17-bo'limda ko'riladi.

Amaliy topshiriq
  1. Matritsa ko'paytirishda nima uchun B ustun bo'ylab o'qilishini tushuntiring.
  2. Ko'chirish 49% dan 87% ga ko'tardi - bu nimani anglatadi?
  3. Ko'chirishning o'zi ham vaqt oladi. U qachon o'zini oqlaydi?
  4. AoS va SoA farqini o'z so'zlaringiz bilan yozing.
  5. AoS da foydali ulush nima uchun 12% ekanini hisoblang.
  6. Har zarrachada 4 ta maydon bo'lsa, ulush qanday o'zgarardi?
  7. Ikkita maydonni birga o'qiydigan vazifa uchun qaysi usul yaxshi?
  8. Uchala maydonni ham o'qisak, AoS yutadimi? Nega?
  9. O'z loyihangizda ustun bo'ylab o'qilayotgan joy bormi - tekshiring.
  10. Optimallashtirishdan oldin o'lchash nima uchun zarurligini yozing.

Xulosa #

  • Keshga do'st kod algoritmni o'zgartirmaydi - faqat murojaat tartibini.
  • Matritsa ko'paytirishda B ni ko'chirish kesh topilishini 49% dan 87% ga oshirdi.
  • Qo'shimcha nusxalash amal fonida arzon tushadi.
  • AoS bitta obyektning hamma maydoni uchun, SoA hamma obyektning bitta maydoni uchun yaxshi.
  • Bizning misolda AoS foydali baytlarning atigi 12% ini ishlatdi.
  • Boshqa usullar: bo'laklab ishlash, maydonlarni tartiblash, ko'rsatkichlardan qochish.
  • Talqin qilinadigan tillarda kesh ta'sirini vaqt bilan o'lchab bo'lmaydi - ustama xarajat uni bosib ketadi.
  • Shuning uchun bu bo'limda model ishlatildi; C va Rust da ta'sir real.
  • Optimallashtirishdan oldin o'lchang va profillang - taxmin qilmang.
  • Ko'p oqimli kodda yolg'on almashish parallel kodni sekinlashtirishi mumkin.

Keyingi bo'limda protsessorning ichki tezlashtirish mexanizmini ko'ramiz - konveyer.

Xatolik topdingizmi?

Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.