logo

Dasturlarni cmd orqali ishga tushirish usullari.

Yuklangan vaqt:

16.11.2024

Ko'chirishlar soni:

0

Hajmi:

412.9599609375 KB
Mavzu: Dasturlarni cmd orqali ishga tushirish usullari. 
Cmd   buyruqlari.   MPI   kutubxonasining   yaratilish   tarixi.MPI_status   strukturasi.
MPI   umumiy   protseduralari.   MPI   da   xabar   almashish   turlari   va   ular   orasidagi
farqlar. Blokirovkali xabar almashishni real muammolarni yechishga qo llanilishi.ʻ
MPI_Wtick funksiyasi. MPI_Probe funksiyasining muhim holatlarda qo llanilishi.
ʻ
Blokirovkasiz   xabar   almashish   mohiyati   va   uning   qo llanilish
ʻ
sohalari.Blokirovkasiz   xabar   almashish   funksiyalari.   Blokirovkasiz   xabar
almashish   holatini   tekshirish   funksiyalari   va   ularni   amalda   qo llanilishi.
ʻ
Blokirovkali va blokirovkasiz xabar almashish o rtasidagi asosiy farqlar,afzallik va	
ʻ
kamchiliklari.   Jarayonlar   o rtasida   ikki   tomonlama   xabar   almashish   uchun	
ʻ
ishlatiladigan   funksiyalar.   Jarayonlar   o rtasida   jamoaviy   (kollektiv)   xabar	
ʻ
almashish.
Dasturlarni cmd orqali ishlatish buyruqlatri.
CMD (Command Prompt) yoki Terminal, Windows operatsion tizimida dasturlarni
bajarish   va   boshqa   operatsiyalarni   amalga   oshirish   uchun   ishlatiladigan   birinchi
vosita   hisoblanadi.   Quyidagi   qatorlarda,   CMD   orqali   dasturlarni   ishga
tushirishning ba'zi usullarini ko'rsataman:
Dasturning to'liq yo'lini kiriting: CMD oynasini oching va dasturning to'liq yo'lini
kiriting. Masalan:  "C:\contes\cmd3.exe"
Bu   buyruq   dasturni   boshqa   oynada   ochmaydi,   balki   asosiy   CMD   oynasida   ishga
tushiradi.
Buyruq   qatorlarini   yozish:   CMD   da   bir   nechta   buyruqni   biriktirib   bajarish   uchun
buyruq   qatorlari   yozish   mumkin.   Buyruq   qatorlarini   ajratish   uchun   &   belgisidan
foydalaning. 
mpiexec -n 13 C:\contes\cmd3.exe
mpiexec   -n   buyruqi   MPI   (Message   Passing   Interface)   dasturining   ishga
tushirilishini   belgilaydi.   MPI,   masshtablangan   va   kuchli   parallel   dasturlarni
yaratish   va   bajarish   uchun   ishlatiladigan   bir   kommunikatsiya   protokolining
nomidir.   MPI,   paralel   kompyuterlarda   yoki   klastarlarda   parallel   hisoblash   uchun
xizmat qiladi.
mpiexec MPI dasturini ishga tushirish uchun buyruqdir. -n flagi esa MPI dasturida
ishlatilgan   "process"   (jarayon)lar   sonini   belgilaydi.   Bu,   parallel   dastur   bajarish
uchun kerak bo'lgan jarayonlar sonini ifodalaydi. Jarayonlar MPI kommunikatsiya
orqali ma'lumot almashish uchun ishlatiladi. Masalan, agar   mpiexec -n 5   cmd3.exe buyruqi berilsa, bu cmd3.exe dasturini 5 ta
parallel   jarayon   (process)   bilan   ishga   tushiradi.   Har   bir   jarayon   o'zining
o'zgartirilgan ma'lumotlar to'plamini qabul qiladi va ulardan foydalanish uchun bir-
biriga aloqador MPI kutiladi.
-n   flagi   orqali   belgilangan   jarayonlar   soni,   ishlab   chiqarilayotgan   vazifalarning
tashkil etilishi, resurslarni birlashtirish va natijalarni to'plamla olishning usuli bilan
bog'liq   bo'ladi.   Bu   buyruq   MPI   dasturlarini   parallel   ishga   tushirishda   keng
qo'llaniladi.
cmd umumiy buyruqlari haqida ma’lumotlar
CMD   (Command   Prompt)   Windows   operatsion   tizimida   dasturlarni   bajarish   va
sistem   bilan   ishlash   uchun   ishlatiladigan   birlamchi   vositadir.  Quyidagi   qatorlarda
CMD buyruqlari haqida to'liq ma'lumotlarni ko'rsataman:
Cmd ga kirish uchun <pusk>+R
Oyna ichiga cmd yoziladi va  OK  tugmasi bosiladi va kiriladi.
dir : Joriy direktoriyadagi fayl va papkalarni ro'yxatini ko'rsatadi.
cd : Joriy direktoriyani o'zgartiradi.
cd C:\contes\cmd3.exe
mkdir : Yangi papka yaratadi.
del : Faylni o'chiradi
copy : Faylni ko'chiradi yoki ko'chirib yuboradi.
copy SourceFile.txt DestinationFolder\
move: Faylni ko'chiradi yoki o'chiradi. move   SourceFile.txt DestinationFolder\
ren: Fayl nomini o'zgartiradi.
MPI kutubxonasining yaratilish ta’rixi.
MPI   (Message   passing   interface-xabar   uzatish   interfeysi)   turli   xil   tabiatdagi
parallel   hisoblash   tizimlarida   ishlaydigan   ilovalarni   yaratish   va   ishga   tushirish
imkonini   beruvchi   yordamchi   dasturlar   va   kutubxona   funksiyalari   to'plamidir
(C/C++, FORTRAN tillari uchun). 
MPI   1990-yillarda   taqsimlangan   xotira   tizimlari   uchun   yagona   dasturlash
yondashuvi  sifatida   taqdim  etilgan.   MPI  mashhurlik  darajasiga  ko'tarildi   va  hozir
umumiy   xotira   tizimlarida   va   turli   xil   aralash   hisoblash   muhitlarida   keng
qo'llaniladi.  MPI jarayonlar o’rtasida xabar almashish maqsadida qo’llaniladi.
Message   Passing   Interface   (MPI)   -   bir   xil   vazifani   bajaradigan   jarayonlar
o'rtasida   xabar   almashish   imkonini   beruvchi   ma'lumotlarni   uzatish   uchun
dasturlash  interfeysi  (API).   Uilyam  Groupe, Evin Lusk   va boshqalar  tomonidan
ishlab chiqilgan.
MPI   parallel   dasturlashda   eng   keng   tarqalgan   ma'lumotlar   almashinuvi   interfeysi
standarti   bo'lib,   ko'p   sonli   kompyuter   platformalari   uchun   ilovalar   mavjud.   U
klasterlar   va   superkompyuterlar   uchun   dasturlarni   ishlab   chiqishda   foydalaniladi.
MPI-da jarayonlar o'rtasidagi asosiy aloqa vositasi xabarlarni bir-biriga uzatishdir.
Hozirgi vaqtda MPI ning ko'plab bepul va tijorat dasturlari mavjud. 
MPI birinchi navbatda taqsimlangan xotira tizimlariga, ya'ni ma'lumotlarni uzatish
xarajatlari   yuqori   bo'lganda,   OpenMP   esa   umumiy   xotiraga   ega   tizimlarga
(umumiy keshga ega ko'p yadroli) qaratilgan. Klasterdagi ko'p yadroli tizimlardan
optimal foydalanish uchun ikkala texnologiya birgalikda ishlatilishi mumkin.
MPI   kutubxonasiga   tegishli   barcha   funksiyalarning   nomlari,   ma'lumotlar   turlari,
konstantalar   va   hokazolar   MPI_   prefiksi   bilan   boshlanadi   va   mpi.h   sarlavha
faylida   tasvirlanadi.   Barcha   funksiyalar   ( MPI_Wtime   va   MPI_Wtick   bundan
mustasno)   int   qaytish   turiga   ega   va   muvaffaqiyatga   erishilganda   xato   kodi   yoki
MPI_SUCCESS   qaytaradi.   Biroq,   xato   bo'lsa,   uni   chaqirgan   funksiyadan
qaytishdan   oldin,   dasturni   g'ayritabiiy   tarzda   tugatadigan   standart   xato   ishlov
beruvchisi chaqiriladi. Shuning uchun, qaytish qiymatini tekshirish mantiqiy emas.
Standart   xato   ishlov   beruvchini   almashtirish   mumkin   ( MPI_Errandler_set
funksiyasidan   foydalangan   holda),   lekin   MPI   standarti   dastur   xatolikdan   keyin
ishlashni   davom   ettirishiga   kafolat   bermaydi.   Demak,   bu   ham   odatda   mantiqiy
emas.
MPI_status strukturasi MPI_status   struktura   MPI   kutubxonasida   foydalaniladigan   ma'lumotlar
to'plamini   saqlash   uchun   ishlatiladi.   Ushbu   struktura   ma'lumot   almashish
operatsiyalari natijasida olinadigan ma'lumotlarni saqlab turadi.
• Qabul   qilingan   xabarning   atributlarini   status   massivining   elementlaridan
aniqlash mumkin.
• status   parametri   -     MPI_SOURSE   (haqiqiy   xabar   darajasi),   MPI_TAG
(haqiqiy   teg)   va   MPI_ERROR   (xato   kodi)   maydonlari   bilan   oldindan
belgilangan   MPI_Status   turidagi   strukturadir.Qabul   qilish   jarayonining
raqami   aniq   ko'rsatilishi   kerak.Agar   bitta   jarayon   bitta   MPI_Recv   ga   mos
keladigan   ikkita   xabarni   boshqa   jarayonga   yuborsa,   birinchi   xabar   birinchi
bo'lib qabul qilinadi.Agar xabar turli jarayonlar tomonidan yuborilgan bo'lsa,
unda qabul qilish tartibi aniqlanmagan.
• Bir tomondan, biz MPI_Recv ga xabar kutilayotgan vazifaning raqamini va
uning   identifikatorini   ko’rsatamiz;   va   boshqa   tomondan,   biz   ularni   status
strukturasida   MPI   dan   olamizmi?   Buning   sababi,   MPI_Recv   joker
argumentlar   bilan   chaqirilishi   mumkin   ("har   qanday   narsani/har   kimdan
qabul qilish") va bunday ma'lumotlarni qabul qilishdan so'ng, dastur   status
tuzilmasidan   MPI_SOURCE   va   MPI_TAG   maydonlarini   o'qish   orqali
haqiqiy raqam/identifikatorni o'rganadi.
• MPI_ERROR   maydoni   odatda   tekshirilishi   shart   emas   -   MPI   tomonidan
o'rnatilgan   standart   xato   ishlov   beruvchisi   muvaffaqiyatsizlikka   uchragan
taqdirda  MPI_Recv  dan  qaytishdan  oldin dasturning  bajarilishini  to'xtatadi.
Shunday   qilib,   MPI_Recv   dan   qaytgandan   so'ng,   status.MPI_ERROR
maydoni faqat 0 ga teng bo'lishi mumkin (MPI_SUCCESS);
MPI_Status   turida   kiruvchi   xabarning   haqiqiy   uzunligini   yozib   oladigan
maydon mavjud emas. Uzunlikni shunday topish mumkin
MPI_status   strukturasining   ma'lumotlarni   saqlab   turish   uchun   kerakli
maydonlar quyidagilardir:
MPI_SOURCE :   Bu   maydon   ma'lumotni   yuborgan   protsessning
identifikatori (rank) ni saqlaydi.
MPI_TAG :   Ushbu   maydon   almashish   operatsiyasi   orqali   olinayotgan
ma'lumotlarni turi (tag) ni saqlaydi.
MPI_ERROR :   Ushbu   maydon   almashish   operatsiyasi   natijasida   yuzaga
kelgan xatolarni saqlaydi.
MPI_status   strukturasining   foydalanishida   MPI   kutubxonasi   tomonidan
o'rnatilgan   almashish   operatsiyasi   tugagandan   so'ng,   MPI_Status   tipidagi   obyekt yaratiladi   va   ushbu   obyektning   ma'lumotlari   MPI_recv()   yoki   MPI_Wait()   kabi
funktsiyalarga   o'tkaziladi.   MPI_Status   obyekti   dastur   tomonidan  o'zida   saqlangan
ma'lumotlarni o'qish, aniqlash va saqlash uchun foydalaniladi.
MPI   kutubxonasida   MPI_Status   strukturasining   ma'lumotlari   to'g'ridan-
to'g'ri   o'zgartirib   bo'lmaydi.   Ular   faqat   MPI_recv(),   MPI_Wait()   va   hokazo
funktsiyalari   ishlatilganda   yangilanadi.   Boshqacha   bir   ifoda   bilan   aytganda,
MPI_Status   strukturasining   ma'lumotlari,   MPI   kutubxonasi   tomonidan   so'rovga
javob   sifatida   olinadigan   ma'lumotlarni   saqlab   turadigan   o'zgartirilmaydigan
obyekt hisoblanadi.
MPI_status   strukturasining   foydalanilishi   dastur   tomonidan   almashish
operatsiyalari   natijasida   yuborilgan   ma'lumotlarni   aniqlash,   qarshilik   qilish   va
boshqa qo'llanmalarni amalga oshirishda juda kerakli bo'ladi.
MPI protseduralari
MPI   (Mavzu   Prognozlashdirish   Intizomi,   inglizcha   "Message   Passing
Interface")   umumiy   protseduralar,   parallel   kompyuterlarda   dasturlashni
osonlashtirish   va   ma'lumotlarni   almashish   uchun   ishlatiladigan   protseduralar
to'plamidir.   Bu   protseduralar   MPI   kutubxonasi   orqali   yoki   MPI   standartiga
muvofiq boshqa kutubxonalardan foydalanilarak ishga tushiriladi.
Quyidagi eng umumiy MPI protseduralari mavjud:
MPI_Init :   MPI   kutubxonasini   ishlatish   uchun   muhim   tayyorgarliklarni
amalga   oshirish   uchun   ishlatiladi.   Dastur   boshida   yoki   paralel   ishga   tushishdan
oldin chaqirish kerak.
MPI_Finalize :   MPI   protsesslarining   ishini   yakunlash   uchun   ishlatiladi.
Dastur tugagandan so'ng chaqirish kerak.
MPI_Comm_size :   Kommunikatsiya   to'plamidagi   (MPI_COMM_WORLD)
protsesslar sonini olish uchun ishlatiladi.
MPI_Comm_rank :   Kommunikatsiya   to'plamidagi
(MPI_COMM_WORLD) joriy protsessning identifikatorini olish uchun ishlatiladi.
MPI_Send:   Ma'lumotlarni   bir   protsessdan   boshqa   protsessga   yuborish
uchun ishlatiladi.
MPI_Recv : Ma'lumotlarni bir protsessdan qabul qilish uchun ishlatiladi.
• Har bir parallel dasturda umumiy protseduralar zarur.
• intMPI_Init( int* argc, char*** argv). • MPI_Init   -   parallel   qismni   ishga   tushirish   (har   bir   dastur   uchun   haqiqiy
ishga   tushirish   bir   martadan   ko'p   bo'lmaydi,   agar   takrorlansa,   amallar
bajarilmaydi va pastki dastur qaytadi).
• Barcha   MPI   protseduralarini   faqat   MPI_Init   ga   murojat   qilgandan   keyin
chaqirish mumkin.
• Jarayon   agar   muvaffaqiyatli   bo'lsa,   – MPI_SUCCESS,   aks   holda   –   xato
kodini qaytaradi.
• intMPI_Finalize(void)
• MPI_Finalize  - ilovaning parallel qismini tugatilishi.
• Jarayon   MPI_Finalize   ni   chaqirganda,   uning   xabar   almashishda   ishtirok
etishini talab qiladigan barcha amallar bajarilgan bo'lishi kerak.
• MPI_Init kompleks argument turi barcha jarayonlarga asosiy argumentlarni
uzatish uchun taqdim etilgan:
• Int   MPI_Comm_size(   MPI_Comm   comm,   int*   size)   -   comm   guruhidagi
parallel jarayonlarning umumiy sonini aniqlash.
• comm  – guruh identifikatori;
• OUT size  - guruh hajmi.
• Int   MPI_Comm_rank(   MPI_Comm   comm,   int*   rank)   -   comm
guruhidagi jarayon raqamini aniqlash.
• &rankda qaytarilgan qiymat 0 dan  size_of_group-1 gacha bo’ladi . 
• comm - guruh identifikatori;
• OUT rank – comm guruhidagi chaqirilgan jarayon raqami .
• Protsessor   nomini   olish   uchun   MPI_Get_processor_name   funksiyasidan
foydalaniladi.
• int MPI_Get_processor_name( name, resultlen ) 
• char *name; 
• int *resultlen;
• Parametrlar:
• name   -   protsessor   nomi.   Bu   kamida   MPI_MAX_PROCESSOR_NAME
o‘lchamdagi massiv bo‘lishi kerak.  • Name argumenti kamida MPI_MAX_PROCESSOR_NAME belgidan iborat
bo‘lishi   kerak.   MPI_GET_PROCESSOR_NAME   name   ga   ko‘p   belgilar
qo‘shishi   mumkin.  Belgilarning haqiqiy  soni   resultlen     chiqish  parametrida
qaytariladi
MPI da xabar almashish turlari va ular orasidagi farqlar
MPI   (Mavzu   Prognozlashdirish   Intizomi,   inglizcha   "Message   Passing   Interface")
kutubxonasida   xabar   almashishning   bir   nechta   turilari   mavjud.   Bu   turilar   orqali
parallel   kompyuterlar   orasida   ma'lumotlarni   almashish,   tarqatish   va   ko'chirish
amalga   oshiriladi.   Quyidagi   eng   umumiy   xabar   almashish   turlari   MPI
protseduralari orqali amalga oshiriladi:
Point-to-Point Xabar Almashishi:
• MPI   jarayonlari   o'rtasidagi   aloqaning   asosiy   mexanizmi   xabarlarni   uzatish
va qabul qilishdir.
• Xabar o’z ichiga bir nechta malumotlarni oladi:
• • jo‘natuvchi  – xabar jo‘natuvchining darajasi (guruhdagi raqami);
• • oluvchi  – oluvchining darajasi;
• • belgi  - har xil turdagi xabarlarni ajratish uchun ishlatilishi mumkin;
• • kommunikator  – jarayonlar guruhi kodi.
• Yuborish   va   qabul   qilish   operatsiyalari   blokirovka   qiluvchi   yoki
bloklanmaydigan   bo ' lishi   mumkin .   Bloklanmaganmaydigan   operatsiyalar
uchun   tayyorlikni   tekshirish   va   bajarilishini   kutish   funktsiyalari
belgilanadi . Aloqaning   yana   bir   usuli   -   masofaviy   xotiraga   kirish   ,   bu   sizga
masofaviy   jarayonning   xotira   maydonini   o ' qish   va   o ' zgartirish   imkonini
beradi .   Mahalliy   jarayon   masofaviy   jarayonning   xotira   maydoniga
( jarayonlar   tomonidan   ko ' rsatilgan   oyna   ichidagi )  murojat   qilishi   va   aksincha
bo ’ lishi   mumkin ,   shuningdek ,   masofaviy   jarayonga   uzatilgan   ma ' lumotlarni
uning   xotirasida   mavjud   bo ' lgan   ma ' lumotlar   bilan   birlashtirishi   mumkin
( masalan ,     yig ' ish   orqali ).   Xotiraga   masofaviy   kirishning   barcha
operatsiyalari   bloklanmaydi ,   biroq   blokirovka   qiluvchi   sinxronlash
funksiyalari   bajarilishidan   oldin   va   keyin   chaqirilishi   kerak .
• Har   bir   jarayonning   o'ziga   xos   identifikatori   va   ajratilgan   manzil   maydoni
mavjud.
• MPI-da umumiy o'zgaruvchilar yoki ma'lumotlar mavjud emas.
• Jarayonlar   jamoaviy   axborot   almashish   operatsiyalarini   amalga   oshirish
uchun guruhlarni tashkil qilishi mumkin.  • MPI   -   bu   xabarlarni   uzatish   nuqtai   nazaridan   parallel   jarayonlarning
ishlashini qo'llab-quvvatlash uchun mo'ljallangan funktsiyalar kutubxonasi.
• Jarayon   raqami   manfiy   bo'lmagan   butun   son   bo'lib,   har   bir   jarayonning
o'ziga xos atributidir.
• Xabarning   atributlari   jo'natuvchining   jarayon   raqami,   qabul   qiluvchining
jarayon raqami va xabar identifikatoridir.
• Dasturlar   parallel   jarayonlarni   yaratish   va   tugatish   vositalarini   va
ishlaydigan jarayonlarning o'zaro ta'sirini o'z ichiga oladi.
• Jo’natish     jarayonlari   quyidagicha   bo’lishi   mumkin:   Individual   turi   ya’ni
nuqtadan   nuqtaga.Kollektiv   -   operatsiyada   kommunikatorning   barcha
protsessorlari ishtirok etadi.
• Barcha   protseduralar     quyidagi   sinflarga   bo'linadi:   blokirovka   qiluvchi
(sinxronizatsiya bilan) va blokirovkasiz (asinxron) protseduralar.
• Bloklirovkali   xabar   almashish   protseduralari   ishni   to   shart   bajarilgunga
qadar   to'xtatib   turadi.   Asinxrondan   qaytish   aloqa   operatsiyasini   ishga
tushirgandan so'ng darhol sodir bo'ladi.
• Bloklirovkali xabar almashish bilan ehtiyotkorlik bilan foydalanish lozim.
• Asinxron   operatsiyalardan   foydalanish   ma'lumotlar   massivlaridan
ehtiyotkorlik bilan foydalanishni talab qiladi.
• 1. Xabarlar malumotlar blogi – void*
• 2. Xabar ma'lumotlari  quyidagilar.
• (a) ma'lumotlar turi –MPI_Datatype;
• (b) ma'lumotlar soni.
• 3.  Xabarni   qabul   qiluvchi   va   jo ' natuvchi   haqida   ma ' lumot .
• (a)   Komunikator   –   MPI_Comm   tipidagi   jarayonlar   guruhi   identifikatori,
yuqori darajadagi kommunikator – MPI_COMM_WORLD;
• (b)   qabul   qiluvchining   darajasi   -   ko'rsatilgan   kommunikatordagi   qabul
qiluvchi jarayonning raqami;
• (c)   jo'natuvchi   darajasi   -   ko'rsatilgan   kommunikatordagi   jo'natuvchi
jarayonning raqami
• MPI_ANY_SOURCE     orqali   tegishli   kommunikatorda   barcha
jo‘natuvchilardan xabarlar olishingiz mumkin.
• 4. Xabar tegi. int turining ixtiyoriy soni. Siz xabarlarni ma'lum bir teg bilan
qabul   qilishingiz   mumkin,   ixtiyoriy   tegdagi   xabarni   qabul   qilish   uchun     -
MPI_ANY_TAG dan foydalanish mumkin.
• Sinxronizatsiya   bilan   nuqtadan   nuqtaga   xabar   jo’natish   (biri   jo'natuvchi,
ikkinchisi qabul qiluvchi) • intMPI_Send(void* buf, int count, MPI_Datatype datatype, int dest, int
msgtag, MPI_Comm comm)
• buf – xabar yuborish buferining bosh manzili;
• count - xabardagi uzatiladigan elementlar soni;
• datatype  - uzatilgan elementlarning turi;
• dest - qabul qilish jarayonining raqami;
• msgtag - xabar identifikatori;
• comm - bu guruh identifikatori.
• Xabarning barcha elementlari bufer bufida ketma-ket joylashgan.  O'z-o'ziga
xabar yuborishga ruxsat  beriladi, lekin   bu boshi  berk ko'chaga olib kelishi
mumkin.
• int MPI_Recv(void* buf, int count, MPI_Datatype datatype, int source,
int msgtag, MPI_Comm comm, MPI_Status*status)
• OUT buf  – xabarni qabul qiluvchi bufer  manzili;
• count  - qabul qilingan xabardagi elementlarning maksimal soni;
• datatype - qabul qilingan xabar elementlarining turi;
• source  - jo'natuvchi jarayonning raqami;
• msgtag  - qabul qilingan xabarning identifikatori;
• OUT status  – qabul qilingan xabar parametrlari.
• Blokirovkalash   pastki   dastur   qaytgandan   so'ng   xabarning   barcha
elementlari   qabul   qilinishini   va   bufer   bufiga   joylashtirilishini
ta'minlaydi.Agar jarayon boshqa jarayonga ikkita xabar  yuborsa  va ikkala
xabar   ham   bir   xil   MPI_Recv   chaqiruviga   mos   kelsa,   birinchi   yuborilgan
xabar avval qabul qilinadi.
MPI_Send :   Bir   protsessdan   boshqa   bir   protsessga   ma'lumotlarni   yuborish   uchun
ishlatiladi.
MPI_Recv : Bir protsessdan ma'lumotlarni qabul qilish uchun ishlatiladi.
Xabar   almashish   turining   tanlashi   dastur   tomonidan   o'zgartiriladi   va   maqsadga
muvofiq   tanlanadi.   Point-to-Point   xabar   almashishi,   bir   protessdan   boshqa   bir
protessga o'zaro aloqani ta'minlaydi va ma'lumotlarni to'g'ridan-to'g'ri almashishga
imkon beradi. Collective xabar almashishi esa bir protess tomonidan boshqa barcha
protesslarga   ma'lumotlarni   tarqatish,   jamlashish   yoki   bo'lishishga   imkon   beradi.
Synchronization   xabar   almashishi   esa   protesslarni   bitta   nuqtada   to'planish   va
bajarilgan operatsiyalarning natijalarini sinxronizatsiya qilish uchun ishlatiladi.
Turli xabar almashish turlari orasidagi farqlar: Point-to-Point xabar almashishida bir protessdan boshqa bir protessga ma'lumotlar
birga   yuboriladi   va   qabul   qilinadi.   Almashish   amalga   oshirilgach,   yuboruvchi
protess sodda yuborish operatsiyasidan  keyin davom etadi, qabul qiluvchi protess
esa ma'lumotni qabul qilgach, qabul qilish operatsiyasidan keyin davom etadi.
Collective   xabar   almashish   esa   bir   protess   tomonidan   barcha   protesslarga
ma'lumotlarni   tarqatish,   jamlashish   yoki   bo'lishish   amalga   oshiriladi.   Barcha
protesslar  bir  xil  amalni  bajarishadi  va javobni  kutyapmanlik holatida to'laganligi
tekshirilishi mumkin.
Synchronization   xabar   almashish   esa   barcha   protesslarni   bir   joyda   to'planish   va
operatsiyalar bajarilgandan so'ng davom etish uchun ishlatiladi.
MPI   xabar   almashish   turlari   dasturlashda   paralellikni   o'rnatish   va   ma'lumotlarI
apologize, but there seems to be an issue with the text you provided. It appears to
be cut off after "MPI xabar almashish turlari dasturlashda paralellikni o'rnatish va
ma'lumotlar.
Blokirovkali xabar almashishni real muammolarni yechishga qo llanilishiʻ
Bloklirovkali   xabar   almashish   protseduralari   ishni   to   shart   bajarilgunga   qadar
to'xtatib turadi. Asinxrondan qaytish aloqa operatsiyasini ishga tushirgandan so'ng
darhol sodir bo'ladi.
Bloklirovkali xabar almashish bilan ehtiyotkorlik bilan foydalanish lozim.
Asinxron   operatsiyalardan   foydalanish   ma'lumotlar   massivlaridan   ehtiyotkorlik
bilan foydalanishni talab qiladi.
Har bir jarayonning o'ziga xos identifikatori va ajratilgan manzil maydoni mavjud.
MPI-da umumiy o'zgaruvchilar yoki ma'lumotlar mavjud emas.
Jarayonlar   jamoaviy   axborot   almashish   operatsiyalarini   amalga   oshirish   uchun
guruhlarni tashkil qilishi mumkin.  "Blokirovka"   so'zi   umuman   ta'qib   etiladigan   qanday   operatsiyalarni   anglatishi
mumkin. Agar siz xabar almashishni bloklay olmoqchi bo'lsangiz, ko'p tilda xizmat
qiladigan ilovalar yoki xabar almashish bo'yicha platformalardan foydalanishingiz
mumkin.
Masalan,   Android   yoki   iOS   operatsion   tizimli   qurilmangizda,   shaxsiy   xabar
almashishni   bloklash   uchun   maxsus   funktsiyalar   mavjud.   Bunday   ilovalar
o'rnatilgan bo'lsa, siz shaxsiy xabarlarni o'qiymangizga joylashtirishingiz mumkin.
Xabar almashishning sozlamalarini ochib, "bloklash" yoki o'xshash nomli bo'limni
topib, xabar almashishni bloklash mumkin. Boshqa   tizimlarda   ham,   shaxsiy   xabar   almashishni   bloklashga   o'zgartirish
kiritilgan bo'lishi mumkin. Bunday funksiyalarga oid ma'lumotlar operatsion tizim
va uning versiyasiga qarab farqli bo'lishi mumkin.
"Xabar   almashishni   bloklash"   muammolarni   yechish   uchun   bir   necha   usullar
mavjud   bo'lishi   mumkin.   Misol   uchun,   bloklangan   xabar   almashishni   o'chirish,
foydalanuvchilar   ro'yxatini   tekshirish   yoki   eng   ko'p   foydalaniladigan   xabar
almashish   ilovalarini   o'rnatish   mumkin.   Ammo,   bu   usullar   har   bir   platforma,
ilovaga va bloklovchining ma'lumotlariga qarab farq qila olishi mumkin.
Blokirovkali xabar almashish uchun oddiy C++ tilida dastur kodini ko’rib o’tamiz.
#include<iostream>
#include<mpi.h>
using namespace std;
int main(int argc, char **argv){
    int rank;
    int m,n,x,y;
    MPI_Status status;
    MPI_Init(&argc,&argv);
    MPI_Comm_rank(MPI_COMM_WORLD,&rank);
    m=0; n=0;
    if (rank==0){
        m=125;
        MPI_Send(&m,1,MPI_INT,1,12,MPI_COMM_WORLD);
        MPI_Recv(&n,1,MPI_INT,1,15,MPI_COMM_WORLD,&status);
    }
    if (rank==1){
        n=456;
        MPI_Recv(&m,1,MPI_INT,0,12,MPI_COMM_WORLD,&status);
        MPI_Send(&n,1,MPI_INT,0,15,MPI_COMM_WORLD);
    }
    cout<<"proccecor_raqam : "<<rank<<"-> "<<m<<" : "<<n<<endl;
    MPI_Finalize();
} MPI_Wtick funksiyasi
MPI   kutubxonasiga   tegishli   barcha   funksiyalarning   nomlari,   ma'lumotlar   turlari,
konstantalar   va   hokazolar   MPI_   prefiksi   bilan   boshlanadi   va   mpi.h   sarlavha
faylida   tasvirlanadi.   Barcha   funksiyalar   MPI_Wtime   va   MPI_Wtick
funksiyalardan   tashqari   barchasi   int   tipida   qaytish   turiga   ega   va   muvaffaqiyatga
erishilganda   xato   kodi   yoki   MPI_SUCCESS   qaytaradi.   Biroq,   xato   bo'lsa,   uni
chaqirgan   funksiyadan   qaytishdan   oldin,   dasturni   g'ayritabiiy   tarzda   tugatadigan
standart   xato   ishlov   beruvchisi   chaqiriladi.   Shuning   uchun,   qaytish   qiymatini
tekshirish   mantiqiy   emas.   Standart   xato   ishlov   beruvchini   almashtirish   mumkin
( MPI_Errandler_set   funksiyasidan   foydalangan   holda),   lekin   MPI   standarti
dastur   xatolikdan   keyin   ishlashni   davom   ettirishiga   kafolat   bermaydi.   Demak,   bu
ham odatda mantiqiy emas.
MPI_Wtick   MPI   (Message   Passing   Interface)   standartida   ishlatiladigan   bir
funksiya.   Bu   funksiya,   ishlab   chiqarilgan   dastur   boshlanishidan   (yoki   bir   narsani
boshlashdan)   boshlab   o'tgan   vaqtning   chiziqsiz   (tick)   o'tishini   olish   uchun
ishlatiladi.
MPI   dasturlarini   to'plagan   va   ishga   tushirgan   paytida   yoki   dasturning   bir   qismini
boshqarib   turadigan   parallel   dasturlarda,   har   bir   parallel   ishni   qanday   qilib
bajarilayotganligini,   masalan,   har   bir   processorning   qanday   vaqt   harakat
qilayotganligini o'rganish uchun ishlatiladi.
Quyidagi usulda yozilgan bo'lishi mumkin:
double MPI_Wtick(void);
MPI_Wtick funksiyasi  bir double qiymat qaytaradi, va bu qiymat o'tgan vaqtning
"tick" (chiziqsiz o'tish) o'lchovini anglatadi. Natijada olish mumkinki, bu qiymat 0
dan katta vaqtning bir qismi, ya'ni, har bir "tick" o'tishni ifodalovchi son. MPI_Wtick  funksiyasi   ma'lumotlar   tizimida   yoki   MPI   implementatsiyasiga   qarab
farqli bo'lishi mumkin, ammo umumiy xususiyatlari MPI dasturlarida parallel vaqt
o'lchash uchun ishlatiladigan barcha funksiyalardan biri hisoblanadi.
Dastur kodi :
#include<iostream>
#include  "mpi.h"
#include<math.h>
using namespace std;
int main(int argc,char *argv[]){
    int x=1,y=2,z=3,M,len;
    int rank;
    float a1,a2,a3,b1,b2,b3,c1,c2;
    MPI_Status status;
    MPI_Init(&argc,&argv);
    MPI_Comm_rank(MPI_COMM_WORLD,&rank);
    if(rank==0){
        a1=MPI_Wtick();
        x=pow(x,5);
        MPI_Send(&x,1,MPI_INT,4,5,MPI_COMM_WORLD);
        a2=MPI_Wtick()-a1;
    }
    if(rank==1){
        a3=MPI_Wtick();
        y=pow(y,5);
        MPI_Send(&y,1,MPI_INT,4,5,MPI_COMM_WORLD);
        b1=MPI_Wtick()-a3;
    }
    if(rank==2){
        b2=MPI_Wtick();
        z=pow(z,5);
        MPI_Send(&z,1,MPI_INT,4,5,MPI_COMM_WORLD);
        b3=MPI_Wtick()-b2;
    }
    if(rank==4){         c1=MPI_Wtick();
          MPI_Recv(&M,1,MPI_INT,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_CO
MM_WORLD,&status);
        c2=MPI_Wtick()-c1;
    }
        cout<<"protsessor   :   "<<rank<<"   :   "<<"   0-jarayon_vaqt   :   "<<a2<<"   1-
jarayon_vaqt   :   "<<b1<<"   2-jarayon_vaqt   :   "<<b3<<"   4-jarayon_vaqt   :
"<<c2<<endl;
        MPI_Finalize();
}
Dastur natijasi :
MPI_Probe funksiyasining muhim holatlarda qo llanilishi.ʻ
• int   MPI_Probe (   int   source,   int   msgtag,   MPI_Comm   comm,   MPI_Status
*status)
• source - jo'natuvchi jarayonining raqami yoki MPI_ANY_SOURCE
• msgtag - kutilayotgan xabarning identifikatori yoki MPI_ANY_TAG
• comm - guruh identifikatori 
• OUT status - aniqlangan xabarning parametrlari
Kutilayotgan   blokirovkali   xabarining   tuzilishi   haqida   ma'lumot   olish.   Jo’natuvchi
tomonidan   qabul   qilish   uchun   mos   identifikator   va   jarayon   raqamidagi   xabar
mavjud   bo’lmaguncha,   pastki   dastur   qaytmaydi.   Mavjud   xabar   atributlari   odatiy
tarzda   "status"   parametri   bilan   aniqlash   mumkin.   Shuni   ta'kidlash   kerakki,   pastki
dastur   faqat   xabarning   kelishi   faktini   aniqlaydi,   lekin   aslida   uni   qabul   qilmaydi.
MPI   standarti   MPI_Probe-dan   keyingi   MPI_Recv   chaqiruvi   bir   xil   parametrlarga
ega   (yuboruvchi   raqami,   xabar   identifikatori   va   kommunikator)   MPI_Probe
funksiyasi   tomonidan   qabul   qilingan   xabarni   foydalanuvchi   buferiga   aynan
joylashtirishini kafolatlaydi. MPI_Probe ikki holatda kerak bo'ladi: 2) Qabul qiluvchining vazifasi har xil turdagi va turli jo'natuvchilardan xabarlarni
to'plaganida.   MPI_Probesiz,   foydalanuvchi   buferiga   xabarlarni   olish   tartibi
kompilyatsiya vaqtida o'rnatilishi kerak:
MPI_Probe   bu   dasturda   xabar   kelayotganligi   yoki   kelmayotganligi   haqida   xabar
beradi .MPI_Probe dan asosan ikkita holatlarda foydalanishimiz mumkin .
Dastur kodi MPI_Probdan foydalanishning 1 – usuli :
#include<iostream>
#include  "mpi.h"
using namespace std;
int main(int argc,char *argv[]){
    int a,b,a1,b1,size;
    int rank;
    MPI_Status status;
    MPI_Init(&argc,&argv);
    MPI_Comm_rank(MPI_COMM_WORLD,&rank);
    if(rank==1){
        a=100;
        MPI_Send(&a,1,MPI_INT,3,4,MPI_COMM_WORLD);
    }
    if(rank==2){
        b=200;
        MPI_Send(&b,1,MPI_INT,3,4,MPI_COMM_WORLD);
    }
    if(rank==3){
    MPI_Probe(MPI_ANY_SOURCE,4,MPI_COMM_WORLD,&status);
        if(status.MPI_SOURCE==1){
            MPI_Recv(&a1,1,MPI_INT,1,4,MPI_COMM_WORLD,&status);
            MPI_Recv(&b1,1,MPI_INT,2,4,MPI_COMM_WORLD,&status);
        }
        else {
            if(status.MPI_SOURCE==2){
                MPI_Recv(&b1,1,MPI_INT,2,4,MPI_COMM_WORLD,&status);
                MPI_Recv(&a1,1,MPI_INT,1,4,MPI_COMM_WORLD,&status);
            }
        }     cout<<"procces  "<<rank<<"  a1 = "<<a1<<" b1 = "<<b1<<endl;
    }
    MPI_Finalize();
}
Dastur kodi MPI_Probdan foydalanish 2 – usul:
#include<iostream>
#include  <mpi.h>
using namespace std;
int main(int argc,char *argv[]){
    int a[5],b[5],SIZE;
    int rank;
    MPI_Status status;
    MPI_Init(&argc,&argv);
    MPI_Comm_rank(MPI_COMM_WORLD,&rank);
    if(rank==1){
    for(int i=0;i<5;i++){
        a[i]=i*10;
    }
    MPI_Send(&a,5,MPI_INT,3,4,MPI_COMM_WORLD);
    }
    if(rank==2){
    for(int i=0;i<5;i++){
        b[i]=i*5;
    }
    MPI_Send(&b,5,MPI_INT,3,4,MPI_COMM_WORLD);
    }     if(rank==3){
        MPI_Probe(MPI_ANY_SOURCE,4,MPI_COMM_WORLD,&status);
        MPI_Get_count(&status,MPI_INT,&SIZE);
        int a1[SIZE],b1[SIZE];
        if(status.MPI_SOURCE==1){
            MPI_Recv(&a1,SIZE,MPI_INT,1,4,MPI_COMM_WORLD,&status);
            MPI_Recv(&b1,SIZE,MPI_INT,2,4,MPI_COMM_WORLD,&status);
        }
        else {
            if(status.MPI_SOURCE==2){
                MPI_Recv(&b1,SIZE,MPI_INT,2,4,MPI_COMM_WORLD,&status);
                MPI_Recv(&a1,SIZE,MPI_INT,1,4,MPI_COMM_WORLD,&status);
            }
        }
        cout<<"Protsessor : "<<rank<<endl;
        for(int i=0;i<SIZE;i++){
            cout<<"a1 -> : "<<i+1<<" = "<<a1[i]<<endl;
            cout<<"b1 -> : "<<i+1<<" = "<<b1[i]<<endl;
            }
        }
    MPI_Finalize();
}
Blokirovkasiz xabar almashish mohiyati va uning qo llanilish sohalariʻ
• Asinxron ma'lumotlarni uzatish.
• Jarayonlarni to'xtatmasdan, qo'ng'iroqdan keyin darhol qaytadi. • Asinxron   almashinuvni   yakunlash   uchun   buferdan   foydalanish   maqsadida
qo'shimcha protseduralar talab qilinadi.
• Bloklanmagan   operatsiya   tugagunga   qadar   siz   foydalanilgan   ma'lumotlar
qatoriga boshqa malumot yoza olmaysiz.
Blokirovkasiz xabar jo’natish va qabul qilsish.
• Int MPI_Isend(void*buf, int count, MPI_Datatype datatype, int dest, int
msgtag, MPI_Comm comm, MPI_Request*request)
• request :   asinxron   xabar   uzatish   identifikatori(komunikatsiya   jarayonini
identifikatsiyalaydi( OUT ))
• Jo’natish   MPI_Send   ga   o'xshaydi,   lekin   bufer   bufidagi   butun   xabarning
qayta   ishlanishini   kutmasdan,   uzatish   jarayoni   ishga   tushirilgandan   so'ng
darhol   pastki   dasturdan   qaytadi.   Jo‘natishni   yakunlanganligi   haqida
qo‘shimcha ma’lumot olmasdan turib, buferdan qayta foydalanib bo’lmaydi. • Int MPI_Irecv(void*buf, int count, MPI_Datatype datatype, int source,
int msgtag, MPI_Comm comm, MPI_Request*request)
• request :   asinxron   xabarni   qabul   qilish   identifikatori((komunikatsiya
jarayonini identifikatsiyalaydi( OUT ))
•  Xabarni qabul qilish MPI_Recv ga o'xshaydi, lekin pastki dasturdan qaytish
bufer   bufida   xabar   qabul   qilinishini   kutmasdan,   qabul   qilish   jarayoni   ishga
tushirilgandan so'ng darhol sodir bo'ladi. Qabul qilish jarayonining tugashini
request   parametri   va   MPI_Wait   va   MPI_Test   protseduralari   yordamida
aniqlash mumkin.
. Bloklanmaganmaydigan operatsiyalar uchun tayyorlikni tekshirish va bajarilishini
kutish   funktsiyalari   belgilanadi.Aloqaning   yana   bir   usuli   -   masofaviy   xotiraga
kirish   ,   bu   sizga   masofaviy   jarayonning   xotira   maydonini   o'qish   va   o'zgartirish
imkonini   beradi.   Mahalliy   jarayon   masofaviy   jarayonning   xotira   maydoniga
(jarayonlar   tomonidan   ko'rsatilgan   oyna   ichidagi)   murojat   qilishi   va   aksincha
bo’lishi mumkin, shuningdek, masofaviy jarayonga uzatilgan ma'lumotlarni uning
xotirasida   mavjud   bo'lgan   ma'lumotlar   bilan   birlashtirishi   mumkin   (masalan,
yig'ish orqali). Xotiraga masofaviy kirishning barcha operatsiyalari bloklanmaydi,
biroq   blokirovka   qiluvchi   sinxronlash   funksiyalari   bajarilishidan   oldin   va   keyin
chaqirilishi kerak.
Blokirovkasiz xabar almashish funksiyalari.
• Argumentlar:
• request  : aloqa jarayonini identifikatsiyalash(INOUT)
• status  : aloqa jarayoni (xabar) holati (OUT)
• count  : aloqa hodisalari soni (IN)
• index  : tugallangan hodisalar massivi elementi indeksi (OUT)
• incount  : aloqa hodisalari soni (IN)
• outcount  : tugallangan holatlar soni (OUT)
• int MPI_Wait (MPI_Request *request, MPI_Status *status)
• int   MPI_Waitall   (int   count,   MPI_Request   *array_of_requests,   MPI_Status
*array_of_statuses)
• int   MPI_Waitany   (int   count,   MPI_Request   *array_of_requests,   int   *index,
MPI_Status *status)
• int   MPI_Waitsome   (int   incount,   MPI_Request   *array_of_requests,   int
*outcount, int* array_of_indices, MPI_Status *array_of_statuses)
• Argumentlar: • request  : aloqa jarayonini identifikatsiyalash(INOUT)
• flag : agar aloqa hodisasi tugallangan bo’lsa TRUE ( OUT )
• status  : aloqa jarayoni (xabar) holati (OUT)
• count  : aloqa hodisalari soni (IN)
• index  : tugallangan hodisalar massivi elementi indeksi (OUT)
• incount  : aloqa hodisalari soni (IN)
• outcount  : tugallangan holatlar soni (OUT)
• int MPI_Test (MPI_Request *request, int *flag, MPI_Status *status)
• int   MPI_Testall   (int   count,   MPI_Request   *array_of_requests,   int   *flag,
MPI_Status *array_of_statuses)
• int   MPI_Testany   (int   count,   MPI_Request   *array_of_requests,   int   *index,
int *flag, MPI_Status *status)
• int   MPI_Testsome   (int   incount,   MPI_Request   *array_of_requests,   int
*outcount, int* array_of_indices, MPI_Status *array_of_statuses)
• Int MPI_Test( MPI_Request*request, int*flag, MPI_Status*status)
• request - asinxron yuborish yoki qabul qilishning identifikatori;
• OUT   flag   -   xabar   almashish   operatsiyasining   tugallanganligi   belgisi(agar
aloqa hodisasi tugallangan bo’lsa TRUE ( OUT ));
• OUT  status  – xabar parametrlari(aloqa hodisasi holati).
• MPI_Isend   yoki   MPI_Irecv   asinxron   protseduralarining   bajarilishini
tekshirish,   request     identifikatori   bilan   bog'liq   .   Agar   tegishli   operatsiya
bajarilgan bo'lsa,  f lag  parametri 1 ga, aks holda 0 ga teng. Agar qabul qilish
protsedurasi tugallangan bo'lsa, u holda qabul qilingan xabarning atributlari
va uzunligi  status  parametri yordamida aniqlanishi mumkin.
• Int   MPI_Iprobe(   int   source,   int   msgtag,   MPI_Comm   comm,   int*flag,
MPI_Status*status)
• source  - jo'natuvchi jarayonning raqami yoki MPI_ANY_SOURCE;
• msgtag  - kutilayotgan xabarning identifikatori yoki MPI_ANY_TAG;
• OUTstatus - aniqlangan xabarning parametrlari.
• Blokirovkasiz   xabar     stukturasi   va   qabul   qilinganligi   haqidagi   ma’lumotlar
status   masivida   joylashadi.   Agar   tegishli   atributlarga   ega   bo'lgan   xabar
allaqachon qabul qilinishi mumkin bo'lsa,  flag  parametri 1 bo’ladi (bu holda
uning   ta'siri   MPI_Probe   bilan   bir   xil   bo'ladi),   agar   ko'rsatilgan   atributlarga
ega xabar hali bo'lmasa,  flag  0 qiymat qabul qiladi.
• int MPI_Wait( MPI_Request*request, MPI_Status*status) • request –asinxron xabar yuborish yoki qabul qilishning identifikatori;
• OUT status –xabar parametrlari(aloqa hodisasi holati).
• MPI_Isend   yoki     MPI_Irecv     assinxron   protseduralarining   tugashini   kutish
request   identifikatori bilan bog’liq. Qabul qilingan xabarning atributlari va
uzunligi status parametri yordamida aniqlanishi mumkin.
• int   MPI_Waitall(   int   count,   MPI_Request*requests,
MPI_Status*statuses)
• requests –asinxron xabar qabul qilish yoki jo'natish identifikatorlar massivi;
• OUT statuses  –xabar parametrlari.
• Belgilangan   identifikatorlar   bilan   bog'liq   barcha   almashinuv   operatsiyalari
tugamaguncha   jarayonning   bajarilishi   bloklanadi.   Agar   bir   yoki   bir   nechta
almashinuv   operatsiyalari   paytida   xatolar   yuzaga   kelsa,   u   holda   statuslar
massivining elementlaridagi xato maydoni tegishli qiymatga o'rnatiladi.
• int   MPI_Waitany(   int   count,   MPI_Request*requests,   int*index,
MPI_Status*status)
• OUT index  – yakunlangan almashuv operatsiyalari soni;
• OUT status  - xabar parametrlari.
• Jarayonning bajarilishi  belgilangan identifikatorlar  bilan bog'liq har qanday
almashinuv   operatsiyasi   tugaguniga   qadar   bloklanadi.   Agar   bir   nechta
operatsiyalar   mavjud   bo'lsa,   ulardan   biri   tasodifiy   tanlanadi.   Indeks
parametri   requests   massividagi   tugallangan   operatsiyalar   identifikatorlarini
o'z ichiga olgan elementning raqamini o'z ichiga oladi.
• int   MPI_Waitsome(   int   incount,   MPI_Request*requests,   int*outcount,
int*indexes, MPI_Status*statuses)
• incount  - identifikatorlar soni;
• OUT   outcount   -   yakunlangan   ayirboshlash   operatsiyalari   identifikatorlari
soni;
• OUT indexes  – yakunlangan ayirboshlash operatsiyalari raqamlari massivi;
• OUT statuses  - tugallangan xabarlar parametrlari.
• Jarayonlar   bajarilishi   belgilangan   identifikatordagi   xabar   almashish
operatsiyalaridan biri yakunlanmaguncha bloklanib turadi . 
• intMPI_Testall(   intcount,   MPI_Request*requests,   int*flag,
MPI_Status*statuses)
• requests   - asinxron xabar qabul qilish yoki jo'natish identifikatorlari massivi; • OUT   flag   -   ayirboshlash   operatsiyalarining   tugallanganligi
belgisiagar )aloqa hodisasi tugallangan bo’lsa TRUE ( OUT ));
• OUT statuses  - xabar parametrlari;
• Belgilangan   identifikatorlar   bilan   bog'liq   barcha   operatsiyalar   bajarilgan
bo'lsa   (statuslar   massividagi   xabar   parametrlarini   ko'rsatgan   holda)   flag
parametrida   1   qiymatini   qaytaradi.   Aks   holda,   0   qaytariladi   va   statuslar
massivining elementlari aniqlanmagan.
• intMPI_Testany(int   count,   MPI_Request*requests,   int*index,   int*flag,
MPI_Status*status)
• OUT index  - tugallangan almashinuv operatsiyalari soni
• OUT status  - xabar parametrlari
• Agar pastki dastur chaqirilganda, xabar almashish operatsiyalaridan kamida
bittasi   tugallangan   bo'lsa,   u   holda   flag   parametrida   1   qiymati   qaytariladi,
indeks   requests  massividagi mos keladigan elementning raqamini o'z ichiga
oladi , status  esa xabar parametrlari hisoblanadi. .
• intMPI_Testsome(   int   incount,   MPI_Request*requests,   int*outcount,
int*indexes, MPI_Status*statuses)
• incount  - identifikatorlar soni
• OUT   outcount   -   yakunlangan   ayirboshlash   operatsiyalari   identifikatorlari
soni
• OUT indexes  - yakunlangan almashinuv operatsiyalari raqamlari massivi
• OUT statuses  - tugallangan operatsiyalar parametrlari
• Quyidastur MPI_Waitsome kabi ishlaydi, ammo qaytish darhol bo'ladi. Agar
ko'rsatilgan   operatsiyalarning   hech   biri   bajarilmagan   bo'lsa,   u   holda
outcount  qiymati nolga teng.
Blokirovkasiz   xabar   almashish   holatini   tekshirish   funksiyalari   va   ularni
amalda qo llanilishiʻ
Blokirovkasiz xabar almashishning MPI_Test funksiyasi dastur kodi va natijasi .
#include<iostream>
#include<mpi.h>
using namespace std;
int main(int argc,char *argv[]){
    int rank , a , b , flag ;
    MPI_Request reqs1,reqs;
    MPI_Status status;     MPI_Init(&argc,&argv);
    MPI_Comm_rank(MPI_COMM_WORLD,&rank);
    a = 0 ;
    b = 0 ;
    if(rank == 0){
        a = 2806;
        b = 2005;
        MPI_Isend(&a,1,MPI_INT,1,10,MPI_COMM_WORLD,&reqs1);
        MPI_Isend(&b,1,MPI_INT,1,15,MPI_COMM_WORLD,&reqs1);
    }
    if(rank == 1){
        MPI_Irecv(&a,1,MPI_INT,0,10,MPI_COMM_WORLD,&reqs1);
        MPI_Test(&reqs1,&flag,&status);
        cout<<"Flag = "<<flag<<endl;
        MPI_Irecv(&b,1,MPI_INT,0,15,MPI_COMM_WORLD,&reqs1);
        MPI_Test(&reqs1,&flag,&status);
        cout<<"Flag = "<<flag<<endl;
        MPI_Wait(&reqs1,&status);
        MPI_Test(&reqs1,&flag,&status);
        cout<<"Flag = "<<flag<<endl;
    }
    cout<<"Prossesor : "<<rank<<" a = "<<a<<" b = "<<b<<endl;
    MPI_Finalize();
    return 0;
} Blokirovkasiz xabar almashishning MPI_Testall funksiyasi dastur kodi va natijasi
#include<iostream>
#include<mpi.h>
using namespace std;
int main(int argc, char *argv[]){
    int rank,flag;
    float a,b,c;
    MPI_Request reqs[3];
    MPI_Status status[3];
    MPI_Init(&argc,&argv);
    MPI_Comm_rank(MPI_COMM_WORLD,&rank);
    a = 0.0 ;
    b = 0.0 ;
    c = 0.0 ;
    if(rank == 0){
        a = 28.06;
        b = 20.05;
        c = 20.23 ;
        MPI_Isend(&a,1,MPI_FLOAT,1,5,MPI_COMM_WORLD,&reqs[0]);
        MPI_Isend(&b,1,MPI_FLOAT,1,6,MPI_COMM_WORLD,&reqs[1]);
        MPI_Isend(&c,1,MPI_FLOAT,1,7,MPI_COMM_WORLD,&reqs[2]);
    }
    if(rank==1){
        MPI_Irecv(&a,1,MPI_FLOAT,0,5,MPI_COMM_WORLD,&reqs[0]);
        MPI_Irecv(&b,1,MPI_FLOAT,0,6,MPI_COMM_WORLD,&reqs[1]);         MPI_Irecv(&c,1,MPI_FLOAT,0,17,MPI_COMM_WORLD,&reqs[2]);
//        MPI_Waitall(2,reqs,status);
        MPI_Wait(&reqs[0],&status[0]);
        MPI_Wait(&reqs[1],&status[1]);
        MPI_Testall(2,reqs,&flag,status);
        cout<<"Flag = "<<flag<<endl;
    }
        cout<<"Jarayon_raqam   "<<rank<<"   a   =   "<<a<<"   b   =   "<<   b   <<"   c   =
"<<c<<endl;
    MPI_Finalize();
    return 0;
}
Blokirovkasiz xabar almashishning MPI_Testany funksiyasi dastur kodi va natijasi
#include<iostream>
#include<mpi.h>
using namespace std;
int main(int argc, char *argv[]){
    int rank,index,flag;
    int a;
    double b;
    float c;
    MPI_Request reqs[3];
    MPI_Status status;
    MPI_Init(&argc,&argv);
    MPI_Comm_rank(MPI_COMM_WORLD,&rank);     a=0;
    b=0.0;
    c=0.0;
    if(rank==0){
        a = 2806;
        b = 20.05;
        c = 20.23;
        MPI_Isend(&a,1,MPI_INT,1,5,MPI_COMM_WORLD,&reqs[0]);
        MPI_Isend(&b,1,MPI_DOUBLE,1,6,MPI_COMM_WORLD,&reqs[1]);
        MPI_Isend(&c,1,MPI_FLOAT,1,7,MPI_COMM_WORLD,&reqs[2]);
    }
    if(rank==1){
        MPI_Irecv(&a,1,MPI_INT,0,5,MPI_COMM_WORLD,&reqs[0]);
        MPI_Irecv(&b,1,MPI_DOUBLE,0,16,MPI_COMM_WORLD,&reqs[1]);
        MPI_Irecv(&c,1,MPI_FLOAT,0,7,MPI_COMM_WORLD,&reqs[2]);
        MPI_Waitany(1,reqs,&index,&status);
        MPI_Testany(3,reqs,&index,&flag,&status);
        cout<<"index = "<<index<<" flag : "<<flag<<endl;
    }
    cout<<"jarayon : "<<rank<<" a = "<<a <<" b = "<<b<<" c = "<<c<<endl;
    MPI_Finalize();
    return 0;
} Blokirovkasiz   xabar   almashishning   MPI_Testsome   funksiyasi   dastur   kodi   va
natijasi
#include<iostream>
#include<mpi.h>
using namespace std;
int main(int argc, char *argv[]){
    int rank,index[3],flag ,outcount;
    int a;
    double b;
    float c;
    MPI_Request reqs[3];
    MPI_Status status;
    MPI_Init(&argc,&argv);
    MPI_Comm_rank(MPI_COMM_WORLD,&rank);
    a=0;
    b=0.0;
    c=0.0;
    if(rank==0){
        a = 2806;
        b = 20.05;
        c = 20.23;
        MPI_Isend(&a,1,MPI_INT,1,5,MPI_COMM_WORLD,&reqs[0]);
        MPI_Isend(&b,1,MPI_DOUBLE,1,6,MPI_COMM_WORLD,&reqs[1]);
        MPI_Isend(&c,1,MPI_FLOAT,1,7,MPI_COMM_WORLD,&reqs[2]);
    }
    if(rank==1){
        MPI_Irecv(&a,1,MPI_INT,0,5,MPI_COMM_WORLD,&reqs[1]);
        MPI_Irecv(&b,1,MPI_DOUBLE,0,6,MPI_COMM_WORLD,&reqs[2]);
        MPI_Irecv(&c,1,MPI_FLOAT,0,7,MPI_COMM_WORLD,&reqs[0]);
        MPI_Waitsome(3,reqs,&outcount,index,&status);
        MPI_Testsome(3,reqs,&outcount,index,&status);
        for (int i = 0 ; i<outcount; i++){
                cout<<"index = "<<index[i]<<" outcount : "<<outcount<<endl;
        }
    }     cout<<"jarayon : "<<rank<<" a = "<<a <<" b = "<<b<<" c = "<<c<<endl;
    MPI_Finalize();
    return 0;
}
Blokirovkali   va   blokirovkasiz   xabar   almashish   o rtasidagi   asosiyʻ
farqlar,afzallik va kamchiliklari .
Bloklirovkali   xabar   almashish   protseduralari   ishni   to   shart   bajarilgunga   qadar
to'xtatib turadi. Asinxrondan qaytish aloqa operatsiyasini ishga tushirgandan so'ng
darhol sodir bo'ladi.
Bloklirovkali xabar almashish bilan ehtiyotkorlik bilan foydalanish lozim.
Asinxron   operatsiyalardan   foydalanish   ma'lumotlar   massivlaridan   ehtiyotkorlik
bilan foydalanishni talab qiladi.
Yuborish   va   qabul   qilish   operatsiyalari   blokirovka   qiluvchi(sinxron)   yoki
bloklanmaydigan(assinxron)   bo'lishi   mumkin.   Bloklanmaganmaydigan
operatsiyalar   uchun   tayyorlikni   tekshirish   va   bajarilishini   kutish   funktsiyalari
belgilanadi.Aloqaning   yana   bir   usuli   -   masofaviy   xotiraga   kirish   ,   bu   sizga
masofaviy   jarayonning   xotira   maydonini   o'qish   va   o'zgartirish   imkonini   beradi.
Mahalliy jarayon masofaviy jarayonning xotira maydoniga (jarayonlar  tomonidan
ko'rsatilgan   oyna   ichidagi)   murojat   qilishi   va   aksincha   bo’lishi   mumkin,
shuningdek, masofaviy jarayonga uzatilgan ma'lumotlarni uning xotirasida mavjud
bo'lgan ma'lumotlar bilan birlashtirishi mumkin (masalan,  yig'ish orqali). Xotiraga
masofaviy   kirishning   barcha   operatsiyalari   bloklanmaydi,   biroq   blokirovka
qiluvchi sinxronlash funksiyalari bajarilishidan oldin va keyin chaqirilishi kerak.
Asinxron ma'lumotlarni uzatish. Jarayonlarni to'xtatmasdan, qo'ng'iroqdan keyin darhol qaytadi.
Asinxron   almashinuvni   yakunlash   uchun   buferdan   foydalanish   maqsadida
qo'shimcha protseduralar talab qilinadi.
Bloklanmagan operatsiya tugagunga qadar siz foydalanilgan ma'lumotlar  qatoriga
boshqa malumot yoza olmaysiz.
Jarayonlar   o rtasida   ikki   tomonlama   xabar   almashish   uchun   ishlatiladiganʻ
funksiyalar.
MPI_Sendrecv funksiyasi
Bu funksiya Send/Recv  ga qo'ng'iroq qilishda blokirovkalar paydo bo'lishining
oldini oladi
Agar   funksiya   muvaffaqiyatli   bajarilsa   MPI_SUCCESS   (0   qiymat)   qaytaradi.
Aks holda, qaytariladigan qiymat xato kodi hisoblanadi.
int   MPI_Sendrecv   (const   void   *sendbuf,   int   sendcount,   MPI_Datatype
sendtype,   int   dest,   int   sendtag,   void   *recvbuf,   int   recvcount,   MPI_Datatype
recvtype, int source, int recvtag, MPI_Comm comm, MPI_Status *status)  sendbuf   [in]
Yuborilayotgan ma’lumot manzili.
sendcount
Yuboriladigan ma’lumotlar soni.
sendtype
Yuborilayotgan ma’lumot turi
Dest
Qabul qiluvchi jarayon raqami
sendtag
Jo’natiluvchi xabar identifikatori
recvbuf   [out]
Ma’lumot qabul qilish uchun bufer manzili.
recvcount
Qabul qilinayotgan ma’lumotlar soni
recvtype
Qabul qilinayotgan ma’lumot turi
source
Xabar jo’natuvchi jarayon raqami
recvtag
Qabul qilinayotgan xabar identifikatori
Comm
Kommunikator nomi
status   [out]
Qabul qilinayotgan xabar haqidagi ma’lumotlarni saqlovchi tuzilma.
MPI_Sendrecv()  funksiyasi 
#include<iostream>
#include<mpi.h>
using namespace std;
int main(int argc,char**argv){
    int rank;
    MPI_Status status;
    MPI_Init(&argc,&argv);
    MPI_Comm_rank(MPI_COMM_WORLD,&rank);
    int a;
    int b ;     a = 0;
    b = 0;
    if (rank==1){
        a = 18;
//        MPI_Send(&a,1,MPI_INT,2,3,MPI_COMM_WORLD);
//        MPI_Recv(&b,1,MPI_FLOAT,2,4,MPI_COMM_WORLD,&status);
         MPI_Sendrecv(&a,1,MPI_INT,2,3,&b,1,MPI_INT,2,4,MPI_COMM_WO
RLD,MPI_STATUSES_IGNORE);
    }
    if (rank==2){
        b = 2005;
//        MPI_Send(&b,1,MPI_FLOAT,1,4,MPI_COMM_WORLD);
//                 MPI_Recv(&a,1,MPI_INT,1,3,MPI_COMM_WORLD,&status);
MPI_Sendrecv(&b,1,MPI_INT,1,4,&a,1,MPI_INT,1,3,MPI_COMM_WORLD,
MPI_STATUSES_IGNORE);
    }
    cout<<"processor : "<<rank<<" a = "<<a<<" b = "<<b<<endl;
    MPI_Finalize();
}
MPI_Sendrecv_replace funksiyasi
MPI_Sendrecv funksiyasi yuborish va qabul qilish operatsiyalarini birlashtiradi.
Ikkala   operatsiya   ham   bir   xil   kommunikatordan   foydalanadi,   ammo   xabar
identifikatorlari   farq   qilishi   mumkin.   Yuborilgan   ma'lumotlarni   qabul   qilingan
ma'lumotlar   bilan   almashtirish   bilan   bir   xil   turdagi   ma'lumotlarni   almashish
zarur   bo'lgan   hollarda,   MPI_Sendrecv_replace   funksiyasidan   foydalanish
qulay. 
MPI_Sendrecv_replace   funksiyasi   jo’natilayotgan   ma’lumotlar   uchun   ham
qabul qilinayotgan ma’lumotlar uchun ham bitta xotira buferidan foydalaniladi.
int   MPI_Sendrecv_replace   (_Inout_   void   *buf,   int   count,   MPI_Datatype
datatype,   int   dest,   int   sendtag,   int   source,   int   recvtag,   MPI_Comm   comm,
_Out_   MPI_Status *status  );
Buf
Jo’natiluvchi va qabul qilinuvchi ma’lumot  uchun xotira manzili.
count
Elementlar soni datatype
Xabar almashinuvidagi ma’lumotlar soni.
Dest
Xabarni qabul qiluvchi jarayon manzili.
sendtag
Jo’natiluvchi xabar identifikatori.
source
Xabar jo’natuvchi jarayon raqami.
recvtag
qabul qilinuvchi xabar identifikatori.
Comm
Kommunikator nomi.
status   [out]
Qabul qilinayotgan xabar haqidagi ma’lumotlarni saqlovchi tuzilma.
Agar   xabar   uzatish   va   qabul   qilish   muvofaqqiyatli   amalga   oshirilsa   ,   funksiya
MPI_SUCCESS   (0 qiymat) qaytaradi aks holda xatolik kodini.
#include<iostream>
#include<string>
#include<mpi.h>
using namespace std;
int main(int argc,char**argv){
    string send;
    int rank ;
    MPI_Init(&argc,&argv);
    MPI_Comm_rank(MPI_COMM_WORLD,&rank);
    if (rank==5){
        send = "w";
               MPI_Sendrecv_replace(&send,1,MPI_CHAR,7,12,7,13,MPI_COMM_WOR
LD,MPI_STATUS_IGNORE);
        cout<<"jarayon_raqam : "<<rank<<" Qiymat = "<<send<<endl;
    }
    if (rank==7){
        send = "t";
               MPI_Sendrecv_replace(&send,1,MPI_CHAR,5,13,5,12,MPI_COMM_WOR
LD,MPI_STATUS_IGNORE);         cout<<"jarayon_raqam : "<<rank<<" Qiymat = "<<send<<endl;
    }
    MPI_Finalize();
}
Jarayonlar o rtasida jamoaviy (kollektiv) xabar almashish.ʻ
MPI-dagi   asosiy   operatsiya   bu   xabarlarni   uzatishdir.   MPI   da   quyidagicha   xabar
almashish turlari mavjud: nuqtadan nuqtaga va jamoaviy.
Dasturlar   parallel   jarayonlarni   yaratish   va   tugatish   vositalarini   va   ishlaydigan
jarayonlarning o'zaro ta'sirini o'z ichiga oladi.
Jo’natish  jarayonlari quyidagicha bo’lishi mumkin: Individual turi ya’ni nuqtadan
nuqtaga.
Kollektiv - operatsiyada kommunikatorning barcha protsessorlari ishtirok etadi.

Mavzu: Dasturlarni cmd orqali ishga tushirish usullari. Cmd buyruqlari. MPI kutubxonasining yaratilish tarixi.MPI_status strukturasi. MPI umumiy protseduralari. MPI da xabar almashish turlari va ular orasidagi farqlar. Blokirovkali xabar almashishni real muammolarni yechishga qo llanilishi.ʻ MPI_Wtick funksiyasi. MPI_Probe funksiyasining muhim holatlarda qo llanilishi. ʻ Blokirovkasiz xabar almashish mohiyati va uning qo llanilish ʻ sohalari.Blokirovkasiz xabar almashish funksiyalari. Blokirovkasiz xabar almashish holatini tekshirish funksiyalari va ularni amalda qo llanilishi. ʻ Blokirovkali va blokirovkasiz xabar almashish o rtasidagi asosiy farqlar,afzallik va ʻ kamchiliklari. Jarayonlar o rtasida ikki tomonlama xabar almashish uchun ʻ ishlatiladigan funksiyalar. Jarayonlar o rtasida jamoaviy (kollektiv) xabar ʻ almashish. Dasturlarni cmd orqali ishlatish buyruqlatri. CMD (Command Prompt) yoki Terminal, Windows operatsion tizimida dasturlarni bajarish va boshqa operatsiyalarni amalga oshirish uchun ishlatiladigan birinchi vosita hisoblanadi. Quyidagi qatorlarda, CMD orqali dasturlarni ishga tushirishning ba'zi usullarini ko'rsataman: Dasturning to'liq yo'lini kiriting: CMD oynasini oching va dasturning to'liq yo'lini kiriting. Masalan: "C:\contes\cmd3.exe" Bu buyruq dasturni boshqa oynada ochmaydi, balki asosiy CMD oynasida ishga tushiradi. Buyruq qatorlarini yozish: CMD da bir nechta buyruqni biriktirib bajarish uchun buyruq qatorlari yozish mumkin. Buyruq qatorlarini ajratish uchun & belgisidan foydalaning. mpiexec -n 13 C:\contes\cmd3.exe mpiexec -n buyruqi MPI (Message Passing Interface) dasturining ishga tushirilishini belgilaydi. MPI, masshtablangan va kuchli parallel dasturlarni yaratish va bajarish uchun ishlatiladigan bir kommunikatsiya protokolining nomidir. MPI, paralel kompyuterlarda yoki klastarlarda parallel hisoblash uchun xizmat qiladi. mpiexec MPI dasturini ishga tushirish uchun buyruqdir. -n flagi esa MPI dasturida ishlatilgan "process" (jarayon)lar sonini belgilaydi. Bu, parallel dastur bajarish uchun kerak bo'lgan jarayonlar sonini ifodalaydi. Jarayonlar MPI kommunikatsiya orqali ma'lumot almashish uchun ishlatiladi.

Masalan, agar mpiexec -n 5 cmd3.exe buyruqi berilsa, bu cmd3.exe dasturini 5 ta parallel jarayon (process) bilan ishga tushiradi. Har bir jarayon o'zining o'zgartirilgan ma'lumotlar to'plamini qabul qiladi va ulardan foydalanish uchun bir- biriga aloqador MPI kutiladi. -n flagi orqali belgilangan jarayonlar soni, ishlab chiqarilayotgan vazifalarning tashkil etilishi, resurslarni birlashtirish va natijalarni to'plamla olishning usuli bilan bog'liq bo'ladi. Bu buyruq MPI dasturlarini parallel ishga tushirishda keng qo'llaniladi. cmd umumiy buyruqlari haqida ma’lumotlar CMD (Command Prompt) Windows operatsion tizimida dasturlarni bajarish va sistem bilan ishlash uchun ishlatiladigan birlamchi vositadir. Quyidagi qatorlarda CMD buyruqlari haqida to'liq ma'lumotlarni ko'rsataman: Cmd ga kirish uchun <pusk>+R Oyna ichiga cmd yoziladi va OK tugmasi bosiladi va kiriladi. dir : Joriy direktoriyadagi fayl va papkalarni ro'yxatini ko'rsatadi. cd : Joriy direktoriyani o'zgartiradi. cd C:\contes\cmd3.exe mkdir : Yangi papka yaratadi. del : Faylni o'chiradi copy : Faylni ko'chiradi yoki ko'chirib yuboradi. copy SourceFile.txt DestinationFolder\ move: Faylni ko'chiradi yoki o'chiradi.

move SourceFile.txt DestinationFolder\ ren: Fayl nomini o'zgartiradi. MPI kutubxonasining yaratilish ta’rixi. MPI (Message passing interface-xabar uzatish interfeysi) turli xil tabiatdagi parallel hisoblash tizimlarida ishlaydigan ilovalarni yaratish va ishga tushirish imkonini beruvchi yordamchi dasturlar va kutubxona funksiyalari to'plamidir (C/C++, FORTRAN tillari uchun). MPI 1990-yillarda taqsimlangan xotira tizimlari uchun yagona dasturlash yondashuvi sifatida taqdim etilgan. MPI mashhurlik darajasiga ko'tarildi va hozir umumiy xotira tizimlarida va turli xil aralash hisoblash muhitlarida keng qo'llaniladi. MPI jarayonlar o’rtasida xabar almashish maqsadida qo’llaniladi. Message Passing Interface (MPI) - bir xil vazifani bajaradigan jarayonlar o'rtasida xabar almashish imkonini beruvchi ma'lumotlarni uzatish uchun dasturlash interfeysi (API). Uilyam Groupe, Evin Lusk va boshqalar tomonidan ishlab chiqilgan. MPI parallel dasturlashda eng keng tarqalgan ma'lumotlar almashinuvi interfeysi standarti bo'lib, ko'p sonli kompyuter platformalari uchun ilovalar mavjud. U klasterlar va superkompyuterlar uchun dasturlarni ishlab chiqishda foydalaniladi. MPI-da jarayonlar o'rtasidagi asosiy aloqa vositasi xabarlarni bir-biriga uzatishdir. Hozirgi vaqtda MPI ning ko'plab bepul va tijorat dasturlari mavjud. MPI birinchi navbatda taqsimlangan xotira tizimlariga, ya'ni ma'lumotlarni uzatish xarajatlari yuqori bo'lganda, OpenMP esa umumiy xotiraga ega tizimlarga (umumiy keshga ega ko'p yadroli) qaratilgan. Klasterdagi ko'p yadroli tizimlardan optimal foydalanish uchun ikkala texnologiya birgalikda ishlatilishi mumkin. MPI kutubxonasiga tegishli barcha funksiyalarning nomlari, ma'lumotlar turlari, konstantalar va hokazolar MPI_ prefiksi bilan boshlanadi va mpi.h sarlavha faylida tasvirlanadi. Barcha funksiyalar ( MPI_Wtime va MPI_Wtick bundan mustasno) int qaytish turiga ega va muvaffaqiyatga erishilganda xato kodi yoki MPI_SUCCESS qaytaradi. Biroq, xato bo'lsa, uni chaqirgan funksiyadan qaytishdan oldin, dasturni g'ayritabiiy tarzda tugatadigan standart xato ishlov beruvchisi chaqiriladi. Shuning uchun, qaytish qiymatini tekshirish mantiqiy emas. Standart xato ishlov beruvchini almashtirish mumkin ( MPI_Errandler_set funksiyasidan foydalangan holda), lekin MPI standarti dastur xatolikdan keyin ishlashni davom ettirishiga kafolat bermaydi. Demak, bu ham odatda mantiqiy emas. MPI_status strukturasi

MPI_status struktura MPI kutubxonasida foydalaniladigan ma'lumotlar to'plamini saqlash uchun ishlatiladi. Ushbu struktura ma'lumot almashish operatsiyalari natijasida olinadigan ma'lumotlarni saqlab turadi. • Qabul qilingan xabarning atributlarini status massivining elementlaridan aniqlash mumkin. • status parametri - MPI_SOURSE (haqiqiy xabar darajasi), MPI_TAG (haqiqiy teg) va MPI_ERROR (xato kodi) maydonlari bilan oldindan belgilangan MPI_Status turidagi strukturadir.Qabul qilish jarayonining raqami aniq ko'rsatilishi kerak.Agar bitta jarayon bitta MPI_Recv ga mos keladigan ikkita xabarni boshqa jarayonga yuborsa, birinchi xabar birinchi bo'lib qabul qilinadi.Agar xabar turli jarayonlar tomonidan yuborilgan bo'lsa, unda qabul qilish tartibi aniqlanmagan. • Bir tomondan, biz MPI_Recv ga xabar kutilayotgan vazifaning raqamini va uning identifikatorini ko’rsatamiz; va boshqa tomondan, biz ularni status strukturasida MPI dan olamizmi? Buning sababi, MPI_Recv joker argumentlar bilan chaqirilishi mumkin ("har qanday narsani/har kimdan qabul qilish") va bunday ma'lumotlarni qabul qilishdan so'ng, dastur status tuzilmasidan MPI_SOURCE va MPI_TAG maydonlarini o'qish orqali haqiqiy raqam/identifikatorni o'rganadi. • MPI_ERROR maydoni odatda tekshirilishi shart emas - MPI tomonidan o'rnatilgan standart xato ishlov beruvchisi muvaffaqiyatsizlikka uchragan taqdirda MPI_Recv dan qaytishdan oldin dasturning bajarilishini to'xtatadi. Shunday qilib, MPI_Recv dan qaytgandan so'ng, status.MPI_ERROR maydoni faqat 0 ga teng bo'lishi mumkin (MPI_SUCCESS); MPI_Status turida kiruvchi xabarning haqiqiy uzunligini yozib oladigan maydon mavjud emas. Uzunlikni shunday topish mumkin MPI_status strukturasining ma'lumotlarni saqlab turish uchun kerakli maydonlar quyidagilardir: MPI_SOURCE : Bu maydon ma'lumotni yuborgan protsessning identifikatori (rank) ni saqlaydi. MPI_TAG : Ushbu maydon almashish operatsiyasi orqali olinayotgan ma'lumotlarni turi (tag) ni saqlaydi. MPI_ERROR : Ushbu maydon almashish operatsiyasi natijasida yuzaga kelgan xatolarni saqlaydi. MPI_status strukturasining foydalanishida MPI kutubxonasi tomonidan o'rnatilgan almashish operatsiyasi tugagandan so'ng, MPI_Status tipidagi obyekt

yaratiladi va ushbu obyektning ma'lumotlari MPI_recv() yoki MPI_Wait() kabi funktsiyalarga o'tkaziladi. MPI_Status obyekti dastur tomonidan o'zida saqlangan ma'lumotlarni o'qish, aniqlash va saqlash uchun foydalaniladi. MPI kutubxonasida MPI_Status strukturasining ma'lumotlari to'g'ridan- to'g'ri o'zgartirib bo'lmaydi. Ular faqat MPI_recv(), MPI_Wait() va hokazo funktsiyalari ishlatilganda yangilanadi. Boshqacha bir ifoda bilan aytganda, MPI_Status strukturasining ma'lumotlari, MPI kutubxonasi tomonidan so'rovga javob sifatida olinadigan ma'lumotlarni saqlab turadigan o'zgartirilmaydigan obyekt hisoblanadi. MPI_status strukturasining foydalanilishi dastur tomonidan almashish operatsiyalari natijasida yuborilgan ma'lumotlarni aniqlash, qarshilik qilish va boshqa qo'llanmalarni amalga oshirishda juda kerakli bo'ladi. MPI protseduralari MPI (Mavzu Prognozlashdirish Intizomi, inglizcha "Message Passing Interface") umumiy protseduralar, parallel kompyuterlarda dasturlashni osonlashtirish va ma'lumotlarni almashish uchun ishlatiladigan protseduralar to'plamidir. Bu protseduralar MPI kutubxonasi orqali yoki MPI standartiga muvofiq boshqa kutubxonalardan foydalanilarak ishga tushiriladi. Quyidagi eng umumiy MPI protseduralari mavjud: MPI_Init : MPI kutubxonasini ishlatish uchun muhim tayyorgarliklarni amalga oshirish uchun ishlatiladi. Dastur boshida yoki paralel ishga tushishdan oldin chaqirish kerak. MPI_Finalize : MPI protsesslarining ishini yakunlash uchun ishlatiladi. Dastur tugagandan so'ng chaqirish kerak. MPI_Comm_size : Kommunikatsiya to'plamidagi (MPI_COMM_WORLD) protsesslar sonini olish uchun ishlatiladi. MPI_Comm_rank : Kommunikatsiya to'plamidagi (MPI_COMM_WORLD) joriy protsessning identifikatorini olish uchun ishlatiladi. MPI_Send: Ma'lumotlarni bir protsessdan boshqa protsessga yuborish uchun ishlatiladi. MPI_Recv : Ma'lumotlarni bir protsessdan qabul qilish uchun ishlatiladi. • Har bir parallel dasturda umumiy protseduralar zarur. • intMPI_Init( int* argc, char*** argv).