我正在尝试为int数组做MPI_Gatherv,而不知道每个进程中每个数组的大小。有办法吗?
这是我的代码段。
#include "mpi.h"
#include <iostream>
using namespace std;
int main(int argc, char *argv[]) {
MPI_Init(&argc, &argv);
int rank;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
int *local_arr;
int *arr;
int local_n;
int n;
if (rank == 0) {
// do gatherv without knowing the element sizes and displacements
} else {
// fill array with random size
srand(rank);
local_n = (rand()%10)+1;
local_arr = new int[local_n];
for (int i = 0; i < local_n; i++) {
local_arr[i] = i;
}
// do gatherv without knowing the element sizes and displacements
}
}
答案 0 :(得分:1)
您不能真正做到这一点。 displacements
和element_sizes
参数的存在表明了这一点。如果确实没有办法知道(根本无法从根计算)根将收到的计数,则需要从每个节点中进行一个MPI_Gather
的{{1}}并将其用作{ int
中的{1}}。
答案 1 :(得分:0)
调用Gatherv
时,您必须事先知道大小和位移,因为您只需要在目标等级上分配足够的空间即可。
这就是为什么您经常会在获得每个等级的大小之前经常看到一个Gather
调用,然后是一个缩小以获取位移,然后是Gatherv
调用。如果在不同等级上有多个固定大小的后者,则Gather
将在预处理步骤中调用。