2012-10-16 20 views
0

我有這個簡單的MPI程序運行在兩個處理器上。在我的示例中(或者可能只是在我的電腦上),我的控制檯在發送消息之前輸出接收消息。簡單的消息交換使用MPI

我知道有一種使用MPI對接收進行排序的方法,但我希望我的例子會等待處理器0發送數據,因此接收輸出將必然在第二位。

如何在發送信息後打印接收信息?

這是我的代碼:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <mpi.h> 

int main(int argc, char *argv[]){ 
     int np, myId; 
     char send[100], recv[100]; 

     MPI_Init(&argc, &argv); 

     MPI_Comm_size(MPI_COMM_WORLD, &np); 
     MPI_Comm_rank(MPI_COMM_WORLD, &myId); 

     MPI_Status stat; 
     if(myId == 0){ 
       int length = sprintf(send, "hey!"); 

       for(int i = 1; i < np; i++){ 
         printf("send %d => %d (%d)", myId, i, length); 
         MPI_Send(send, length, MPI_CHAR, i, 0, MPI_COMM_WORLD); 
       } 

     }else if (myId == 1){ 
       MPI_Recv(send, 41, MPI_CHAR, 0, 0, MPI_COMM_WORLD, &stat); 
       printf("receive %d <= %d\n", myId, 0); 
     } 

     MPI_Finalize(); 
     return 0; 
} 
+1

您是否嘗試睡眠接收消息或fflush(stdout)的進程? –

+0

就像在MPI_Recv之前放置一個fflush(發送)一樣? –

+0

'fflush(send)'沒有意義......'send'不是輸出緩衝區。 – Mosby

回答

1

當寫入到並行共享緩衝器,而無需使用一個並行I/O庫但不保證該緩衝將首先清除。如果您希望它們按順序出現,則應在執行打印命令(例如fflush(stdout);)後清空輸出緩衝區,然後將其打印到每次自動刷新的緩衝區,例如fprintf(stderr,...);或使用MPI_Barrier分隔打印命令。最後一個不推薦,因爲它可能導致性能不佳。