我正在尝试使用 MPI 发送 std::vector 。当向量很小时,这可以正常工作,但当向量很大时(向量中超过 ~15k 双倍)就不起作用。当尝试发送一个具有 20k 双精度的向量时,程序只是坐在那里,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
它永远不会完成,并且两个 CPU 处于 100% 的位置,直到我强制关闭程序。
有谁知道是什么问题?