Amaliy mashg’ulot - Kafedrasi kompyuter arxitekturasi moduli bo‘yicha

|
Kafedrasi kompyuter arxitekturasi moduli bo‘yicha
|
bet | 77/80 | Sana | 06.07.2024 | Hajmi | 13,43 Mb. | | #266748 |
Bog'liq Kafedrasi kompyuter arxitekturasi moduli bo‘yicha7 Amaliy mashg’ulot:
Mavzu: MPI paketinidan foydalanish
Ishdan maqsad: MPI paketidan foydalanishni o'rganish
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
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:
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 * /
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 – номер посланной строки*/
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.
|
| |