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.
Ushbu bo‘lim mundarijasi
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:
| Daraja | Nima parallel | Kim boshqaradi |
|---|---|---|
| Komanda | Bir komandaning bosqichlari | Protsessor (16-bo'lim) |
| Ma'lumot | Bir amal ko'p qiymatga | Kompilyator yoki dasturchi |
| Vazifa | Butun dasturlar va oqimlar | Dasturchi va OT |
Birinchisini ko'rdik. Endi qolgan ikkitasi.
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 kengligi | Komandalar | Tejaldi |
|---|---|---|
| Oddiy (bittalab) | 1024 | 0% |
| 2 ta birdan | 512 | 50% |
| 4 ta birdan | 256 | 75% |
| 8 ta birdan | 128 | 88% |
| 16 ta birdan | 64 | 94% |
Nomi shu yerdan kelib chiqadi: bitta komanda, ko'p ma'lumot.
Haqiqiy protsessorlarda registr kengligi yillar davomida oshib bordi:
| Kengaytma | Registr kengligi | 32 bitli son | 64 bitli son |
|---|---|---|---|
| SSE | 128 bit | 4 ta | 2 ta |
| AVX2 | 256 bit | 8 ta | 4 ta |
| AVX-512 | 512 bit | 16 ta | 8 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.
Zamonaviy kompilyatorlar oddiy halqalarni avtomatik SIMD ga aylantiradi (auto-vectorization).
Buning uchun halqa quyidagi shartlarga javob berishi kerak:
| Shart | Nima uchun |
|---|---|
| Iteratsiyalar bir-biriga bog'liq emas | Tartib o'zgarishi mumkin |
| Ma'lumot qo'shni | Bitta yuklash bilan olinadi |
| Ichkarida shox yo'q yoki oddiy | Har element uchun bir xil amal |
| Chaqiruvlar yo'q | Funksiya 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 ulush | 2 yadro | 4 yadro | 8 yadro | 16 yadro | 64 yadro | 1024 yadro |
|---|---|---|---|---|---|---|
| 50% | 1,3 | 1,6 | 1,8 | 1,9 | 2,0 | 2,0 |
| 90% | 1,8 | 3,1 | 4,7 | 6,4 | 8,8 | 9,9 |
| 95% | 1,9 | 3,5 | 5,9 | 9,1 | 15,4 | 19,6 |
| 99% | 2,0 | 3,9 | 7,5 | 13,9 | 39,3 | 91,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 ulush | Nazariy 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.
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.
| Yondashuv | Haqiqiy parallellik bo'ladimi |
|---|---|
| Bitta jarayonda bir nechta oqim | tilga bog'liq - ba'zan yo'q |
| Bir nechta jarayon | ha, 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.
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:
| Muammo | Izohi |
|---|---|
| Poyga holati | Ikki oqim bir ma'lumotni bir vaqtda o'zgartiradi |
| Qulflar | Himoya kerak, lekin u kutishga olib keladi |
| Kesh kogerentligi | Yadrolar 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.
Ketma-ket kodda xato takrorlanadi. Parallel kodda esa ko'pincha yo'q.
| Belgisi | Nima uchun qiyin |
|---|---|
| Yuz martadan bir marta yiqiladi | Takrorlab bo'lmaydi |
| Nosozlik qidiruvchi ostida yo'qoladi | Vaqt o'zgaradi |
| Faqat yuk ostida chiqadi | Sinovda ko'rinmaydi |
| Boshqa mashinada boshqacha | Yadrolar soni farq qiladi |
Amaliy maslahatlar:
| Maslahat | Izoh |
|---|---|
| Umumiy holatdan qoching | Eng ishonchli yechim |
| Xabar almashish afzal | Umumiy xotiradan xavfsizroq |
| Tayyor kutubxonadan foydalaning | O'zingiz yozmang |
ThreadSanitizer kabi vositalar | Poyga 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.
- AVX-512 registriga nechta 64 bitli son sig'ishini hisoblang.
- 1024 ta sonni 8 talab qayta ishlasak, necha komanda kerak?
- Tejash foizini o'zingiz hisoblab tekshiring.
- 99,9% parallel kod uchun nazariy chegarani hisoblang.
- 80% parallel kodda 16 yadro qancha tezlanish beradi?
- Nima uchun yadro qo'shish har doim ham yordam bermasligini yozing.
- Amdal qonunining amaliy xulosasini uch qatorda ayting.
- Parallellikning uch darajasini yoddan sanang.
- Har darajani kim boshqarishini yozing.
- 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
float32sig'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.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
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.