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


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

MPI_Allreduce MPI_Reduce bilan bir xil , yagona farq shundaki, u emas. natijalar tarqatilganda ildiz jarayoni identifikatori kerak
barcha jarayonlar uchun.



    1. MPIdagi guruhlar va kommunikatorlar

Ko'rib turganimizdek, MPI bir vaqtning o'zida ma'lumotlarni uzatish imkonini beradi kabi narsalarni qilish uchun kommunikatordagi barcha jarayonlar o'rtasida


Machine Translated by Google
bilan ma'lumotlarni bir jarayondan boshqa jarayonlarga taqsimlash


MPI_Scatter yordamida yoki ma'lumotlarni qisqartirish bilan MPI_Reduce yordamida . Oldingi barcha bo'limlarda biz foydalanganmiz kommunikator MPI_COMM_WORLD. Buning oddiy ilovalari uchun etarli, chunki bizda nisbatan kichik miqdor bor
jarayonlar. Biroq, ilovalar o'sishni boshlaganda, u bo'ladi
kamroq amaliy va murakkabroq holatlar uchun foydali bo'lishi mumkin
ko'proq aloqachilarga ega. Ushbu bo'limda biz sizga qanday yaratishni ko'rsatamiz asl jarayon guruhining bir qismi bilan muloqot qilish uchun yangi kommunikatorlar bir vaqtning o'zida. Yangisini yaratish uchun ishlatiladigan eng keng tarqalgan funksiya
aloqachilar:


MPI_Comm_split(MPI_Comm comm, int rang, int kalit, MPI_Comm* newcomm)


Bu funksiya "bo'lish" orqali yangi kommunikatorlarni yaratadi.
kommunikatorni kirish rang qiymatlari asosida subkommunikatorlar guruhiga aylantiradi
va kalit. comm uchun birinchi argument bo'ladi kommunikator hisoblanadi yangi kommunikatorlar uchun asos sifatida foydalaniladi. Bo'lishi mumkin MPI_COMM_WORLD bo'lsin, lekin u boshqa har qanday bo'lishi mumkin kommunikator. Ikkinchi argument, rang , qaysi yangiligini aniqlaydi kommunikator barcha jarayonlarga egalik qiladi. Barcha jarayonlar
bir xil rang qiymatini o'tkazish, bir xilga tayinlanadi
kommunikator. Uchinchi argument , kalit, har bir yangidagi darajani aniqlaydi kommunikator. Eng kichik kalit qiymatiga ega bo'lgan jarayon bo'ladi
daraja 0, keyingi eng past daraja 1 va hokazo oxirgi bo'ladi
newcomm argumenti qaytarilgan yangi kommunikatorga havoladir.
Biz birini ajratishga harakat qilayotgan oddiy misolni ko'rib chiqing global kommunikatorni kichikroq kommunikatorlar to'plamiga aylantiradi. Unda
Misol uchun, biz asl nusxamizni mantiqiy ravishda joylashtirdik deb taxmin qilamiz
kommunikatorni 16 ta jarayondan iborat 4x4 tarmog'iga aylantiramiz va biz tarmoqni bo'lishni xohlaymiz
Machine Translated by Google
qatorlar. Buning uchun har bir chiziq o'z rangiga ega bo'ladi. Yoniq
Quyidagi rasmda har bir jarayonni bittasi bilan qanday guruhlashini ko'rishingiz mumkin chapdagi rang o'ngdagi o'z kommunikatorida.

Ushbu amallarni bajaradigan dastur kodini ko'rib chiqing:


MPI_Init (NULL, NULL);


int world_rank, world_size;


MPI_Comm_rank(MPI_COMM_WORLD, &dunyo_darajasi);


MPI_Comm_size(MPI_COMM_WORLD, &dunyo_hajmi);


int rang = dunyo_reyti / 4;


MPI_Comm row_comm;


MPI_Comm_split(MPI_COMM_WORLD, rang, dunyo_darajasi, &row_comm);


int row_rank, row_size;


MPI_Comm_rank(satr_xabar, &satr_darajasi);


MPI_Comm_size(satr_xabar, &satr_hajmi);
Machine Translated by Google
printf("DUNYO RANK/ SIZE: %d/ %d --- QATR RANK/ SIZE: %d/ %d\n",
dunyo_darajasi, dunyo_o'lchami, qator_darajasi, qator_o'lchami);


MPI_Comm_free(&row_comm); MPI_Finalize();
Birinchi qatorlar asl nusxaning darajasi va hajmini oladi kommunikator MPI_COMM_WORLD. Keyingi qator muhim ahamiyatga ega
mahalliy jarayonning "rangini" aniqlash operatsiyasi. Rang ekanligini unutmang keyin jarayon qaysi kommunikatorga tegishli bo‘lishini aniqlaydi
ajratish. Biz kalit sifatida asl darajani (world_rank) ishlatamiz
ajratish operatsiyalari. Chunki biz barcha jarayonlarni yangida xohlaymiz kommunikator asl kommunikatordagi kabi tartibda edi,
Bu erda asl daraja qiymatidan foydalanish eng katta qiymatga ega
mantiqiy, chunki u allaqachon to'g'ri buyurtma qilingan bo'ladi. Shundan so'ng biz ishlayotganiga ishonch hosil qilish uchun yangi daraja va o'lchamni chop eting. Natija
dasturning bajarilishi quyidagicha ko'rinishi kerak:
DUNYo MARTARI/O'lchami: 1/8 --- QATR RANCHI/O'lchami: 1/4

DUNYo RANKASI/O'lchami: 0/8 --- QATR RANKSI/O'lchami: 0/4


DUNYo MARTARI/O'lchami: 2/8 --- QATR RANKASI/O'lchami: 2/4


DUNYo MARTARI/O'lchami: 7/8 --- QATR RANKASI/O'lchami: 3/4


DUNYo MARTARI/O'lchami: 6/8 --- QATR RANKASI/O'lchami: 2/4


DUNYoNING RANKASI/O'lchami: 5/8 --- QATR RANCHI/O'lchami: 1/4


DUNYo RANKASI/O'lchami: 3/8 --- QATR RANKASI/O'lchami: 3/4


DUNYo RANKASI/O'lchami: 4/8 --- QATR RANKSI/O'lchami: 0/4


Dastur oxirida biz kommunikatorni ishlatamiz MPI_Comm_free funktsiyasi . MPI ob'ekti endi yo'q bo'lganda foydalanilsa, keyinroq bo'lishi uchun uni bo'shatish kerak qayta ishlatildi. MPI cheklangan miqdordagi ob'ektlarga ega,


u bir vaqtning o'zida yaratishi mumkin. Agar ob'ektlarni qo'yib yubormasangiz, bu ish vaqti xatosiga olib kelishi mumkin.
114
Machine Translated by Google
MPI_Comm_split yaratish uchun eng keng tarqalgan funksiya bo'lsa-da kommunikator, boshqalar ko'p. Masalan, MPI_Comm_dup yaratadi
dublikat kommunikator. U erda g'alati tuyulishi mumkin
faqat nusxasini yaratadigan funksiya, lekin bu ilovalar uchun juda foydali ixtisoslashgan ishlarni bajarish uchun kutubxonalardan foydalanadi
matematik kutubxonalar kabi funktsiyalar. Bunday ilovalarda bu muhim ahamiyatga ega foydalanuvchi kodlari va kutubxona kodlari bir-biriga xalaqit bermasligi uchun. Kimga Bunga yo'l qo'ymaslik uchun har bir ilova qilish kerak bo'lgan birinchi narsa yaratishdir boshqalar bilan muammolarni oldini olish uchun MPI_COMM_WORLD dublikati MPI_COMM_WORLD dan ham foydalanadigan kutubxonalar . O'zlari
oldini olish uchun kutubxonalar MPI_COMM_WORLD nusxalarini yaratishi kerak bir xil muammo.
Ishlash uchun boshqa murakkabroq funktsiyalar mavjud

o'rtasidagi farqlar kabi biz bu erda yoritmaydigan kommunikatorlar


inter-kommunikatorlar va ichki kommunikatorlar va boshqalar


kommunikator yaratish uchun ilg'or funktsiyalar. Ular faqat ichida qo'llaniladi juda o'ziga xos ilovalar turlari.


MPI_Comm_split esa yangisini yaratishning eng oson usuli hisoblanadi Kommunikator buning yagona yo'li emas. Yana bor
kommunikatorlarni yaratishning moslashuvchan usullari, lekin ular yangi turdan foydalanadilar MPI obyekti MPI_Group. Guruhlar haqida batafsil ma'lumot berishdan oldin, kommunikator aslida nima ekanligini bir oz ko'proq ko'rib chiqaylik
dalolatnoma. Ichkarida, MPI kommunikatorning ikkita asosiy qismini qo'llab-quvvatlashi kerak
- bir kommunikatorni boshqasidan va guruhdan ajratib turuvchi kontekst kommunikator tarkibidagi jarayonlar. MPI identifikatorni saqlaydi aralashtirishning oldini olish uchun ichidagi har bir kommunikator. guruh
tushunish biroz osonroq, chunki bu barcha jarayonlarning yig'indisi

kommunikatorda. MPI_COMM_WORLD uchun bularning barchasi sodir bo'lgan jarayonlardir


mpiexec ishga tushirildi . Boshqa kommunikatorlar uchun guruh boshqacha bo'ladi.
Machine Translated by Google
MPI bu guruhlarni nazariya odatda ishlaydigan tarzda ishlatadi
to'plamlar. Birinchidan, kasaba uyushma operatsiyasi yangi (potentsial) yaratadi.
qolgan ikkita to'plamning kattaroq to'plami. Yangi to'plam hamma narsani o'z ichiga oladi birinchi ikkita to'plamning a'zolari (dublikat yo'q). Ikkinchidan, operatsiya
kesishuv qolgan ikkitasining yangi (potentsial) kichikroq to'plamini yaratadi to'plamlar. Yangi to'plam mavjud bo'lgan barcha elementlarni o'z ichiga oladi ikkala original to'plam. Bularning ikkalasiga misollarni ko'rishingiz mumkin operatsiyalar grafik ostida.



Bu {2, 3}, chunki har bir guruhda faqat shu elementlar ko'rinadi.


Endi biz guruhlar qanday ishlashining asoslarini tushunamiz, keling, ko'rib chiqamiz ular MPI operatsiyalariga qanday qo'llanilishi mumkin. MPIda guruh olish oson MPI_Comm_group API chaqiruvi bilan kommunikatordagi jarayonlar .

Download 1.46 Mb.

Do'stlaringiz bilan baham:
1   ...   63   64   65   66   67   68   69   70   ...   85




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