2016-11-20 41 views
1

假設你做了兩個MPI_Sends和兩個MPI_Recvs,你可以指定哪個緩衝區的內容將會到達MPI_Send,如果你有兩個不同的緩衝區可用,並且每個MPI_Recvs都從每個緩衝區接收?你能指定在MPI中發送哪個緩衝區嗎?

if(rank == MASTER) { 
    for(kk=1; kk < size; kk++) { 
     MPI_Recv(printbuf, numcols, MPI_DOUBLE, kk, tag, MPI_COMM_WORLD, &status); 
     sum = sum + printbuf[kk-1]; 
    } 
} 
else { 
    MPI_Send(sum, local_ncols + 2, MPI_DOUBLE, MASTER, tag, MPI_COMM_WORLD); 
} 
if(rank == MASTER) { 
    for(kk=1; kk < size; kk++) { 
    MPI_Recv(secondbuf, numcols, MPI_DOUBLE, kk, tag, MPI_COMM_WORLD, &status); 
    sum2 = sum2 + secondbuf[kk-1]; 
    } 
} 
else { 
    MPI_Send(sum2, local_ncols + 2, MPI_DOUBLE, MASTER, tag, MPI_COMM_WORLD); 
} 

這是OpenMPI。每個等級計算sumsum2。我想獲得所有等級'sum s和sum2 s的總和。有沒有更好的辦法?例如,通過指定要發送的緩衝區sumsum2,下面的代碼是否可以被壓縮?

+0

對於關於改進或壓縮代碼的問題,我會在[Code Review](http://codereview.stackexchange.com/)Stack Exchange上提出這類問題。如果你把它放在那裏而不是在這裏,你會得到更好,更精確的答案。 – esote

+1

是否有任何理由避免使用減少操作? – Angelos

+0

@Impmpence謝謝,我會試試 – FullMetalScientist

回答

4

Angelos的評論是正確的:如果你想總結所有進程的結果,MPI_Reduce(e.g., this Q/Aamongst others)是要走的路。

回答一般問題,但是:當你發送消息時,你無法控制接收過程對它做什麼 - 你所做的只是發送它。但是,除了要發送給哪個任務之外,還有一個元數據可以控制:標記。接收過程可以根據標籤決定要接收的緩衝區:

if (rank != MASTER) { 
    // worker process 
    MPI_Send(sum1, local_ncols + 2, MPI_DOUBLE, MASTER, tag1, MPI_COMM_WORLD); 
    MPI_Send(sum2, local_ncols + 2, MPI_DOUBLE, MASTER, tag2, MPI_COMM_WORLD); 
} else { 
    // master process 
    MPI_Recv(printbuf, numcols, MPI_DOUBLE, kk, tag1, MPI_COMM_WORLD, &status); 
    MPI_Recv(secondbuf, numcols, MPI_DOUBLE, kk, tag2, MPI_COMM_WORLD, &status); 
} 

還有其他方法可以採用。您可以使用MPI的non-overtaking guarantee,其中指出從task1到task2的兩條消息的接收順序與它們發送的順序相同(如果它們可以通過相同的接收接收) - 這可以確保接收進程可以區分發送的第一條消息第二個。

另一種可以在某些情況下工作的方法是將它們打包成相同的消息(這可以用於縮短消息以減少延遲)並在接收端解壓縮它們;這是確保您知道哪一部分數據將進入哪個緩衝區的另一種方法。

+0

謝謝,這些方法真的很有幫助 – FullMetalScientist

+0

此外,爲了迴應您對類似問題的答案 - 如果您在函數中進行縮小並且想要返回所有級別總和(即globalsum)的總和,這怎麼可能?看起來你只能使用MASTER排名中的globalsum。 – FullMetalScientist

+0

@FullMetalScientist - 如果您希望所有的等級都能得到最終答案,您可以使用'MPI_Allreduce' - 參見http://mpitutorial.com/tutorials/mpi-reduce-and-allreduce –