2017-06-14 16 views
-1

残念ながら、私はそれを実行できませんでしたが、論理的にエラーがあるかどうかを調べようとしていました。または欠落しているものがある場合は、ここでMPIコードのエラーチェック

コードです:

main(int argc, char *argv[]) { 
    int numtasks, rank, dest, source, rc, count, tag=1; 
    char inmsg, outmsg=’x’; 
    MPI_Status Stat; 
    MPI_Init(&argc,&argv); 
    MPI_Comm_size(MPI_COMM_WORLD, &numtasks); 
    MPI_Comm_rank(MPI_COMM_WORLD, &rank); 

    if (rank == 0) { 
     dest = 1; 
     source = 1; 
     rc = MPI_Send(&outmsg, 1, MPI_CHAR, dest, tag, MPI_COMM_WORLD); 
     rc = MPI_Recv(&inmsg, 1, MPI_CHAR, source, tag, MPI_COMM_WORLD, &Stat); 
    } 
    else if (rank == 1) { 
     dest = 0; 
     source = 0; 
     rc = MPI_Send(&outmsg, 1, MPI_CHAR, dest, tag, MPI_COMM_WORLD); 
     rc = MPI_Recv(&inmsg, 1, MPI_CHAR, source, tag, MPI_COMM_WORLD, &Stat); 
    } 

    rc = MPI_Get_count(&Stat, MPI_CHAR, &count); 
    printf("Task %d: Received %d char(s) from task %d with tag %d \n", 
    rank, count, Stat.MPI_SOURCE, Stat.MPI_TAG); 
    MPI_Finalize(); 
} 

はそして、それが変数で送受信MPIを保存することが許可され、ここでrcが使用されてきましたか?

+0

コードを見やすく書式設定してください。誰かがあなたの質問に答える可能性を高める以外にも、コードを書式設定することは、コードが何をするのかを自分自身に明瞭にする利点があります。 – NoseKnowsAll

+0

「残念ながら私はそれを実行できませんでした」 - 実行するとエラーが発生していますか?あなたはそれをコンパイルできませんか? MPIがインストールされたマシンにアクセスできないですか? – NoseKnowsAll

+0

@NoseKnowsAll私はMPIコードを実行したシステムでこれ以上アクセスできないので、これを実行できませんでした。しかし、それが正しいかどうかを知りたかったのです! – Majk

答えて

1

コードが間違っています。これにはデッドロックが含まれています。これは、永久にハングアップするか、そうでなければ不正行為を行うことができることを意味します。 MPI_Sendはブロッキング操作です。MPI_Recvが呼び出されるまでブロックされます。したがって、両方のプロセスは、MPI_Recvが呼び出される前に、それぞれのMPI_Send操作でスタックされます。代わりにMPI_Sendrecvを使用してください。

最適化のために、MPIは小さなメッセージに対してすぐにデータを送信するように選択することができるので、コードが間違っていても完了することがあります。それに頼らないでください!

通常、MPIのエラーはデフォルトで致命的ですので、MPIリターンコードを確認する必要はありません。特に、戻りコードをMPI_SUCCESSのためにチェックせずに割り当てないでください。

どのシステムでも簡単にMPIをインストールできます。 OpenMPIは、ほとんどのLinuxディストリビューションで使用できます。通常のデスクトップシステムでMPIを使いこなす理由はありません。

関連する問題