使用MPI收集分布式数组

时间:2016-02-23 16:03:59

标签: c arrays mpi message-passing collect

我有一个以循环方式分布在3个进程中的数组,让我们说这些是他们的部分:

Proc 0:
{0.0, 0.0, 0.1, 0.1, 0.2}
Proc 1:
{1.0, 1.0, 1.1, 1.1}
Proc 2:
{2.0, 2.0, 2.1, 2.1}

我想在一个进程中将所有这些收集到一个单独的数组中,如下所示:

{0.0, 0.0, 1.0, 1.0, 2.0, 2.0, 0.1, 0.1, 1.1, 1.1, 2.1, 2.1, 0.2}

即来自proc 0的2个元素,然后来自proc 1的2个元素,来自proc 2的2个元素,然后是来自proc 0的2个元素,来自proc 1的2个元素等等。

最终"块"可能不完整。与示例中一样,proc 0的最后一个块只有1个元素而不是2个。

我怎么能解决这个问题?我已经看过了gather和gatherv,但是我不知道在数据分发时如何使用它们。

编辑:有建议使用vector数据类型,代码看起来像这样

int disp[np], counts[np];

for(int i = 0; i < np; i++) {
    counts[i] = 1;
    disp[i] = i*blocksz;
}

MPI_Datatype distrib_arr;
MPI_Type_vector(num_blocks, blocksz, np*blocksz, MPI_DOUBLE, &distrib_arr);
MPI_Type_commit(&distrib_arr);

double *result = (double *) calloc (N, sizeof(double));

MPI_Gatherv(arr, arr_size, MPI_DOUBLE,
            result, counts, disp, distrib_arr,
            0, MPI_COMM_WORLD);

结果如下:

{0.0, 0.0, nan, nan, nan, nan, 0.1, 0.1, nan, nan, nan, nan, 0.2}

即它似乎已经正确地从proc 0收集了数组,而不是其他的?我做错了什么?

0 个答案:

没有答案