我有一个以循环方式分布在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收集了数组,而不是其他的?我做错了什么?