【发布时间】:2020-06-25 16:14:17
【问题描述】:
我知道之前已经解决了类似的问题,请参阅下文为什么它们不适用于我的案例。我有一段代码如下所示:
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 示例和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.:每个等级的 num 都是一样的。
This 问题对我的情况没有帮助,因为我想使用 MPI_Allgather(也在 C++ 中,而不是 Fortran)。 this 对我的情况也没有帮助,因为我想避免使用 MPI_Barrier。
【问题讨论】:
-
每个等级的“num”是否相同? “rbuf”是一个整数数组,但您使用 MPI_DOUBLE 类型进行通信。您可能需要使用 allreduce 函数为“rbuf”分配“num”的全局总和。
-
是的,num 是一样的。我已经相应地更新了帖子。您能否提供一个代码示例来说明您的意思? Wrt rbuf,那是一个错误的类型,它是一个双精度的,也是固定的。
-
我在你的原始代码中遗漏了一些东西,你不需要调用 Allreduce。要遵循的代码。
-
同步数组是什么意思?如果您希望将
ROOT_RANK的副本分发给所有其他队伍,那么只需使用MPI_Bcast。使用MPI_Allgather,您正在收集choumbie的本地副本并将它们连接到rbuf中的一个大数组中。还是choumbie是块分布式的? -
我想收集所有级别的信息到
choumbie。因此,无论进程以何种方式修改(或未)修改数组,我都希望最终的choumbie能够通过它可能从所有级别进行的任何修改进行更新。但是,对于您提出的任何建议,您能否提供代码示例,因为问题是我首先不了解上下文中的语法。
标签: c++ mpi thread-synchronization