Topshirdi :Yo’ldoshev Davronbek Parallel dasturlash Oblaqulov Sardor
29.03.2023
6 - topshiriq
MPI_Isend, MPI_Irecv, MPI_Iprobe, MPI_Wait, MPI_Waitall, MPI_Test, MPI_Testall funksiyalarini barchasiga alohida alohida dastur tuzib qay holatlarda va qanday ishlatilishini tushintirib bering.
MPI_Isend va MPI_Irecv funksiyalari parallel ravishda ishlash uchun xabar almashish jarayonini asinkron ravishda boshlash uchun foydalaniladi. MPI_Isend funksiyasi xabar yuborish uchun, MPI_Irecv funksiyasi esa xabar qabul qilish uchun ishlatiladi. Asinkron ravishda ishlash orqali, dastur yuborish jarayonini davom etishini kutmaydi, va boshqa vazifalarni bajarishga imkon beradi.
MPI_Isend funksiyasi quyidagicha bo'ladi:
int MPI_Isend(void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm, MPI_Request *request)
Bu funksiyaga kerakli argumentlar quyidagicha:
buf: Xabar yuboriladigan ma'lumotlar jadvali.
count: Xabar yuboriladigan ma'lumotlar jadvalidagi elementlar soni.
datatype: Xabar yuboriladigan ma'lumotlar turi.
dest: Xabarni yuborish kerak bo'lgan ishchi processning MPI identifikatori.
tag: Xabar turi bo'yicha belgilangan tanlov belgisi.
comm: MPI kommunikatsiyasi.
request: Yuborish so'rovi uchun MPI_Request obyekti.
MPI_Irecv funksiyasi esa quyidagicha bo'ladi:
int MPI_Irecv(void *buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Request *request)
Bu funksiyaga kerakli argumentlar quyidagicha:
buf: Xabar qabul qilinadigan ma'lumotlar jadvali.
count: Xabar qabul qilinadigan ma'lumotlar jadvalidagi elementlar soni.
datatype: Xabar qabul qilinadigan ma'lumotlar turi.
source: Xabarni yuboruvchi ishchi processning MPI identifikatori.
tag: Xabar turi bo'yicha belgilangan tanlov belgisi.
comm: MPI kommunikatsiyasi.
request: Qabul qilish so'rovi uchun MPI_Request obyekti.
Bunga endi quydagicha misolni ko’rib o’tamiz yani array beriladi uzunligi 10 ga teng bo’lgan uni to’ldiramiz va nolinchi jarayondan birinchi jarayonga qiymatlarini o’zgartirgan holda yuboramiz yuboramiz va buni quyda yana tushuntirin beraman.
Bu dasturda, 0-raqamli parallel jarayon (my_rank == 0) my_array jadvalidagi ma'lumotlarni yuboradi. Yuborish jarayoni asinkron ravishda boshlanadi va boshqa vazifalar bajariladi. 1-raqamli parallel jarayon esa (my_rank == 1) esa xabarni qabul qiladi. Xabar qabul qilish jarayoni ham asinkron ravishda boshlanadi va bajarilgan bo'lishi kutiladi. Qabul qilinadigan xabar to'liq qabul qilinganidan so'ng, received_array jadvalida saqlanadi va konsolga chiqariladi.
MPI_Wait funksiyasi qabul qilingan xabarni to'liq qabul qilinishini kutib turadigan jarayonni bloklash uchun ishlatiladi. Asinkron ravishda ishlash orqali, MPI_Wait funksiyasini ishlatish xabarni qabul qilish vaqtini kutingan holda boshqa vazifalarni bajarish imkonini beradi.
Endi MPI_Iprobe ni qanday ishlatishni va ishlashini ko’rib chiqamiz quydagi misolada.
MPI_Iprobe funksiyasi MPI komunikatsiyalari orqali xabar olishni tekshirish uchun ishlatiladi. Bu funksiyada tuzilgan so'rov MPI_Irecv funksiyasiga qaraganda bir ozroq kuchli xususiyatlariga ega bo'lgani uchun MPI_Irecv funksiyasidan farqli ravishda ishlatiladi.
MPI_Iprobe funksiyasining imkoniyatlari:
MPI_Iprobe(sender, tag, communicator, flag, status): xabar bo'lsa, flag o'zgaruvchi TRUE bo'ladi va status xabarga oid ma'lumotlarni o'z ichiga oladi.
MPI_Iprobe(MPI_ANY_SOURCE, MPI_ANY_TAG, communicator, flag, status): xabar o'qilishini kuzatadi, lekin xabar jo'natuvchisi va xabar tagi ixtiyory bo’lgan jarayondan kelsa ham ishlaydi.
MPI_Iprobe funksiyasi yordamida xabar topilganda, count o'zgaruvchi MPI_Get_count yordamida aniqlanishi kerak. Ya'ni, xabar o'qilgandan so'ng count o'zgaruvchisi o'zgaradi va uni quydagi misoldagi kabi o'qish mumkin.
Quyidagi misolda MPI_Iprobe funksiyasi yordamida xabar topilishini tekshiriladi. Agar xabar topilgan bo'lsa, MPI_Irecv funksiyasi yordamida xabar o'qiladi:
Dostları ilə paylaş: |