G‘afarov, A. F. Galimyanov parallel hisobiyotlar qo'llanma Qozon
Download 1.46 Mb.
|
ParVychGafGal (1)
- Bu sahifa navigatsiya:
- MPI_Scatter, MPI_Gather
- MPI_Comm kommunikatori)
- MPI Reduce va Allreduce funktsiyalari Qisqartirish
- MPI_Reduce
- MPI_MAX
- MPI_Reduce ning bajarilishi tasvirlangan. Ushbu misolda har bir jarayon bitta butun sonni oz ichiga oladi raqam. MPI_Reduce
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. 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: |
ma'muriyatiga murojaat qiling