天天看點

MPIMPI

MPI

collective Communication Routines

标題與point to point 主要差別: 引發group一面

不是所有的process

而是我們call的那個comm的group裡面的所有的 MPI_task

同時執行

大家一起call work

API

1.MPI_Barrier(comm)

當指定commz中的每一個program執行到該處,準備就緒時,才同時進行後續操作,說明collective comm 其實是一種同步執行方式,并且對所有program阻塞至同步

MPIMPI

2.MPI_Bcast(&buffer,count,datatype,root,comm)

将指定root(task id)中的指定内容(buffer)複制到其他每一個task

MPIMPI

3.MPI_Scatter(&sendbuf,sendcnt,sendtype, &recvbuf,recvcnt,recvtype,root,comm)

sendcnt與recvcnt的值通常是相同的(配置設定出去的大小),sender一次分一個recver大小的内容給resver,直至分完為止(多出來的也不再進行配置設定),後續task得不到消息,為空

MPIMPI

4.MPI_Gather(&sendbuf,sendcnt,sendtype,&recvbuf,recvcnt,recvtype,root,comm)

與MPI_Scatter恰好相反,将個task的内容收集到一個task中,是以此時需要recv有足夠的空間,常用于平行計算結束後,将資料收集起來 ,由一個task将其寫入file.

MPIMPI

5.MPI_Reduce(&sendbuf,&recvbuf,count,datatype,op,dest,comm)

與Gather很像,将其他task的内容聚集起來,但是同時進行了相應操作,op的取值對應不同的操作,(dest:代表resv的taskid)

MPIMPI

6.MPI_Allgather(&sendbuf,sendcount,sendtype,&recvbuf,recvcount,rectype,comm)

類似于gather,隻不過是該comm下所有task均進行gather

7.MPI_Allreduce(&sendbuf,&recvbuf,count,datatype,op,comm)

同上

MPIMPI

還存在很多API,雖然collective Comm 是同步,并且以上操作針對每一個task而言相同,但是通過不同的API和參數,可以實作配置設定任務的具體化和數量化,可以不同

Group and Communicator Management Routines

1.建立新的group

MPIMPI

實際代碼:

MPIMPI

問題:

1.(rank < numtasks/2) ,将原task進行分組時,必須使每一個task都能call到MPI_Group_incl(),但是,我們使用intrank1[4] = {0,1,2,3}, rank2[4] = {5,6,7,8}兩個數組來區分task進行實際比對,是以task=4這個不會分到這兩個組中。

2.執行結束後,0123實作同步化,5678實作同步化

但是兩個新組均使用new_group和new_comm命名

在後續操作中如何區分這兩者新組,如何分别管理呢?

不用擔心,雖然變量名相同,但是記憶體位址等均不相同,可以區分

MPI_IO

MPIMPI
MPIMPI

colllective:并行讀取,效能高,但是這裡就多了一種中間讀取的過程,當檔案很大,且隻有少數task需要讀取時,使用independent I/O,更友善,更有效

MPIMPI

繼續閱讀