17-bo‘lim

Parallellik - SIMD va ko'p yadro

Parallellikning uch darajasi, SIMD registrlari, Amdal qonuni, haqiqiy ko'p jarayonli o'lchov va umumiy xotira muammolari.

🕑 8 daqiqa o‘qish 📄 1 209 so‘z 👁 0 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. SIMD - bir komanda, ko'p ma'lumot
  2. Amdal qonuni
  3. Haqiqiy o'lchov
  4. Ko'p yadroning narxi
  5. Xulosa

10-bo'limda ko'rgandik: 2005-yildan chastota o'sishi to'xtadi. Tezlik endi bir vaqtda ko'proq ish qilishdan keladi.

Parallellikning uch darajasi bor:

DarajaNima parallelKim boshqaradi
KomandaBir komandaning bosqichlariProtsessor (16-bo'lim)
Ma'lumotBir amal ko'p qiymatgaKompilyator yoki dasturchi
VazifaButun dasturlar va oqimlarDasturchi va OT

Birinchisini ko'rdik. Endi qolgan ikkitasi.

Parallellikning uch darajasi Komanda darajasi konveyer, spekulyatsiya k1 k2 k3 k4 ustma-ust kim boshqaradi: protsessor 16-bo'lim Ma'lumot darajasi SIMD bitta komanda, 4-16 qiymat kompilyator shu bo'lim Vazifa darajasi oqim va jarayon yadro 1 yadro 2 Amdal qonuni cheklaydi dasturchi shu bo'lim Birinchisi bepul - u o'z-o'zidan ishlaydi. Qolgan ikkitasi SIZDAN talab qiladi. 2005-yildan beri tezlik o'sishi asosan shu ikkisidan keladi
Chastota o'smaydi - shuning uchun bu uch daraja muhim bo'lib qoldi

SIMD - bir komanda, ko'p ma'lumot #

Agar bir xil amalni ming marta bajarish kerak bo'lsa, nima uchun ularni birga qilmaslik kerak?

1024 ta sonni qo'shish vazifasini olaylik. Bir vaqtda nechta sonni qayta ishlashga qarab komandalar soni keskin kamayadi:

SIMD kengligiKomandalarTejaldi
Oddiy (bittalab)10240%
2 ta birdan51250%
4 ta birdan25675%
8 ta birdan12888%
16 ta birdan6494%

Nomi shu yerdan kelib chiqadi: bitta komanda, ko'p ma'lumot.

Haqiqiy protsessorlarda registr kengligi yillar davomida oshib bordi:

KengaytmaRegistr kengligi32 bitli son64 bitli son
SSE128 bit4 ta2 ta
AVX2256 bit8 ta4 ta
AVX-512512 bit16 ta8 ta

Ya'ni bitta qo'shish komandasi 16 ta sonni birdan qo'shishi mumkin.

Oxirgi qator 15-bo'lim bilan bog'lanadi: SIMD qo'shni ma'lumotni talab qiladi. AoS joylashuvida qiymatlar orasida bo'shliq bor va SIMD registrga to'g'ridan-to'g'ri yuklanmaydi.

SIMD ni qo'lda yozish shart emas

Zamonaviy kompilyatorlar oddiy halqalarni avtomatik SIMD ga aylantiradi (auto-vectorization).

Buning uchun halqa quyidagi shartlarga javob berishi kerak:

ShartNima uchun
Iteratsiyalar bir-biriga bog'liq emasTartib o'zgarishi mumkin
Ma'lumot qo'shniBitta yuklash bilan olinadi
Ichkarida shox yo'q yoki oddiyHar element uchun bir xil amal
Chaqiruvlar yo'qFunksiya ichi noma'lum

Shuning uchun tezlik kerak bo'lganda birinchi qadam - assembler yozish emas, halqani soddalashtirish.

Kompilyator nima qilganini ko'rish uchun gcc -O2 -fopt-info-vec yoki godbolt.org dan foydalaning.

Amdal qonuni #

Ko'p yadro qancha yordam beradi? Javob kodingizning parallel qismiga bog'liq - va u kutilganidan qattiqroq cheklaydi.

Amdal qonuni aytadiki, tezlanishni ketma-ket qism cheklaydi. Turli ulushlar uchun tezlanish:

Parallel ulush2 yadro4 yadro8 yadro16 yadro64 yadro1024 yadro
50%1,31,61,81,92,02,0
90%1,83,14,76,48,89,9
95%1,93,55,99,115,419,6
99%2,03,97,513,939,391,2

Oxirgi ustunga qarang. Kod 90% parallel bo'lsa, 1024 ta yadro bilan ham tezlanish 10 barobardan oshmaydi.

Chegara faqat ketma-ket qismning ulushiga bog'liq:

Parallel ulushNazariy eng katta tezlanish
50%2 barobar
90%10 barobar
95%20 barobar
99%100 barobar

Amaliy xulosa: yadro qo'shishdan oldin ketma-ket qismni qisqartiring. Aks holda yangi yadrolar bekor turadi.

Birinchi qator ayniqsa achchiq: kodning yarmi parallel bo'lsa, cheksiz yadro bilan ham tezlanish ikki barobardan oshmaydi.

Amdal qonuni - optimallashtirishning eng muhim qoidasi

Bu jadval bitta amaliy xulosa beradi: ketma-ket qismni kamaytirish parallel qismni tezlatishdan muhimroq.

Misol: kodingiz 95% parallel. Yadrolarni 8 dan 16 ga oshirsangiz, 5,9 dan 9,1 ga chiqasiz - yaxshi.

Lekin agar ketma-ket qismni yarmiga qisqartirib, 97,5% parallel qilsangiz, o'sha 8 yadroda 7,0 ga chiqasiz - deyarli o'shancha foyda, qo'shimcha temirsiz.

Shuning uchun profillashda birinchi savol: "nima parallel bo'lolmaydi va nima uchun?"

Haqiqiy o'lchov #

Endi nazariyani tekshiramiz - haqiqiy jarayonlar bilan:

Vazifani bo'laklarga bo'lib, bir nechta yadroga tarqatsak, ish haqiqatan tezlashadi. Lekin bu yerda muhim tafsilot bor.

YondashuvHaqiqiy parallellik bo'ladimi
Bitta jarayonda bir nechta oqimtilga bog'liq - ba'zan yo'q
Bir nechta jarayonha, har doim

Ba'zi tillarda (masalan Python da) bitta jarayon ichidagi oqimlar hisoblash ishini parallel bajara olmaydi - ularni global qulf cheklaydi. Bunday holatda haqiqiy parallellik uchun alohida jarayonlar kerak bo'ladi.

Bu til darajasidagi tanlov, protsessor cheklovi emas: protsessor uchun yadrolar baribir mustaqil ishlayveradi.

Nima uchun aniq tezlanish raqami chop etilmadi?

Tezlanish ko'p narsaga bog'liq: yadrolar soni, fon jarayonlari, jarayon ishga tushirish xarajati.

Sinov paytida to'rtta bo'lakda tezlanish ba'zan 1,5 barobardan katta, ba'zan kichik chiqdi - jarayon ishga tushirish vaqti sezilarli ulush egallaydi.

Shuning uchun bu yerda faqat barqaror shart chop etildi. 14 va 15-bo'limlardagi bilan bir xil yondashuv.

Haqiqiy loyihada tezlanishni o'lchaganingizda: bir necha marta o'lchang, medianani oling va fon jarayonlarini yoping.

Ko'p yadroning narxi #

Parallellik bepul emas. Uchta asosiy muammo bor:

MuammoIzohi
Poyga holatiIkki oqim bir ma'lumotni bir vaqtda o'zgartiradi
QulflarHimoya kerak, lekin u kutishga olib keladi
Kesh kogerentligiYadrolar keshini sinxronlash - qimmat

Uchinchisi 15-bo'limdagi yolg'on almashish bilan bevosita bog'liq: yadrolar bir kesh qatoriga tegsa, ular doimo bir-birini xabardor qilib turishi kerak.

"Operatsion tizimlar" darsligining 5-8 bo'limlari bu mavzularni batafsil ochadi: oqimlar, mutex, semafor va deadlock.

Parallel kod - eng qiyin xatolar manbai

Ketma-ket kodda xato takrorlanadi. Parallel kodda esa ko'pincha yo'q.

BelgisiNima uchun qiyin
Yuz martadan bir marta yiqiladiTakrorlab bo'lmaydi
Nosozlik qidiruvchi ostida yo'qoladiVaqt o'zgaradi
Faqat yuk ostida chiqadiSinovda ko'rinmaydi
Boshqa mashinada boshqachaYadrolar soni farq qiladi

Amaliy maslahatlar:

MaslahatIzoh
Umumiy holatdan qochingEng ishonchli yechim
Xabar almashish afzalUmumiy xotiradan xavfsizroq
Tayyor kutubxonadan foydalaningO'zingiz yozmang
ThreadSanitizer kabi vositalarPoyga holatini topadi

Eng yaxshi parallel kod - hech narsa bo'lishmaydigan kod. Har bir jarayon o'z ma'lumoti bilan ishlasa, qulf ham, poyga ham bo'lmaydi.

Amaliy topshiriq
  1. AVX-512 registriga nechta 64 bitli son sig'ishini hisoblang.
  2. 1024 ta sonni 8 talab qayta ishlasak, necha komanda kerak?
  3. Tejash foizini o'zingiz hisoblab tekshiring.
  4. 99,9% parallel kod uchun nazariy chegarani hisoblang.
  5. 80% parallel kodda 16 yadro qancha tezlanish beradi?
  6. Nima uchun yadro qo'shish har doim ham yordam bermasligini yozing.
  7. Amdal qonunining amaliy xulosasini uch qatorda ayting.
  8. Parallellikning uch darajasini yoddan sanang.
  9. Har darajani kim boshqarishini yozing.
  10. Kompyuteringizda nechta yadro borligini toping.

Xulosa #

  • Chastota o'smaydi - tezlik endi parallellikdan keladi.
  • Uch daraja: komanda, ma'lumot (SIMD) va vazifa (oqim, jarayon).
  • SIMD bitta komanda bilan bir necha qiymatni ishlaydi.
  • AVX-512 da bitta registrga 16 ta float32 sig'adi.
  • SIMD qo'shni ma'lumotni talab qiladi - shuning uchun SoA joylashuvi muhim.
  • Kompilyator oddiy halqalarni avtomatik vektorlashtiradi.
  • Amdal qonuni: tezlanish chegarasi ketma-ket qismning ulushi bilan belgilanadi.
  • 90% parallel kodda 1024 yadro bilan ham tezlanish 10 barobardan oshmaydi.
  • Shuning uchun ketma-ket qismni qisqartirish yadro qo'shishdan muhimroq.
  • Parallel kodning xatolari takrorlanmaydi - eng qiyin turdagi nosozlik.

Keyingi bo'limda protsessor tashqi dunyo bilan qanday gaplashishini ko'ramiz: kiritish-chiqarish va uzilishlar.

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.