2012-03-31 89 views
1

使用MPI_Barrier()來同步迭代步驟之間的數據是不錯的主意。請參閱下面的僞代碼。我可以使用MPI_Barrier()來同步迭代步驟之間的數據嗎?

While(numberIterations< MaxIterations) 
{ 
    MPI_Iprobe() -- check for incoming data 
    while(flagprobe !=0) 
    { 
     MPI_Recv() -- receive data 
     MPI_Iprobe() -- loop if more data 
    } 

    updateData() -- update myData 

    for(i=0;i<N;i++) MPI_Bsend_init(request[i]) -- setup request 

    for(i=0;i<N;i++) MPI_Start(request[i]) -- send data to all other N processors 

    if(numberIterations = MaxIterations/2) 
     MPI_Barrier() -- wait for all processors -- CAN I DO THIS 

    numberIterations ++ 

} 

回答

0

只有在程序的正確性取決於它時才應該使用障礙。從你的僞代碼中,我不知道是否是這種情況,但是在循環中途的一個障礙看起來非常可疑。

+0

我的想法是在兩者之間等待,以便所有N處理器都能趕上。有沒有更好的方法來完成這個? – Naga 2012-03-31 23:53:45

+0

他們**是否需要**趕上?如果屏障不在那裏,程序是否會給出不正確的結果? – suszterpatt 2012-04-01 00:30:22

+0

沒有..但我運行緩衝區/死鎖問題與更高的迭代。程序工作正常,最多6000次迭代。除此之外的任何東西......我不幸運。 – Naga 2012-04-01 01:01:34

0

您的代碼會死鎖,有或沒有障礙。您在發送任何數據之前會在每個等級中收到,所以任何隊伍都無法接到發送呼叫。大多數應用程序將在每次迭代之後調用諸如MPI_Allreduce而不是屏障,因此所有級別都可以決定錯誤級別是否足夠小,任務隊列是否爲空等,從而決定是否終止。

+0

是的,先生。我明白那個。我更新了確切的僞代碼。 – Naga 2012-03-31 23:21:27

+0

@Naga:那個版本在發送前還是會阻塞接收,所以還是會死鎖。 – 2012-03-31 23:23:21

+0

我的印象是MPI_Iprobe只有在發送了任何東西時才允許我接收。真是無賴! – Naga 2012-03-31 23:30:42

相關問題