|
Parallel dasturlarda eng keng tarqalgan ishlash muammolari
|
bet | 2/3 | Sana | 30.11.2023 | Hajmi | 80,83 Kb. | | #108886 |
Bog'liq KA leksiyaParallel dasturlarda eng keng tarqalgan ishlash muammolari.
Parallel kengaytmalarning maqsadi parallel dasturlashni osonlashtirish va parallel dasturlashning maqsadi unumdorlik bo'lganligi sababli, bizning CTP relizlarimizga oid ko'plab savollar ishlashga bog'liq bo'lishi ajablanarli emas.
Ishlab chiquvchilar nima uchun bitta dastur parallel tezlashtirishni ko'rsatayotgani va boshqasi yo'q yoki dasturni ko'p yadroli mashinalarda yaxshiroq masshtablash uchun qanday o'zgartirish kerakligi qiziq.
Javoblar odatda har xil bo'ladi. Ba'zi hollarda kuzatilgan muammo bizning kod bazamizdagi aniq muammo bo'lib, uni tuzatish nisbatan oson. Boshqa hollarda muammo shundaki, Parallel kengaytma muayyan ish yukiga yaxshi moslashmaydi. Buni tuzatish biz uchun qiyinroq bo'lishi mumkin, ammo haqiqiy dunyo ish yuklarini tushunish bu boradagi birinchi qadamdir, shuning uchun bizga fikr-mulohazalaringizni yuborishda davom eting. Muammoning yana bir toifasi dasturning parallel kengaytmalardan qanday foydalanishi va biz bu muammoni hal qilish uchun juda oz narsa qila olamiz.
Qizig'i shundaki, muammoning manbai bizning kodimizda yoki maxsus kodda bo'lishidan qat'i nazar, ko'pchilik ishlash muammolari asosidagi umumiy naqshlar mavjud. Ushbu blog postida biz parallel kengaytmalardan foydalangan holda ilovalarni ishlab chiqishda e'tiborga olish kerak bo'lgan umumiy ishlash muammolarini ko'rib chiqamiz.
Protsessor bilan bog'liq parallel ishlarning miqdori
Parallellashtirishning birinchi raqamli talabi dasturda parallel ravishda bajarilishi mumkin bo'lgan ish etarli bo'lishi kerak. Agar ishning faqat yarmini parallel qilish mumkin bo'lsa, Amdahl qonuni biz dasturni ikki martadan ko'proq tezlashtira olmaymiz.
Bundan tashqari, agar protsessor unumdorlik muammosi bo'lsa, vazifani bajarishda ko'proq protsessorlar ishtirok etishi eng yaxshi yordam beradi. Agar dastur o'z vaqtining 90% serverning SQL so'rovlarini bajarishini kutishga sarflasa, dasturni parallellashtirish katta foyda keltirmasligi mumkin. (Agar biz, masalan, bir nechta serverlarga bir nechta so'rovlar yubora olsak, siz hali ham tezlashuvni ko'rishingiz mumkin. Biroq, bunday hollarda, asinxron dasturlash modeli yanada yaxshi ishlashga olib keladi.)
Parallelizmdan foyda olish uchun dasturdagi resurslarni ko'p talab qiladigan ishlarning umumiy miqdori parallellashtirishning ortiqcha xarajatlarini kamaytirish uchun etarlicha katta bo'lishi kerak va bu ishlarning aksariyati parallel bajarish uchun parchalanishi kerak.
Vazifa tafsilotlari
Agar dastur juda ko'p parallelizatsiya qilinadigan ishlarni bajarsa ham, biz ishni parallel ravishda bajariladigan mos o'lchamdagi bo'laklarga bo'lishga ehtiyot bo'lishimiz kerak. Agar biz juda ko'p qismlar yaratadigan bo'lsak, bo'laklarni boshqarish va rejalashtirish uchun qo'shimcha xarajatlar katta bo'ladi. Agar biz juda oz sonli qismlarni yaratsak, mashinaning ba'zi yadrolari hech qanday aloqasi bo'lmaydi.
Parallel.For va PLINQ kabi parallel kengaytmalar API ning ba'zi qismlarida bizning kutubxona kodimiz vazifalarning to'g'ri tartibliligini aniqlash uchun javobgardir. API ning boshqa qismlarida, masalan, vazifalar va fyucherslar, bu maxsus kod tomonidan boshqariladi. Vazifalarni yaratish uchun kim mas'ul bo'lishidan qat'i nazar, yaxshi ishlash uchun vazifalarning to'g'ri tartibliligi muhimdir.
Yuklarni muvozanatlash
Parallelizmni foydali qilish uchun etarli darajada protsessor ishi parallellashtirilgan bo'lsa ham, biz ishning mashina yadrolari bo'ylab teng taqsimlanishini ta'minlashimiz kerak. Bu ishning turli "bo'laklari" ularni bajarish uchun zarur bo'lgan vaqt ichida juda farq qilishi mumkinligi bilan murakkablashadi. Bundan tashqari, biz ko'pincha har bir qismni oxirigacha ishlamagunimizcha qancha mehnat talab qilishini bilmaymiz.
Misol uchun, agar Parallel.For barcha sikl iteratsiyalari bir xil vaqtni olgan deb hisoblasak, biz diapazonni bizda yadrolar bo'lganidek ko'p qo'shni diapazonlarga bo'lishimiz va har bir diapazonni bitta yadroga belgilashimiz mumkin. Afsuski, har bir iteratsiyadagi ish hajmi har xil bo'lishi mumkinligi sababli, bitta yadro ko'p qimmat iteratsiyalarni bajarishi, boshqa yadrolar esa kamroq ishni bajarishi kerak bo'lishi mumkin. Ekstremal vaziyatda bitta yadro deyarli barcha ishlarni bajarishi mumkin va biz ketma-ket holatga qaytamiz.
Yaxshiyamki, Parallel.For dasturini amalga oshirish ko'pgina ish yuklari uchun yaxshi ishlashi kerak bo'lgan yuk balansini ta'minlaydi. Ammo siz o'zingizning parallel kodingizni yozishda yukni muvozanatlash bilan bog'liq muammolarga duch kelishingiz mumkin.
|
| |