1

MPI を使用して std::vector を送信しようとしています。これは、ベクトルが小さい場合は正常に機能しますが、ベクトルが大きい場合 (ベクトル内の倍数が ~15k を超える場合) には機能しません。20k double のベクトルを送信しようとすると、プログラムは CPU を 100% 使用したままになります。

これは最小限の例です

#include <vector>
#include <mpi.h>

using namespace std;

vector<double> send_and_receive(vector<double> &local_data, int n, int numprocs, int my_rank) {
    MPI_Send(&local_data[0], n, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD);

    if (my_rank == 0) {
        vector<double> global_data(numprocs*n);
        vector<double> temp(n);
        for (int rank = 0; rank < numprocs; rank++) {
            MPI_Recv(&temp[0], n, MPI_DOUBLE, rank, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
            for (int i = 0; i < n; i++) {
                global_data[rank*n + i] = temp[i];
            }
        }
        return global_data;
    }
    return vector<double>();
}

int main(int args, char *argv[]) {
    int my_rank, numprocs;
    // MPI initialization
    MPI_Init (&args, &argv);
    MPI_Comm_rank (MPI_COMM_WORLD, &my_rank);
    MPI_Comm_size (MPI_COMM_WORLD, &numprocs);

    int n = 15000;
    vector<double> local_data(n);

    for (int i = 0; i < n; i++) {
        local_data[i] = n*my_rank + i;
    }

    vector<double> global_data = send_and_receive(local_data, n, numprocs, my_rank);

    MPI_Finalize();

    return 0;
}

を使用してコンパイルします

mpic++ main.cpp

を使用して実行します

mpirun -n 2 a.out

プログラムを実行するとn = 15000、プログラムは正常に完了しn = 17000ますが、終了せn = 20000ず、プ​​ログラムを強制終了するまで 2 つの CPU が 100% のままになります。

問題が何であるかを知っている人はいますか?

4

1 に答える 1

2

MPI_Send面白い電話です。入力を格納するのに十分な内部バッファーがある場合は、返される可能性があります。唯一の保証は、入力バッファーが MPI によってさらに必要とされないことです。ただし、十分な内部バッファー スペースがない場合、反対側のMPI_Recv呼び出しがデータの受信を開始するまで、呼び出しはブロックされます。これがどこに向かっているのかわかりますか?両方のプロセスMPI_Sendは、バッファ領域が不十分であるため、そのブロックを送信します。そのような問題をデバッグするときは、に置き換えるMPI_Sendと役立ちますMPI_Ssend

考えられる解決策は次のとおりです。

  • バッファリング送信を使用しますMPI_Bsend
  • 使用するMPI_Sendrecv
  • 各送信が一致する recv を持つように、交互の send/recv ペア (たとえば、奇数の proc 送信、偶数の recv、およびその逆)。
  • ノンブロッキング送信を使用し、MPI_Isend

http://www.netlib.org/utk/papers/mpi-book/node39.htmlを参照してください

于 2013-09-11T16:35:44.313 に答える