MPI點到點通訊之一:阻塞通訊

點到點通訊要求send和recv可以匹配,也即一個send對應於一個recv。


阻塞通訊中,消息發送有四種模式: 緩存

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。

    (未完待續……)   

相關文章
相關標籤/搜索