Amaliy mashg’ulot №15 - 1-Amaliy mashg’ulot

Amaliy mashg’ulot №15
Mavzu: Multiprocessing va shared array operatorlari yordamida Python dasturlash tilida parallel dasturlash.
Ishdan maqsad: Talabalarda Multiprocessing va shared array operatorlari to’g’risida tushuncha hosil qilish, Multiprocessing va shared array operatorlari yordamida Python dasturlash tilida parallel dasturlashni o’rganish.
Nazariy qism
Python ajoyib til. Bir qator Python + NumPy + Matplotlib, mening fikrimcha, endi ilmiy hisob-kitoblar va tezkor prototip algoritmlari uchun eng yaxshilaridan biri hisoblanadi. Ammo har bir asbobning o'ziga xos yorug'lik va qorong'i tomonlari bor. Python-ning eng munozarali xususiyatlaridan biri bu GIL - Global Interpreter Lock. Men ushbu xususiyatni asbobning qorong'i tomoniga bog'lagan bo'lardim. Garchi ko'pchilik men bilan rozi bo'lmasalar.
Qisqacha aytganda, GIL bitta Python tarjimonida bir nechta ipdan samarali foydalanishga yo'l qo'ymaydi. GIL himoyachilarining ta'kidlashicha, bitta tishli dasturlar GIL bilan ishlashni ancha yaxshilaydi. Ammo GIL-ning mavjudligi shuni anglatadiki, ko'plab ish zarralari va umumiy xotiradan foydalangan holda parallel hisoblash mumkin emas. Va bu zamonaviy ko'p yadroli dunyoda juda kuchli cheklov.
Yaqinda maqolada GIL-ni C ++ dagi iplar bilan engishning bir usuli muhokama qilindi: Python-ni Multithreaded C ++ dasturida ishlatish. Ko'p ishlov berish va birgalikda qator asosida GIL cheklovlarini engib o'tishning yana bir usulini ko'rib chiqmoqchiman. Mening fikrimcha, bu usul juda ko'p sodda va samarali foydalanishga imkon beradi, shu bilan birga ko'p sonli iplar va umumiy xotira tarzida shaffof parallel dasturlash uchun umumiy xotira.
Bunday amaliyotlarni “oddiy” bir protsessorli kompyuterlarda MS Windows operatsion tizimlari (ko’p vazifali parallel hisoblash tizimlarni immitatsiyasi)da ishlovchi kompyuterlarni davlat nazoratlari ostida tashkil qilish mumkin. ParaLab tizimida, tizimni modellashtirish rejimi ya’ni ko’pprotsessorli hisoblash tizimining modellashtirish, natijalarini solishtirish va haqiqiy hisob-kitoblarni parallel hisoblash uchun tajribalarni bajarishda “real” rejimida ishlash, bundan tashqari, iste’molchini masofaviy erkin foydalanishi bilan ta’minlashi mumkin.
Parallel hisoblash — dasturlar o‘zaro parallel (bir vaqtda) xarakatlanadigan xisoblash jarayonlarini qayta ishlovchi to‘plami sifatida kompyuterli xisoblashni tashkillash usuli xisoblanadi. Bu ibora dasturlashdagi parallelizm muammolari yig‘indisi, shuningdek, samarali faoliyat yurituvchi qurilmalarni tadbiq etish xususiyatlarini o‘z ichiga qamrab oladi. Parallel xisoblash nazariyasi amaliy algoritmlar nazariyasini yaratilishiga olib keldi.
Parallel xisoblashni tadbiq etishning turli usullari mavjud. Masalan, xar bir xisoblash tizimi operatsin tizim jarayoni ko‘rinishida tadbiq etilishi yoki xisoblash jarayonlari operatsion tizimning birgina jarayoninig o‘zida bajaruvchilar oqimi to‘plamini aks ettirishi mumkin. Parallel dasturlar fizik nuqtai nazardan yagona protsessorda – xar bir xisoblash jarayoni qadamlarini navbatma-navbat ketma-ketlikda bajarilishi yoki belgilangan xar bir xisoblash jarayonini parallel aniqlab, bir yoki bir nechta protsessorlar (yonma-yon joylashgan yoki kompyuter tarmoqlarida taqsimlangan) yordamida amalga oshirilishi mumkin.
Parallel dasturlarni loyixalashdagi asosiy murakkablik shundan iboratki, turli xisoblash tizimlari bilan o‘zaro aloqasini, shuningdek, jarayonlar o‘rtasida taqsimlanadigan resurslar koordinatsiyasini to‘g‘ri ketma-ketlikda xarakatlanishini ta’minlash xisoblanadi.
Vazifa.
Misol sifatida quyidagi muammoni ko'rib chiqing. N o'lchovlar v0, v1,…, vN uch o'lchovli bo'shliqda berilgan. Har bir nuqta juftligi uchun ular orasidagi masofaga bog'liq funktsiyani hisoblash talab qilinadi. Natijada ushbu funktsiya qiymatlari bilan NxN matritsasi bo'ladi. Quyidagi funktsiyani funktsiya sifatida qabul qilaylik: f = r ^ 3/12 + r ^ 2 / 6. Ushbu test, aslida, u qadar sintetik emas. RBF interpolatsiyasi hisoblash matematikasining ko'plab sohalarida qo'llaniladigan bunday masofaviy funktsiyalarni hisoblashga asoslangan.
Parallelizatsiya usuli.
Ushbu masalada matritsaning har bir satrini mustaqil ravishda hisoblash mumkin. Matritsaning har bir qator satridan biz mustaqil ish o'rinlari tashkil qilamiz va ularni navbatga joylashtiramiz (1-rasmga qarang). Keling, ba'zi jarayonlarni boshlaymiz. Har bir jarayon navbatdagi ishni bajarish uchun navbatdan tortib to "end" kodi bilan maxsus ish bilan to'qnashgunga qadar amalga oshiriladi. Bunday holda, jarayon o'z ishini tugatadi.
Python dasturini amalga oshirish.
Python dasturida biz ikkita asosiy usulga ega bo'lamiz: mpCalcDistance (tugunlar) va
mpCalcDistance_Worker (tugunlar, navbat, arrD). MpCalcDistance (nodes) usuli tugunlar ro'yxatini kirish sifatida qabul qiladi, umumiy xotira maydonini yaratadi, ish navbatini tayyorlaydi va jarayonlarni boshlaydi. MpCalcDistance_Worker (tugunlar, navbat, arrD) usuli - bu o'z ipida ishlaydigan hisoblash usuli. U tugunlar ro'yxatini, ish navbatini va umumiy xotira maydonini kirish sifatida qabul qiladi. Keling, ushbu usullarning amalga oshirilishini batafsil ko'rib chiqaylik.
MpCalcDistance (tugunlar) usuli
Umumiy xotira maydonini yaratamiz:
nP = nodes.shape[0]
nQ = nodes.shape[0]
arrD = mp.RawArray(ctypes.c_double, nP * nQ)
nCPU = 2
nJobs = nCPU * 36
q = nP / nJobs
r = nP % nJobs
jobs = []
firstRow = 0
for i in range(nJobs):
rowsInJob = q
if (r > 0):
rowsInJob += 1
r -= 1
jobs.append((firstRow, rowsInJob))
firstRow += rowsInJob
queue = mp.JoinableQueue()
for job in jobs:
queue.put(job)
for i in range(nCPU):
queue.put(None)
while True:
job = queue.get()
if job == None:
break
start = job[0]
stop = job[0] + job[1]
|