點到點通訊要求必須有send和recv配對。
點到點通訊共12對 ,分別對應阻塞式方式1組(4個)和非阻塞式方式2組
分類 |
發送 |
接受 |
說明 |
阻塞通訊 |
MPI_Send MPI_Bsend MPI_Rsend MPI_SSend |
MPI_Recv MPI_Irecv MPI_Recv_Init |
如果接受動作使用了 MPI_Irecv MPI_Recv_Init,則要使用MPI_Request對象測試 |
非阻塞式通訊 (非重複) |
MPI_Isend MPI_IBSend MPI_IRSend MPI_ISSend |
MPI_Recv MPI_Irecv MPI_Recv_Init |
需要用到MPI_Request對象進行相關測試及運行 |
非阻塞式通訊 (重複) |
MPI_Send_Init MPI_Bsend_Init MPI_Rsend_Init MPI_Ssend_Init |
MPI_Recv MPI_Irecv MPI_Recv_Init |
同上 |
其中發送函數模式均為MPI_**Send,B標識緩衝模式(Buffer),R表示就緒模式(Ready),S身分識別同步處理模式(Synchronous),I表示立即發送(Imediately)。不帶任何修飾的,MPI_Send方式發送的稱為標準模式。
訊息通訊的資料傳遞流程:
a. 發送端發送資料調用MPI _**Send;
b. MPI環境從發送緩衝區提取要發送的資料,據此組裝發送訊息;
c. 將組裝的訊息發送給目標;
d. 接受端收取可匹配的訊息,並將其解析到接受緩衝區。
2.1阻塞通訊
阻塞通訊是指訊息發送方的send調用需要接受方的recv調用的配合才可完成。
· 標準通訊模式
詳見樣本:標準阻塞模式調用(代碼code)
//eg2:標準阻塞模式調用 int myid,numprocs,proId,sb[BUF_SIZE],rb[BUF_SIZE]; MPI_Status status; MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD,&numprocs); MPI_Comm_rank(MPI_COMM_WORLD,&myid); for(int i = 0 ; i < BUF_SIZE;i++){ sb[i] = myid +1; } if(myid == 0 ) proId = 1; if(myid == 1 ) proId = 0; if(myid == 0 ){ cout << "process " << myid << "of " << numprocs << "trying send ..." <<endl; MPI_Send(sb,BUF_SIZE,MPI_INT,proId,1,MPI_COMM_WORLD); cout << "process " << myid << "of " << numprocs << "trying recv ..." <<endl; MPI_Recv(rb,BUF_SIZE,MPI_INT,proId,1,MPI_COMM_WORLD,&status); } if(myid == 1){ cout << "process " << myid << "of " << numprocs << "trying recv ..." <<endl; MPI_Recv(rb,BUF_SIZE,MPI_INT,proId,1,MPI_COMM_WORLD,&status); cout << "process " << myid << "of " << numprocs << "trying send ..." <<endl; MPI_Send(sb,BUF_SIZE,MPI_INT,proId,1,MPI_COMM_WORLD); } cout << "Hello, process " << myid << "of " << numprocs << endl; MPI_Finalize();
· 緩衝通訊模式
該模式主要用於解開阻塞通訊的發送和接受之間的耦合。
使用到的API:
MPI_Pack_size:為每個訊息計算其使用buffer的大小;
MPI_Buffer_attach:裝配用於通訊的緩衝區;
MPI_Bsend/MPI_Recv:發送接受資料
MPI_Buffer_detach:卸載用於通訊的緩衝區;
· 就緒通訊模式
僅當對方的接受操作啟動並準備就緒時,才可發送資料。(其發送方式與標準發送完全一致,只不過向MPI環境傳遞一個額外資訊:接收動作已經就緒,直接發就是。
使用到的MPI:MPI_Rsend;
在必要時,需要在某個時間點同步:MPI_Barrier(MPI_COMM_WORLD);
· 同步通訊模式
不論接收端是否啟動了接收動作,發送端都可在任何時機啟動發送動作。但發送端需等待接收端的接收動作發送並開始接收資料之後才可以結束。
使用到的API:MPI_Ssend;
註:各種通訊模式,其發送方式不同,但接收都是使用的MPI_Recv。
選擇通訊模式的建議:發送短訊息可使用就緒發送模式,而發送長訊息,可使用同步發送模式。如果忽略效能改進措施則就緒模式可實現為標準通訊模式。
2.2非阻塞通訊
將通訊和計算重疊將極大的改善效能,特別是那些具有獨立通訊控制硬體的系統上,更能發揮其優勢。採取多線程是實現這種重疊的一個重要方法,此外就是使用非阻塞的通訊操作。
More:http://blog.donews.com/me1105/archive/2011/02/15/129.aspx