194
bo'limni aniqlash, ishni almashish, sinxronizatsiya. Har bir direktivada bir nechta
qo'shimcha bo'lishi mumkin.
• OpenMP qo'llab-quvvatlovchi kompilyator "_OPENMP" makrosini belgilaydi,
undan shartli ravishda dasturning parallel versiyasiga xos individual bloklarni
kompilyatsiya qilish uchun foydalanish mumkin.
• Parallelizatsiya for-looplarga qo'llaniladi, buning uchun "#pragma omp for"
direktivasi ishlatiladi. Parallel sikllarda break operatoridan foydalanish taqiqlanadi.
• Parallel dastur sohasida aniqlangan statik o'zgaruvchilar umumiydir.
malloc () bilan ajratilgan xotira umumiydir (ammo unga ko'rsatgich umumiy yoki
shaxsiy bo'lishi mumkin).
• OpenMP turlari va funktsiyalari qo'shiladigan faylda aniqlanadi.
• Odatdagidan tashqari, “ichiga o‘rnatilgan” mutekslar ham mumkin – mantiqiy
o‘zgaruvchilar o‘rniga butun sonlar qo‘llaniladi va mutexni allaqachon ushlagan ip
qayta ushlanganda bu sonni oshirishi mumkin. OpenMP dasturlash modeli vilkalar
bilan birlashish parallelizmidir bu erda asosiy ip kerak bo'lganda iplar guruhlarini
hosil qiladi, bilan dasturning dasturning parallel sohalariga kirishi.
7 Amaliy mashg’ulot:
Mavzu:
MPI paketinidan foydalanish
Ishdan maqsad:
MPI paketidan foydalanishni o'rganish
195
Nazariy qism
Xabarlarni uzatish modelidagi eng keng tarqalgan parallel dasturlash
kutubxonasi MPI (Message Passing Interface). Tavsiya etilgan bepul MPI dasturi
Argonne Milliy Laboratoriyasida ishlab chiqilgan MPICH paketidir. MPI
protsessorlararo xabar almashish funktsiyalari kutubxonasi bo'lib, 300 ga yaqin
funksiyalarni o'z ichiga oladi, ular quyidagi sinflarga bo'linadi: nuqtadan nuqtaga
operatsiyalar, kollektiv almashinuv operatsiyalari, topologik operatsiyalar, tizim va
yordamchi operatsiyalar. MPI funksiyalarning standartlashtirilgan kutubxonasi
bo'lganligi sababli, MPI yordamida yozilgan dastur turli xil parallel kompyuterlarda
o'zgarishsiz bajariladi. Asosan, dasturlarning katta qismini yozish uchun quyida
keltirilgan bir nechta funktsiyalar etarli. MPI_Send funktsiyasi nuqtadan nuqtaga
operatsiya bo'lib, ma'lumotlarni ma'lum bir jarayonga yuborish uchun ishlatiladi.
MPI_Recv funktsiyasi ham nuqta operatsiyasi bo'lib, ma'lum bir jarayondan
ma'lumotlarni olish uchun ishlatiladi. Xuddi shu ma'lumotlarni boshqa barcha
jarayonlarga yuborish uchun MPI_BCAST jamoaviy operatsiyasi qo'llaniladi, bu
barcha jarayonlar, ham jo'natish, ham qabul qilish tomonidan amalga oshiriladi.
MPI_REDUCE jamoaviy almashish funktsiyasi op operatsiyasidan foydalangan
holda guruhdagi har bir jarayonning kirish buferi yozuvlarini birlashtiradi va
birlashtirilgan qiymatni ildiz jarayoni raqamlangan chiqish buferiga qaytaradi.
MPI_Send (manzil, hisob, ma'lumotlar turi, maqsad, teg, xabar), manzil -
jo'natuvchining buferida yuboriladigan ma'lumotlarning manzili count - xabar
uzunligi ma'lumotlar turi - yuborilgan ma'lumotlar turi maqsad - qabul qilish
jarayonining nomi teg - qo'shimcha ma'lumot uchun comm - kommunikator nomi
MPI_Recv (manzil, hisob, ma'lumotlar turi, manba, teg, xabar, holat) manzil - qabul
qiluvchining buferidagi qabul qilingan ma'lumotlarning manzili count - xabar
uzunligi ma'lumotlar turi - qabul qilingan ma'lumotlar turi manba - yuborish
jarayonining nomi
teg - qo'shimcha ma'lumot uchun
comm – kommunikator nomi
status - qo'shimcha ma'lumot uchun
196
MPI_BCAST (manzil, hisob, ma'lumotlar turi, ildiz, aloqa)
root - yuborish (ildiz) jarayonining soni
MPI_REDUCE (sendbuf, recvbuf, count, ma'lumotlar turi, op, root, comm)
sendbuf - jo'natish buferining manzili
recvbuf - bufer manzilini qabul qilish
count - jo'natish buferidagi elementlar soni
ma'lumotlar turi - ma'lumotlar turi
op - qisqartirish operatsiyasi
ildiz - asosiy jarayonning raqami
Bundan tashqari, bir nechta tashkiliy funktsiyalar qo'llaniladi.
MPI_INIT ()
MPI_COMM_SIZE (MPI_COMM_WORLD, numprocs)
MPI_COMM_RANK (MPI_COMM_WORLD, myid)
MPI_FINALIZE ()
MPI_INIT ga qo'ng'iroq har bir MPI dasturida mavjud va kerak birinchi MPI
qo'ng'irog'i bo'ling. Bundan tashqari, dasturning har bir bajarilishida faqat bitta
qo'ng'iroq qilish mumkin Ushbu bayonotni amalga oshirgandan so'ng, hammasi
parallel dastur jarayonlari parallel bajariladi. MPI_INIT.
MPI_COMM_WORLD
boshlang'ich
(va
ko'p
hollarda
yagona)
kommunikator bo'lib, aloqa konteksti va bog'liq jarayonlar guruhini belgilaydi.
MPI_COMM_SIZE ga qo'ng'iroq qilish foydalanuvchi tomonidan ushbu dasturda
boshlangan numprocs jarayonlari sonini qaytaradi. MPI_COMM_RANK ga
qo'ng'iroq qilish orqali har bir jarayon jarayon guruhidagi o'z raqamini qandaydir
nom bilan aniqlaydi. MPI_FINALIZE () qatori dasturdagi har bir jarayon tomonidan
bajarilishi kerak. Natijada, MPI bayonotlari endi bajarilmaydi. COM_WORLD
o'zgaruvchisi dasturni ishga tushirish uchun tayinlangan jarayonlar ro'yxatini
belgilaydi. C tilidagi p sonini hisoblash uchun MPI dasturi.Birinchi parallel dastur
uchun p sonini hisoblash dasturi qulay, chunki unda ma'lumotlar yuklanmaydi va
javobni tekshirish oson. Hisob-kitoblar quyidagi formula yordamida integralni
hisoblash uchun qisqartiriladi:
197
bu erda xi = (i-1/2) / n. Dastur 4.1-rasmda ko'rsatilgan.
#"mpi.h"ni o'z ichiga oladi
#o'z ichiga
int main (int argc, char * argv [])
{
int n, myid, numprocs, i; / * ordinatalar soni, jarayonlarning nomi va soni * / juft
PI25DT = 3.141592653589793238462643; / * hisob-kitoblarning to'g'riligini
baholash uchun ishlatiladi * /
juft mypi, pi, h, summa, x; / * mypi - individual jarayonning shaxsiy qiymati p, pi -
umumiy qiymati p * /
MPI_Init (& argc, & argv); / * tizim tomonidan o'rnatilgan * /
MPI_Comm_size (MPI_COMM_WORLD va numprocs);
MPI_Comm_rank (MPI_COMM_WORLD, & myid);
esa (1)
{
agar (myid == 0) {
printf (“Intervallar sonini kiriting: (0 chiqish)”); / * ordinatalar sonini kiritish * /
scanf ("% d", & n);
}
MPI_Bcast (& n, 1, MPI_INT, 0, MPI_COMM_WORLD);
agar (n == 0) / * dasturdan chiqish shartini belgilash * /
sindirish;
boshqa {
h = 1,0 / (ikki marta) n; / * ba'zi bir jarayonning ma'lum p qiymatini hisoblash * /
summa = 0,0; uchun (i = myid +1; i <= n; i + = numprocs) {x = h * ((juft) i - 0,5);
summa + = (4,0 / (1,0 + x * x));
}
mypi = h * yig'indisi; / * ba'zi bir jarayonning ma'lum p qiymatini hisoblash * /
198
MPI_Reduce (& mypi, & pi, 1, MPI_DOUBLE, MPI_SUM, 0,
MPI_COMM_WORLD); / * to'liq p qiymatini yarating * /
agar (myid == 0) / * hisoblash xatosining taxmini * /
printf ("pi taxminan% .16f. Xato
% .16f \ n ", pi, fabs (pi - PI25DT));
}
}
MPI_Finalize (); / * MPIdan chiqish * /
qaytish 0;
}
Guruch. 4.1 Si tilidagi p sonini hisoblash dasturi Matritsani vektorga
ko'paytirish dasturi Matritsani vektorga ko'paytirish natijasi natija vektoridir.
Muammoni hal qilish uchun algoritm qo'llaniladi, unda bir jarayon (magistr) boshqa
jarayonlar (bo'ysunuvchilar) ishini muvofiqlashtiradi. Aniqlik uchun matritsa-
vektorni ko'paytirishning yagona dasturi uch qismga bo'linadi: asosiy jarayon
kodining umumiy qismi va bo'ysunuvchi jarayonning kodi.Dasturning umumiy
qismida masalaning asosiy ob'ektlari. tasvirlangan: matritsa A, vektor b, natijada
vektor c, jarayonlar soni aniqlanadi (kamida ikkita). Vazifa ikki qismga bo'linadi:
asosiy jarayon va qul jarayonlar. Matritsani vektorga ko'paytirish masalasida
jarayonlarga taqsimlanadigan ish birligi A matritsa qatorining nuqta ko'paytmasidan
b vektorga to'g'ri keladi. Imzo! izohlar belgilangan.
program main use mpi integer
MAX_ROWS, MAX_COLS, rows, cols
parameter (MAX_ROWS = 1000, MAX_COLS = 1000)
! матрица А, вектор b, результирующий вектор с
double
precision
a
(MAX_ROWS,
MAX_COLS),
b(MAX_COLS),
с(MAX_ROWS) double precision buffer (MAX_COLS), ans /* ans – имя
результата*/ integer myid, master, numprocs, ierr, status (MPI_STATUS_SIZE)
integer i, j, numsent, sender, anstype, row /* numsent – число посланных строк,
sender – имя процесса-отправителя, anstype – номер посланной строки*/
199
call MPI_INIT (ierr) call MPI_COMM_RANK (MPI_COMM_WORLD, myid,
ierr) call MPI_COMM_SIZE (MPI_COMM_WORLD, numprocs, ierr)
! главный процесс – master
master = 0
! количество строк и столбцов матрицы А
rows = 100
cols = 100
if (myid.eq. master) then
! код главного процесса
else
! код подчиненного процесса
endif
call MPI_FINALIZE (ierr)
stop
end
Bo'ysunuvchi jarayonlar natijalarni asosiy jarayonga yuboradi va para-
asosiy jarayonning qabul qilish ishidagi MPI_ANY_TAG hisoblagichi shuni
ko'rsatadi asosiy jarayon har qanday tartibda chiziqlarni qabul qiladi. Parametr status
qabul qilingan xabar bilan bog'liq ma'lumotlarni taqdim etadi. V Fortranda bu
MPI_STATUS_SIZE o'lchamdagi butun sonlar massivi. Argu-SOURCE xabarni
yuborgan jarayonning raqamini o'z ichiga oladi, bu manzilga asosiy jarayon yangi
ishni yo'naltiradi. TAG argumenti qayta ishlangan satrning satr raqamini saqlaydi,
bu esa olingan natijani joylashtirishni ta'minlaydi. Asosiy jarayon A matritsasining
barcha qatorlarini yuborgandan so'ng, u bo'ysunuvchi jarayonlarning so'rovlariga 0
belgisi bilan javob beradi.
Dostları ilə paylaş: |