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% のままになります。
問題が何であるかを知っている人はいますか?