G‘afarov, A. F. Galimyanov parallel hisobiyotlar qo'llanma Qozon


Download 1.46 Mb.
bet65/85
Sana24.12.2022
Hajmi1.46 Mb.
#1062519
1   ...   61   62   63   64   65   66   67   68   ...   85
Bog'liq
ParVychGafGal (1)

MPI_Scatter bilan bir xil .


MPI_Gather(void* send_data, int send_count, MPI_Datatype send_datatype,


bekor* recv_data, int recv_count, MPI_Datatype recv_datatype, int root,


MPI_Comm kommunikatori)


MPI_Scatter, MPI_Gather shablonlarni bajaradigan funksiyalardir


birdan-bir yoki birdan-ko'p ma'lumotlarni uzatish , bu oddiygina

ko'p jarayonlar bir jarayonni yuborish va qabul qilish degan ma'noni anglatadi, yoki


aksincha. Ko'pincha ko'p narsalarni yuborish imkoniyatiga ega bo'lish foydalidir


ko'p jarayonlarga (ya'ni, ko'pdan ko'pga uzatish sxemasi). Buning uchun in


MPIda MPI_Allgather funksiyasi mavjud. Quyidagi rasmda qanday qilib ko'rsatilgan


ma'lumotlar MPI_Allgather chaqiruvidan so'ng tarqatiladi.


Machine Translated by Google


Xuddi MPI_Gather funktsiyasini chaqirganda bo'lgani kabi, har birining elementlari jarayonlar o'z darajalari tartibida yig'iladi, elementlar bundan mustasno
barcha jarayonlarda yig'iladi. Funktsiya deklaratsiyasi MPI_Allgather deyarli
MPI_Gather bilan bir xil , yagona farq shundaki, ildiz jarayoni yo'q.
MPI_Allgather( bekor* yuborish_ma'lumotlari, int yuborish_hisoblash, MPI_Datatype


send_datatype, void* recv_data, int recv_count, MPI_Datatype recv_datatype, MPI_Comm kommunikatori)
Misol sifatida, o'rtacha hisoblaydigan dasturni ko'rib chiqing massiv qiymati. Dastur juda oddiy bo'lsa-da, u qanday qilishni ko'rsatadi
jarayonlar o'rtasida ishni almashish uchun MPI dan foydalanishingiz mumkin, ma'lumotlarning kichik to'plamlari bo'yicha hisob-kitoblarni amalga oshiring va keyin jamlang yakuniy javobga kichikroq parchalar.


float *create_rand_nums(int num_elements) {


float *rand_nums = (float *)malloc (sizeof(float) * num_elementlar);


assert(rand_nums != NULL);


int i;


uchun (i = 0; i < son_elementlar; i++) {


rand_nums[i] = (rand() / (float)RAND_MAX);


}


rand_numsni qaytarish;


}
Machine Translated by Google
float compute_avg(float *massiv, int son_elementlar) {



float summasi = 0.f;
int i;



uchun (i = 0; i < son_elementlar; i++) {


sum += massiv[i];


}


summani / elementlarning sonini qaytarish;


}


int main (int argc, char** argv) {


int num_elements_per_proc = 10000000;


srand (vaqt (NULL));


MPI_Init (NULL, NULL);


int world_rank;


MPI_Comm_rank(MPI_COMM_WORLD, &dunyo_darajasi);


int world_size;


MPI_Comm_size(MPI_COMM_WORLD, &dunyo_hajmi);


float *rand_nums = NULL;


agar (jahon_darajasi == 0) {



dunyo_olchami);
rand_nums = create_rand_nums (har_proc uchun_elementlar_soni *



}


float *sub_rand_nums = (float *)malloc(sizeof(float) * bosh_proc uchun_num_elementlar);


MPI_Scatter(rand_sonlar, har bir_proc uchun_elementlar_soni, MPI_FLOAT, sub_rand_sonlar, har bir_prok uchun_elementlar_soni, MPI_FLOAT, 0, MPI_COMM_WORLD);
107

Machine Translated by Google
float sub_avg = hisoblash_o'rtacha (sub_rand_sonlar, har bir_proc uchun_elementlar_soni);


float *sub_avgs = (float *)malloc(sizeof(float) *dunyo_size);


MPI_Allgather(&sub_avg, 1, MPI_FLOAT, sub_avgs, 1, MPI_FLOAT, MPI_COMM_WORLD);


float o'rtacha = hisoblash_avg(sub_o'rtacha, dunyo_o'lchami);


printf("%d prok.dagi barcha elementlarning oÿrtachasi %f\n", world_rank, avg);


agar (dunyo_darajasi == 0) {


bepul(rand_son);


}


bepul (sub_o'rtacha);


bepul (kichik_raqamlar);


MPI_Barrier(MPI_COMM_WORLD);


MPI_Finalize();
}
Bu yerda create_rand_nums funksiyasi massivni tasodifiy bilan to'ldiradi

raqamlar va compute_avg funksiyasi o'rtachani hisoblab chiqadi. Agar Siz


dasturni ishga tushirsangiz, natija quyidagicha ko'rinishi kerak:


Proc 1 dagi barcha elementlarning o'rtacha qiymati 0,499927 ni tashkil qiladi


Proc 0 dan barcha elementlarning o'rtacha qiymati 0,499927 ni tashkil qiladi


E'tibor bering, raqamlar tasodifiy yaratilgan,


shuning uchun sizning yakuniy natijangiz quyidagidan farq qilishi mumkin.





    1. MPI Reduce va Allreduce funktsiyalari Qisqartirish - bu funksionallikning klassik tushunchasi

dasturlash. Ma'lumotni qisqartirish to'plamni qisqartirishni o'z ichiga oladi

raqamlarni ba'zi funktsiyalardan foydalangan holda kichikroq raqamlar to'plamiga aylantiradi. Masalan,




Aytaylik, bizda [1, 2, 3, 4, 5] raqamlar ro'yxati bor. Bu raqamlar ro'yxati bilan qisqartirish


yig'indisi funksiyasidan foydalanish 15 bo'ladi . va ko'paytirish qisqartmasi 120 bo'ladi .
Machine Translated by Google
MPI -da MPI_Reduce deb nomlangan qulay funksiya mavjud bo'lib, u deyarli hamma narsani bajaradi
dasturchi ishlab chiqishda duch kelishi mumkin bo'lgan qisqartmalar parallel dastur. MPI_Gather kabi , MPI_Reduce bu funksiya
har bir jarayon uchun kirish elementlari qatorini oladi va qaytaradi

ildiz jarayoniga chiqish elementlari massivi. Chiqish elementlari o'z ichiga oladi kamaytirilgan natija. MPI_Reduce prototipi quyidagicha ko'rinadi:


MPI_Reduce( bekor* yuborish_maÿlumotlar, bekor* recv_maÿlumotlar, int soni, MPI_Datatype
ma'lumotlar turi, MPI_Op op, int root, MPI_Comm kommunikator)
Bizga allaqachon ma'lum bo'lgan funktsiyalardan farqli o'laroq, MPI_Reduce funktsiyasi mavjud
MPI_Op op parametri qo'llanilishi kerak bo'lgan operatsiyani belgilaydi
ma'lumotlar. MPI umumiy qisqartirish operatsiyalarining keng to'plamini o'z ichiga oladi, bu erda
ko'proq ishlatiladigan ba'zilari:

  • MPI_MAX - maksimal elementni qaytaradi.

  • MPI_MIN - minimal elementni qaytaradi.

  • MPI_SUM - elementlarni jamlash.

  • MPI_PROD - barcha elementlarni ko'paytiradi.

  • MPI_LAND - barcha elementlarda mantiqiy AND operatorini bajaradi.

  • MPI_LOR - barcha elementlarda mantiqiy OR operatorini bajaradi. Quyida MPI_Reduce ning bajarilishi tasvirlangan.

Ushbu misolda har bir jarayon bitta butun sonni o'z ichiga oladi raqam. MPI_Reduce 0 ildiz jarayoni bilan chaqiriladi va foydalanadi


MPI_SUM kamaytirish operatsiyasi sifatida. To'rtta raqam umumlashtiriladi va
Machine Translated by Google
natija ildiz jarayonida saqlanadi. Buni tushunish ham foydalidir

jarayonlar bir nechta elementlarni o'z ichiga olganida sodir bo'ladi. Berilgan bo'yicha


Quyidagi rasmda har bir jarayon uchun ma'lumotlarning qisqarishi ko'rsatilgan.



Olingan yig'indi har birining asosida sodir bo'ladi

element. Boshqacha qilib aytganda, barcha elementlarni yig'ish o'rniga massivlarni bitta elementga kiritish har bir massivdan i-chi element i ga yig'iladi 0 jarayon natijalari massivining m elementi.



Download 1.46 Mb.

Do'stlaringiz bilan baham:
1   ...   61   62   63   64   65   66   67   68   ...   85




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling