2

ルートノードに送信してから他のすべてのノードに送信するのではなく、ノード間でデータを送信する方法がわからないようです。

Nそれぞれがそのように作成された配列を持つノードがある場合SIZE、はノードの総数です。今のところ、それはプリプロセッサ定数であると想定します(可能な場合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;

これにより、各ノードにほぼ空の次元の配列が与えられSIZE * 5、数値は1行だけになります123。次に、これらすべての個別の配列を取得して「マージ」します。私が考えることができる唯一のことは以下ですが、ソースノードがターゲットノードと等しくないかどうかをわざわざチェックしたとしても、これはデッドロックにつながると確信しています。

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

1 に答える 1

4

これは「収集」操作であり、MPIコレクティブがあります。これはMPI_Gather()、すべてのデータを1つのプロセッサに収集する場合に実装し、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 
于 2012-12-19T03:01:03.170 に答える