2015-04-02 44 views
4

MPI_IN_PLACE作爲MPI_Scatter的參數給出時應如何操作?應如何使​​用?我無法理解man MPI_ScatterMPI_IN_PLACE如何與MPI_Scatter一起使用?

當通信器是內部通信器時,您可以在原地執行收集操作(輸出緩衝器用作輸入緩衝器)。使用變量MPI_IN_PLACE作爲根進程recvbuf的值。在這種情況下,recvcount和recvtype將被忽略,並且根進程不會向其自身發送數據。由於就地選項將接收緩衝區轉換爲發送和接收緩衝區,因此包含INTENT的Fortran綁定必須將它們標記爲INOUT,而不是OUT。

我想要做的是使用相同的緩衝區,其中包含根上的數據作爲每個其他進程的接收緩衝區(如MPI_Bcast)。請問MPI_ScatterMPI_IN_PLACE讓我這樣做?

回答

3

MPI_scatter的sendbuf只在根據mpich根相關,

sendbuf - 發送緩衝器(選擇,僅在根顯著)

this討論的地址,

對於scatter/scatterv,MPI_IN_PLACE應該作爲recvbuf傳遞。對於聚會和大多數其他集體,MPI_IN_PLACE應作爲sendbuf傳遞。

因此,您需要在根進程的recv緩衝區位置使用MPI_IN_PLACE,例如,

if (rank == iroot) 
    MPI_Scatter(buf, sendcount, MPI_Datatype, MPI_IN_PLACE, sendcount, 
       MPI_Datatype, iroot, MPI_COMM_WORLD); 
else 
    MPI_Scatter(dummy, sendcount, MPI_Datatype, buf, sendcount, MPI_Datatype, 
       iroot, MPI_COMM_WORLD); 

然後,您可以在根和互相過程中的recv位置相同buf發送使用buf。接收處理器上的dummy緩衝區可能也可能被MPI_IN_PLACE替代。

+1

虛擬緩衝區可以替換爲NULL,因爲它永遠不會被讀取。 – 2015-04-02 23:10:10

相關問題