2012-12-12 60 views
3

我对本地阵列(名为lvotes),用于每个处理器的一个值(假定3个处理器),以及每一个所述第一元件被存储的值,即:困难MPI_Gather功能

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中编码。我可以使用任何建议。 谢谢

回答

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