|
MPI_Probe funksiyasining muhim holatlarda qoʻllanilishi
|
bet | 10/18 | Sana | 07.02.2024 | Hajmi | 435,82 Kb. | | #152842 |
Bog'liq Mustaqil ishi Xakimov Allamurod (3)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_Recv( floatBuf, floatBufSize, MPI_FLOAT, MPI_ANY_SOURCE, tagFloatData, ... );
MPI_Recv( intBuf,intBufSize,MPI_INT,MPI_ANY_SOURCE, tagIntData,... );
MPI_Recv( charBuf,charBufSize,MPI_CHAR,MPI_ANY_SOURCE, tagCharData,... );
Endi, agar bajarilish vaqtida tagCharData identifikatorli xabar qolgan ikkitasidan oldin kelsa, MPI MPI_Recv ga birinchi ikkita qo'ng'iroqlar davomida uni “mahkamlashga" majbur bo'ladi. Bu xotira yukiga to'la. MPI_Probe sizga xabarlarni foydalanuvchi buferiga olish tartibini ular qabul qiluvchi tomonga etib borish tartibiga qarab o’rnatishga imkon beradi, buni kompilyatsiya paytida emas, balki to'g'ridan-to'g'ri bajarish vaqtida amalga oshiradi:
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
#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 "<for(int i=0;icout<<"a1 -> : "<cout<<"b1 -> : "<}
}
MPI_Finalize();
}
|
| |