我为每个处理器(假设3个处理器)的本地数组(名为lvotes)赋值,每个处理器的第一个元素存储一个值,即:
P0 : 4
P1 : 6
p2 : 7
现在,使用MPI_Gather,我希望将它们全部收集在P0中,所以它看起来像:
P0 : 4, 6, 7
我用这种方式收集:
MPI_Gather(lvotes, P, MPI_INT, lvotes, 1, MPI_INT, 0, MPI_COMM_WORLD);
但是我遇到了问题。这是我第一次使用MPI进行编码。我可以使用任何建议。 感谢
答案 0 :(得分:7)
这是人们第一次使用聚集/分散集体的常见问题;在发送和接收计数中,您指定要从每个进程发送或接收的项目数。因此,虽然你总是得到(比方说)P
个项目,但如果P
是处理器的数量,那么这不是你为收集操作指定的内容;您指定发送计数为1,并且计数为1(来自每个进程)。像这样:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <mpi.h>
int main ( int argc, char **argv ) {
int rank;
int size;
int lvotes;
int *gvotes;
MPI_Init ( &argc, &argv );
MPI_Comm_rank ( MPI_COMM_WORLD, &rank );
MPI_Comm_size ( MPI_COMM_WORLD, &size );
if (rank == 0)
gvotes = malloc(size * sizeof(int) );
/* everyone sets their first lvotes element */
lvotes = rank+4;
/* Gather to process 0 */
MPI_Gather(&lvotes, 1, MPI_INT, /* send 1 int from lvotes.. */
gvotes, 1, MPI_INT, /* gather 1 int each process into lvotes */
0, MPI_COMM_WORLD); /* ... to root process 0 */
printf("P%d: %d\n", rank, lvotes);
if (rank == 0) {
printf("P%d: Gathered ", rank);
for (int i=0; i<size; i++)
printf("%d ", gvotes[i]);
printf("\n");
}
if (rank == 0)
free(gvotes);
MPI_Finalize();
return 0;
}
跑步给出
$ mpirun -np 3 ./gather
P1: 5
P2: 6
P0: 4
P0: Gathered 4 5 6