MPI DAGI MA`LUMOTLAR TOIFASI

|
MPI DAGI MA`LUMOTLAR TOIFASI
|
bet | 5/5 | Sana | 23.05.2024 | Hajmi | 28,02 Kb. | | #251542 |
Bog'liq Маълумотларни параллел қайта ишлаш-fayllar.orgMPI DAGI MA`LUMOTLAR TOIFASI | | FOTRANDAGI MA`LUMOTLAR TOIFASI | |
MPI_INTEGER
MPI_REAL
MPI_DOUBLE_PRECISION
MPI_COMPLEX
MPI_LOGICAL
MPI_CHARACTER
MPI_BYTE.
MPI_PАCKЕD
|
integer
REAL
DOUBLE PRECISION
COMPLEX
LOGICAL
CHARACTER(1)
8 bit, toifalashmagan ma`lumotlar uchun qo`llaniladi.
Ma`lumotlar joylashish toifasi.
|
Agar MPI qo`llaniladigan til ma`lumotlarining qo`shimcha toifasiga ega bo`lsa, u xolda bu toifalar mpi da xam qo`llab quvvatlanishi kerak. Mavjud toifalarning to`liq ro`yxati mpif.h(mpi.h) faylida keltiriladi.
Xabarlar jo`natishda mavjud bo`lmagan jarayonlar uchun maxsus MPI_PROC_NULL qiymatini qo`llash mumkin. Bunday jarayonli operatsiyalar MPI_SUCCESS tugatish kodi bilan tez tugaydi. Masalan, bir birlikka ortiq nomerli jarayonga xabar jo`natish uchun quyidagi fragmentdan foydalanish mumkin:
call MPI_COMM_SIZE(MPI_COMM_WORLD, size, ierr)
call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr)
next = rank+1
if(next .eq. size) next =MPI_PROC_NULL
call MPI_SEND(buf,1,MPI_REAL,next,
& 5, MPI_COMM_WORLD,ierr)
Bu xolda jarayon xaqiqatda ma`lumotlar jo`natmaydi va dasturni bajarishda davom etadi.
Blokirovka protseduradan qaytgandan keyin barcha parametrlarni takroriy qo`llanilishini kafolatlaydi. YA`ni mpi_send dan qaytgandan keyin joriy protsedurani chaqirishda qo`llanilgan o`zgaruvchilarning ixtiyoriy birini berilgan xabarni buzilishga xavfsiramasdan ishlatish mumkin. Buni kafolatlash usulini tanlash: oraliq buferga nusxalash yoki bevosita dest jarayoniga berish mpi ni yaratayotgan dasturchilar ixtiyotiga bog`liq.
Shuni ta`kidlab o`tish kerak, mpi_send jarayonidan qaytish xabar dest jarayonning jarayon elementini tark etganini xam bildirmaydi. Faqat joriy protsedurani chaqirishda foydalanilgan o`zgaruvchilarni bexatar o`zgartirish kafolatlanadi. Shunga o`xshash noaniqliklar xar doim xam foydalanuvchilarni qanoatlantirmaydi. Xabarlar almashish imkoniyatini kengaytirish uchun mpi da uchta protsedura mavjud. Bu protseduralardagi parametrlar xam xuddi mpi_send dagi kabi, biroq ularni xar biri o`ziga xos xususiyatga ega.
MPI quyidagi ma`lumotlar almashish protseduralar modifikatsiyalarini qo`llab quvvatlaydi:
- MPI_VSEND buferatsiya bilan xabar uzatish. Agar uzatilgan xabar qabul qiluvchi tomonidan qabul qilinmasa, u xolda xabar maxsus buferga yoziladi va tezda protseduradan qaytariladi. Bu protsedurani bajarilishi mos qabul qiluvchi protsedurani chaqirilishiga bog`liq emas, qolaversa, agar buferda yetarlicha joy bo`lmasa protsedura xatolik kodini qaytaradi. Buferlash uchun massiv belgilashni ishini foydalanuvchi o`z zimmasiga olishi kerak.
- MPI_SSEND sinxronlab xabarlar uzatish. Ushbu protseduradan chiqish faqat jo`natilgan xabar qabul qiluvchi jarayon tomonidan qabul qilingandan keyin mumkin. Bu bilan xabar almashishni sinxronlab tugatish orqali jo`natma buferidan takroriy foydalanish imkoniyati yaratiladi va dasturdagi qabul qiluvchi jarayon xabarni qabul qilishi kafolatlanadi. Sinxronlab xabar almashish dastur bajarilishini sekinlatadi, biroq sistemada xabarlarni ortiqcha buferlardan xoli qiladi.
-MPI_RSEND tayorgarlik bo`yicha xabar uzatish. Bu protseduradan faqat qabul qiluvchi jarayon qabulni amalga oshirgandan keyin foydalanish mumkin. Aks xolda bu protsedura chaqirilishi noto`g`ri xisoblanadi va uning natijasi mavxum bo`ladi. Mpi_rsend protsedurasi chaqirilishidan oldin xabar qabul qilinganligini kafolatlash uchun jarayonlarni yaqqol va noyaqqol sinxronlash opersiyalaridan foydalanish kerak. Ko`pincha mpi_rsend protsedurasi uzatuvchi va qabul qiluvchi o`rtasidagi muloqat bayonnomasini qisqartiradi va ma`lumotlar almashishdagi sarf-xarajatlarni kamaytiradi.
Foydalanuvchi jo`natuvchi jarayonda mpi_vsend protsedurasini chaqirganda xabarlarni buferlash uchun zarur maxsus massiv belgilash kerak.
MPI_VUFFER_ATTACH(VUF,SIZE,IYERR)
VUF(*)
INTEGER SIZE, IYERR
SIZE o`lchami BUF massivini buferlab xabar jo`natishda ishlatish uchun yaratish. Bunday buferdan xar bir jarayonda faqat bittasi bo`lishi kerak. Bufer sifatida belgilangan massivdan dasturda maqsadlarda ishlatmaslik kerak. Buferlash uchun yaratilgan massiv o`lchami umumiy o`lchamidan kichik bo`lmasligi kerak va minimum MPI_VSEND_OVERHEAD konstantasidan aniqlangan qiymatga teng bo`lishi kerak.
MPI_VUFFER_DETACH(VUF, SIZE, IYERR)
VUF (*)
INTEGER SIZE, IYERR
Ajralgan bufer massivini boshqa maqsadlarda ishlatish uchun bo`shatish. Bu protsedura BUF va SIZE argumentlarida bo`shatilgan massiv manzili va o`lchami qiymatlarini qaytaradi. Bu protsedurani chaqirgan jarayon joriy buferdagi xabarlar jo`natilguncha uni blokirovkalab turadi.
Odtda MPI da jo`natiladigan xabarlarni buferlash uchun biror o`lchamdagi xotira qo`llaniladi. Biroq dastur barcha buferlovchi jo`natmalarga yetarli buferni aniq ko`rsatish tavsiya etiladi.
DATATYPE toifali, elementlari count dan ko`p bo`lmagan MSGTAG identifkatorli xabar elementlari bilan buf buferiga blokirovkalab qabul qilish. Agar real qilingan elementlar soni count miqtoridan kam bo`lsa, u xolda BUF buferida qabul qilingan xabar elementlarga mos elementlar o`zgaradi. Agar qabul qilinayotgan elementlari count qiymatidan ko`p bo`lsa, u xolda xatolik yuz beradi. Buni bartaraf etish uchun MPI_PROBE(MPI_IPROBE) protsedurasi yordamida keladigan xabar strukturasi aniqlanadi. Agar qabul qilingan xabarlarda elementlar sonini aniq bilish kerak bo`lsa, u xolda MPI_GET_COUNT protsedurasidan foydalanish mumkin. Blokirovkalash amali MPI_RECV protsedurasidan qaytgandan keyin xabarning barcha elementlari qabul qilingan va buf buferiga joylashgan bo`ladi.
Quyidagi keltirilgan dasturda nol jarayoni bir raqamli jarayonga xabar jo`natadi va undan javob kutadi. Agar dastur ko`p sonli jarayon bilan ishga tushirilsa, u xolda jo`natmalar bajarish nol bo`ladi. Qolgan jarayonlar MPI_INIT protsedurasi yordamida tashkil etilgandan keyin a va b o`zgaruvchilarning boshlang`ich qiymatlarini chop qiladi, keyin MPI_FINALIZE protsedurasini bajarib ishini tugatadi.
Navbatdagi misolda xar bir toq nomerni jarayon bir birlikka, ko`p nomerli qo`shni jarayonga xabar jo`natadi. Qo`shimcha ravishda eng katta nomerni jarayonga xabar jo`natmasligi uchun tekshiriladi. b o`zgaruvchining qiymati faqat toq nomerli jarayonlarda o`zgaradi.
Keltirilgan misolda SOURCE va MSGTAG argumentlari o`rniga quyidagi konstantalarni qo`llash mumkin:
MPI_ANY_SOURCE itiyoriy jarayondan berilgan xabar mos kelishini bildiruvchi belgi;
MPI_ANY_TAG ixtiyotiy identifikatorli xabar mos kelishini bildiruvchi belgi;
Ushbu ikkita konstanta baravar ishlatilganida ixtiyoriy jarayonning ixtiyoriy identifikatorli xabar qabul qilinadi. Qabul qilingan xabarning aniq atributlarini status massivining mos elementlari yordamila aniqlash mumkin. Fotran status parametri butun sonli va MPI_STATUS_SIZE o`lchami massiv xisoblanadi. MPI_SOURCE, MPI_TAG va MPI_ERROR konstantalari berilgan massivning mos elementlari qiymatlariga murojat etish qoidasi xisoblanadi:
status (MPI_SOURCE) xabarni jo`natuvchi jarayon nomeri;
status (MPI_TAG) xabar identifikatori;
status (MPI_ERROR) xatolik kodi;
Si tilidagi status parametri MPI_SOURCE, MPI_TAG va MPI_ERROR maydonlaridan iborat MPI_SOURCE toifali struktura xisoblanadi.
Xabarlarni jo`natish va qabul qilish amallarining ba`zi nosimmetrik jixatlariga e`tibor qiling. MPI_ANY_SOURCE konstanta yordamida ixtiyoriy jarayondan xabar qabul qilish mumukin. Biroq ma`lumotlarni jo`natishda qabul qiluvchi jarayonning nomerini aniq ko`rsatish kerak. Standartga ko`ra, agar bir jarayon bitta MPI_RECV chaqiruvga ketma-ket ikkita xabar jo`natsa, ikkinchi jarayon dastlab oldin jo`natilgan xabarni qabul qiladi. Shu bilan birga agar ikkita xabar bir vaqtda turli jarayonlar tomonidan jo`natilsa u xolda qabul qiluvchi jarayon tomonidan xabarlarni qabul qilish tartibi oldindan ma`lum emas.
status parametrining qiymatlari orqali protsedura qabul qilingan xabarning (MPI_RECV ga murojat etgandan keyin) yoki DATATYPE toifali xabarning qabul qilingan elementlarining (MPI_PROBE yoki MPI_IPROBE ga murojat etib) COUNT miqdorini aniqlaydi. Joriy protsedura qabul qilingan xabarlarni saqlash uchun ajratilgan xotira soxasining xajmini o`lchash uchun zarur.
status massivida COMM kommunikatoridagi SOURCE nomeri jarayondan kutilayotgan MSGTAG identifikatori xabar strukturasi xaqidagi ma`lumotlarni olish. Bu protseduradan qaytish mos identifikatorli xabar va mos jo`natuvchi jarayon nomeri o`qish uchun mumkin bo`lgandagina amalga oshadi. Bu protsedura xabar kelish faktini aniqlaydi (uni qabul qilmaydi). MPI_PROBE chaqirilgandan keyin MPI_RECV xam shu parametrlar bilan chaqirilsa, u xolda xam MPI_PROBE protsedurasi yordamida olingan xabarlar qabul qilinadi.
Navbatdagi misolda keluvchi xabar strukturasini aniqlash uchun MPI_PROBE protsedurasini qo`llash namoish etilgan. 0 jarayoni 1 va 2 jarayonlarning ixtiyoriy biridan xabar kutadi. Biroq ushbu jarayonlar jo`natadigan xabarlar xar xil toifaga ega. Keluvchi xabarni qaysi o`zgaruvchiga joylashishni aniqlash uchun jarayon avval MPI_PROBEchaqiruvi yordamida xabar kimdan kelganligini aniqlaydi. Bevosita MPI_PROBE dan keyingi MPI_RECV chaqiruvi ishonchli ravishda xabarni qabul qiladi va shundan keyin boshqa jarayondan xabar qabul qilinadi.
Navbatdagi misolda ikkita jarayonni galma-gal xabar almashish modeli ko`rsatiladi. Bunda xabar almashish vaqti xabar uzunligiga bog`liq aniqlanadi. Shu tarzda parallel kompyuterdagi kommunikatsion tarmoqning asosiy xarakteristikasi aniqlanadi. Bular: yashiringanlik (nol uzunlikdagi xabarni almashish vaqti) va maksimal o`tkazuvchanlik qobilyati (bir sekundagi Mbayt miqdorida), hamda xabarning uzunligi, NMAX konstanta uzatiladigan xabarning maksimal uzunligi cheklanishini bildiradi, NTIMES konstantasi esa natijani o`rtachasini aniqlashdagi takrorlanishlar miqdorini bildiradi. Yashirinlikni aniqlash uchun avval nol uzunlikdagi xabar jo`natiladi, keyin xabar uzunligi ikki marta ko`payadi. Bunda jo`natish avval real*8 toifali bitta elementni jo`natishdan boshlanadi.
http://fayllar.org
|
| |