2013-09-28 68 views
0

我有什麼如何打印日誌,以便在MPI

我有使用MPI的C程序,它使用4個過程:1輛車輛(的taskid = 0)和3名乘客。車輛一次可容納2名乘客。 3位顧客不斷回來搭車。

車輛,我有:

int passengers[C] = {0}; 
while(1) 
    MPI_Recv(&pid, 1, MPI_INT, MPI_ANY_SOURCE, 1, MPI_COMM_WORLD, &status); 
    //put pid in passengers[totalNumberArrived] 
    if(totalNumberArrived == 2)  
     printf("vehicle left..."); 
     sleep(5); 
     printf("vehicle came back..."); 
     for (i=0; i<2; i++) 
      MPI_Send(&passengers[i], 1, MPI_INT, passengers[i], 1, MPI_COMM_WORLD); 
     totalNumberArrived = 0; 
    if(done)//omitting the details here 
     break; 

,併爲每個乘客,我有:

for (i to NumOfRound) 
    sleep(X); 
    printf("%d is sending a msg", tasked) 
    MPI_Send(&taskid, 1, MPI_INT, 0, 1, MPI_COMM_WORLD); 
    MPI_Recv(&pid, 1, MPI_INT, 0, 1, MPI_COMM_WORLD, &pstatus); 
    printf("%d received from %d\n", tasked, pid, pstatus.MPI_SOURCE); 

問題

如果車輛閒置未用的taskid 1一程和3,我期望看到這種輸出:

vehicle left... 
vehicle came back... 
1 is sending a msg 
3 is sending a msg (this could be before 1's msg though) 

,但我有時會

vehicle left... 
1 is sending a msg 
3 is sending a msg 
vehicle came back... 

它看起來像乘客不會被阻止,直到車輛回來。

我以爲MPI_Recv阻止任務,直到它從車輛獲得一個msg,所以我研究並閱讀了MPI_Recv阻止了這種問題,因爲printf不一定是按順序打印的。我還讀了一些建議使用沖洗,但在某些情況下,沖洗不起作用。

我不知道我應該怎麼做我的情況。它真的只是printf命令的問題嗎?

我也看到了這一點:Ordering Output in MPI

,不知我是否應該添加一個主線程,並讓它爲車輛和乘客的中央控制器?

回答

1

您不能依賴打印輸出在進程之間進行排序。您唯一能指望的是輸出將按每個進程排序。因此,如果由於某種原因,至關重要的是您可以按順序將內容打印到STDOUT/STDERR,您需要首先將其聚合到一個進程。