Bo'limni aniqlash, ishni almashish, sinxronizatsiya. Har bir direktivada bir nechta qo'shimcha bo'lishi mumkin



Yüklə 37,89 Kb.
Pdf görüntüsü
tarix25.12.2023
ölçüsü37,89 Kb.
#193768
7 AMLIY ISH KOM ARX



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 

(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. 
 
 
 
 
 
 

Yüklə 37,89 Kb.

Dostları ilə paylaş:




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©www.azkurs.org 2024
rəhbərliyinə müraciət

gir | qeydiyyatdan keç
    Ana səhifə


yükləyin