0

コントロールが if ブロックの MPI_Send() から else if の MPI_Recv() に直接ジャンプするのはなぜですか。意思決定条件に関する限り、単一のコード ブロックのみを実行する必要があります。

int main(int argc, char *argv[]) {
    int number = 54;
    MPI_Init(&argc, &argv);
    MPI_Comm_size (MPI_COMM_WORLD, &no_of_process);
    MPI_Comm_rank (MPI_COMM_WORLD, &process_rank);
    MPI_Status status;
    if (process_rank == 0) {
        MPI_Send (&number, 1, MPI_INT, 1, 0, MPI_COMM_WORLD);
    }
    else if (process_rank == 1) {
        MPI_Recv (&number, 1, MPI_INT, 0, 0, MPI_COMM_WORLD);
    }
}
4

1 に答える 1

4

MPI の実行モデルは、SPMD (Single Program Multiple Data) または MPMD (Multiple Programs Multiple Data) のいずれかで、SPMD の方が広く普及しています。この実行モデルでは、単一のソース コードからバイナリ ファイルが生成され、そこからプロセスと呼ばれる複数のインスタンスが開始されます。各インスタンスにはランクと呼ばれる独自の識別子があり、コードのさまざまなブランチがランクに基づいて実行されます。したがって、MPI_Sendは 1 つのランク (「ランク」は通常、「特定のランクを持つプロセス」の短縮バージョンとして使用されます)MPI_Recvによって実行されますが、 は別のランクによって実行され、 が実行しMPI_Sendたプロセスのランクを指定する場合、MPI_Recv、メッセージは 2 つの間で送信されます。MPI では、メッセージのバッファリングとノンブロッキング操作も可能であるため、1 つのランクがそれ自体と対話することもできます。

したがって、通常、ランクに基づく条件が課されると、それが満たされるプロセスと満たされないプロセスがあります。したがって、両方のブランチが実行されますが、異なるプロセスで実行され、場合によっては異なるタイミングで実行されます。

MPI でのプログラミングには、ちょっとした個性的な考え方が必要で、通常、慣れるまでに時間がかかります。

于 2012-08-24T15:08:49.197 に答える