有没有办法在不知道每个进程中每个数组的大小的情况下执行MPI_Gatherv?

时间:2019-04-01 14:33:50

标签: c++ mpi

我正在尝试为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
    }
}

2 个答案:

答案 0 :(得分:1)

您不能真正做到这一点。 displacementselement_sizes参数的存在表明了这一点。如果确实没有办法知道(根本无法从根计算)根将收到的计数,则需要从每个节点中进行一个MPI_Gather的{​​{1}}并将其用作{ int中的{1}}。

答案 1 :(得分:0)

调用Gatherv时,您必须事先知道大小和位移,因为您只需要在目标等级上分配足够的空间即可。

这就是为什么您经常会在获得每个等级的大小之前经常看到一个Gather调用,然后是一个缩小以获取位移,然后是Gatherv调用。如果在不同等级上有多个固定大小的后者,则Gather将在预处理步骤中调用。