0

この単純な MPI プログラムを 2 つのプロセッサで実行しています。私の例(または私のコンピューター上だけかもしれません)では、コンソールは送信メッセージの前に受信メッセージを出力しました。

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;
}
4

1 に答える 1

1

並列 i/o ライブラリを使用せずに共有バッファーに並列で書き込む場合、どのバッファーが最初にクリアされるかは保証されません。それらを順番に出力したい場合は、印刷コマンドの後に出力バッファをフラッシュする必要があります。fflush(stdout);たとえば、毎回自動的にフラッシュされるバッファに印刷するfprintf(stderr,...);MPI_Barrier、印刷コマンドを分離するために パフォーマンスの低下につながる可能性があるため、最後のものはお勧めしません。

于 2012-10-16T16:18:34.817 に答える