2012-12-19 2 views
2

루트 노드로 데이터를 보내고 다른 모든 노드로 보내는 대신 노드간에 데이터를 보내는 방법을 알아낼 수 없습니다.MPI의 모든 노드 사이에서 동시에 메시지 전달하기

내가 그렇게, SIZE 노드의 총 수입니다 같이 만든 배열 N 노드 각각이 있고, 순간 그것은 전처리 상수의 가정하면 (수, 전염병 등의 malloc을 피하기). 또한 rank이 현재 노드의 순위라는 것은 말할 나위도 없습니다.

int dummy [SIZE][5]; 
int i, n; 

for (n = 0; n < SIZE; n++){ 
    for (i = 0; i <5; i++){ 
    if (n == rank){ 
     dummy [ n ][ i ] = 123; 

이것은 각 노드에게 123 번호의 행이 하나의 치수 SIZE * 5 거의 빈 어레이를 제공한다. 이제 저는이 모든 개별 배열을 가져 와서 '병합'하고 싶습니다. 내가 생각할 수있는 유일한 방법은 아래,하지만 난 내가 소스 노드가 동일하지 않은 대상 노드 않습니다 있는지 확인 귀찮게 경우에도,이 교착 상태로 이어질 것입니다 확신 :

for (i = 0; i < SIZE; i++){ 
    for (j = 0; j < SIZE; j++){ 
    MPI_Send (&dummy [ i ], 5, MPI_INT, j, 123, MPI_COMM_WORLD); 
    } 
} 

for (i = 0; i < SIZE; i++){ 
    for (j = 0; j < SIZE; j++){ 
    MPI_Recv (&dummy [ j ], 5, MPI_INT, i, 123, MPI_COMM_WORLD); 
    } 
} 

친절하게 사람 수를 이 문제를 해결하는 방법에 대한 몇 가지 의사 코드를 제공하십시오. 건배

답변

4

이것은 "수집"작업이며 모든 데이터를 하나의 프로세서에 수집하려는 경우이를 구현하는 MPI 집합체 MPI_Gather()이 있고 MPI_Allgather()은 모든 프로세서에 데이터를 수집합니다.

이 경우 우리는 우리가 보내고있는 동일한 배열에 '적절한 위치에서'수집을하고 싶습니다. 그래서이 작동합니다 :

#include <stdio.h> 
#include <stdlib.h> 
#include <mpi.h> 

#define SIZE 5 

int main(int argc, char **argv) { 

    int size, rank; 
    MPI_Init(&argc, &argv); 
    MPI_Comm_size(MPI_COMM_WORLD, &size); 
    MPI_Comm_rank(MPI_COMM_WORLD, &rank); 

    if (size != SIZE) { 
     if (rank == 0) { 
      fprintf(stderr,"Must run with %d ranks\n", SIZE); 
     } 
     MPI_Finalize(); 
     exit(1); 
    } 

    int dummy [SIZE][5]; 

    for (int i = 0; i <5; i++){ 
      dummy [ rank ][ i ] = 100 * rank; 
    } 

    MPI_Allgather(MPI_IN_PLACE, 5, MPI_INT, 
        dummy, 5, MPI_INT, 
        MPI_COMM_WORLD); 

    if (rank == SIZE-1) { 
     printf("Rank %d has dummy:\n", rank); 
     for (int i=0; i<size; i++) { 
      for (int j=0; j<5; j++) { 
       printf("%3d ", dummy[i][j]); 
      } 
      printf("\n"); 
     } 
    } 

    MPI_Finalize(); 
    return 0; 
} 

실행을 제공합니다

$ mpicc -o allgather allgather.c -std=c99 
$ mpirun -np 5 ./allgather 
Rank 4 has dummy: 
    0 0 0 0 0 
100 100 100 100 100 
200 200 200 200 200 
300 300 300 300 300 
400 400 400 400 400 
관련 문제