通过 MPI 进程同步数组:MPI_Allgather 的使用不正确?
Synchronize array over MPI processes: incorrect use of MPI_Allgather?
我知道之前已经解决了类似的问题,请参阅下文为什么它们不适用于我的情况。我有一段代码如下所示:
int current_rank;
MPI_Comm_rank(MPI_COMM_WORLD, ¤t_rank);
if (current_rank==ROOT_RANK){
...
#pragma omp for
for (long i = 0; i < num; i++) {
auto &choumbie = catalogue->get()[i];
/* array choumbie is modified */}
...}
然后我想在所有进程上同步数组 'choumbie'。我尝试在 this example and the documentation 之后实现它。所以,在 if (current_rank==ROOT_RANK) 之后,我做了:
int gsize;
int *rbuf; // address of receive buffer
auto &choumbie = catalogue->get();
MPI_Comm_size(comm, &gsize);
int send_count=num;
rbuf = (int*)malloc(gsize*send_count*sizeof(double));
MPI_Allgather(choumbie,send_count, MPI_DOUBLE, rbuf, send_count, MPI_DOUBLE, comm);
我想我要同步的数组'choumbie'不是这样输入的,而且我也没有找到任何其他有用的例子。看起来第一个参数必须是要发送的数组的内存地址,但这似乎与我提供的示例不一致 above.
P.S.: 每个rank的num相同
This question was not helpful in my case, because I would like to use MPI_Allgather (also in C++, not Fortran). Also this 对我没有帮助,因为我想避免使用 MPI_Barrier.
只要num
在每个等级上都相同,就很接近了。这取决于 catalogue->get();
给你的是什么。我将假设它是一个整数数组。你应该只需要:
MPI_Allgather(choumbie,send_count, MPI_INT, rbuf, send_count, MPI_INT, comm);
我知道之前已经解决了类似的问题,请参阅下文为什么它们不适用于我的情况。我有一段代码如下所示:
int current_rank;
MPI_Comm_rank(MPI_COMM_WORLD, ¤t_rank);
if (current_rank==ROOT_RANK){
...
#pragma omp for
for (long i = 0; i < num; i++) {
auto &choumbie = catalogue->get()[i];
/* array choumbie is modified */}
...}
然后我想在所有进程上同步数组 'choumbie'。我尝试在 this example and the documentation 之后实现它。所以,在 if (current_rank==ROOT_RANK) 之后,我做了:
int gsize;
int *rbuf; // address of receive buffer
auto &choumbie = catalogue->get();
MPI_Comm_size(comm, &gsize);
int send_count=num;
rbuf = (int*)malloc(gsize*send_count*sizeof(double));
MPI_Allgather(choumbie,send_count, MPI_DOUBLE, rbuf, send_count, MPI_DOUBLE, comm);
我想我要同步的数组'choumbie'不是这样输入的,而且我也没有找到任何其他有用的例子。看起来第一个参数必须是要发送的数组的内存地址,但这似乎与我提供的示例不一致 above.
P.S.: 每个rank的num相同
This question was not helpful in my case, because I would like to use MPI_Allgather (also in C++, not Fortran). Also this 对我没有帮助,因为我想避免使用 MPI_Barrier.
只要num
在每个等级上都相同,就很接近了。这取决于 catalogue->get();
给你的是什么。我将假设它是一个整数数组。你应该只需要:
MPI_Allgather(choumbie,send_count, MPI_INT, rbuf, send_count, MPI_INT, comm);