《MPI並行程式設計執行個體教程》PART2.點到點通訊

來源:互聯網
上載者:User

點到點通訊要求必須有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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.