【问题标题】:Simultaneously passing messages between all nodes in MPI在 MPI 中的所有节点之间同时传递消息
【发布时间】:2012-12-19 11:01:03
【问题描述】:

我似乎无法弄清楚如何在节点之间发送数据,而不是将其发送到根节点,然后将其发送到所有其他节点。

如果我有 N 节点,每个节点都有一个像这样创建的数组,其中 SIZE 是节点的总数,并且目前假设它是一个预处理器常量(如果可能,避免像瘟疫一样的 malloc) .另外,不用说rank是当前节点的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,只有一行数字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 );
  }
}

谁能给我一些关于如何解决这个问题的伪代码。干杯

【问题讨论】:

    标签: c algorithm mpi


    【解决方案1】:

    这是一个“收集”操作,有一个 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 
    

    【讨论】:

      猜你喜欢
      • 2011-03-24
      • 2020-04-12
      • 1970-01-01
      • 2010-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-30
      相关资源
      最近更新 更多