阻塞通訊中,消息發送有四種模式: 緩存
1).標準模式,MPI_Send 安全
2).緩存(Buffer)模式,MPI_Bsend 性能
3).就緒(Ready)模式,MPI_Rsend spa
4).同步(Synchonous)模式,MPI_Ssend 線程
1. 標準通訊模式中,理論上send會阻塞直到目標進程recv執行接收數據後send纔會返回。可是這種模式下MPI環境基本上會對發送進程send的數據進行緩衝,這時即便接收進程沒有進行recv發送進程的send也會當即返回。若是發送數據超過MPI提供的緩衝區大小,那麼send就會阻塞到緩衝區這裏。 rest
int MPI_Send(void *buf , int count , MPI_Datatype datatype , int dest , int tag , MPI_Comm comm); 進程
int MPI_Recv(void *buf , int count , MPI_Datatype datatype , int source , int tag ,MPI_Comm comm , MPI_Status *status); 內存
send和recv是非對稱的。recv會由於沒有接收到目標進程的消息而阻塞,不過能夠指定接收進程接收通用信封:MPI_ANY_SOURCE(任意源進程),MPI_ANY_TAG(任意標誌)。(關於標誌tag後面再討論)而後能夠從返回的MPI_Status的成員MPI_SOURCE和MPI_TAG中解讀出相關信息。 資源
發送進程向本身send數據是直接阻塞引起死鎖,這個暫時沒搞明白。 同步
2. 緩衝通訊模式中,由於有內存到內存的複製開銷,會致使必定的性能損失和資源佔用。不過與標準通訊模式中MPI環境提供的緩衝機制不一樣,緩衝發送不受接收進程的影響能夠直接完成,但消息大於緩衝區時程序將會報錯。
int MPI_Pack_size(int , MPI_Datatype , MPI_comm , int*); //返回消息所需緩衝區大小(字節數)
定義MPI_BSEND_OVERHEAD爲分配使用緩衝區時的系統(BSEND routines)所需最大字節空間。
int MPI_Buffer_attach(void *buffer , int size); //將用於緩衝通訊的緩衝區綁定到進程
固然一個進程同一時刻只容許綁定一個緩衝區。若是沒有緩衝區綁定到進程,MPI環境默認的操做會有一個長度爲0的緩衝區綁定到進程上(解除綁定操做相似)。須要注意線程安全問題。
int MPI_Buffer_detach(void *buffer, int *size); //解除綁定到進程的用於緩衝通訊的緩衝區
參數返回已解除綁定緩衝區地址和大小,allow nested libraries to replace and restore the buffer。
(未完待續……)