【问题标题】:MPI_Comm_split not working with MPI_BcastMPI_Comm_split 不适用于 MPI_Bcast
【发布时间】:2021-08-11 15:13:35
【问题描述】:

使用以下代码,我将 4 个进程拆分为列组,然后从对角线 (0,3) 在同一列中广播。进程 0 向 2 广播。而 3 应该向 1 广播。但它没有按预期工作。有人能看出什么问题吗?

0 1
2 3

    #include <stdio.h>
    #include <stdlib.h>
    #include <iostream>
    #include <mpi.h>
    #include <mpi.h>
    using namespace std;
    
    int main(int argc, char **argv){
        MPI_Comm col_comm,row_comm;
        int myrank, size, even, value=0;
        int localRank=0;
        MPI_Init (&argc, &argv);
        MPI_Comm_rank (MPI_COMM_WORLD, &myrank);
        MPI_Comm_size (MPI_COMM_WORLD, &size);      
        MPI_Comm_split(MPI_COMM_WORLD, myrank%2, myrank, &col_comm); 
        MPI_Comm_rank (col_comm, &localRank);
            
        if(myrank%3==0){
            value = myrank*5+1;
            MPI_Bcast(&value, 1, MPI_INT, localRank, col_comm);
        }
        
        printf("Rank=%d | LocalRank=%d | Got broadcast value of %d\n", myrank, localRank, value);
        MPI_Finalize();
        return 0;
    }

输出

ubuntu@root:~/matrixmult$ mpirun comtest -np 4
Rank=0 | LocalRank=0 | Got broadcast value of 1
Rank=1 | LocalRank=0 | Got broadcast value of 0
Rank=2 | LocalRank=1 | Got broadcast value of 0
Rank=3 | LocalRank=1 | Got broadcast value of 16

【问题讨论】:

    标签: c++ c parallel-processing mpi openmpi


    【解决方案1】:

    MPI_Bcast

    将消息从具有“root”等级的进程广播到所有其他进程 沟通者的进程

    是一个集体通信例程,因此它应该被给定通信器中的所有进程调用。因此,您需要删除以下条件if(myrank%3==0),然后您需要相应地调整root进程,而不是使用localRank

    在您当前的代码中,只有 myrank 0 和 3 的进程称为 MPI_Bcast(都属于不同的通信器)。所以处理 0 个调用

    MPI_Bcast(&value, 1, MPI_INT, localRank, col_comm);
    

    这基本上意味着它将值广播给自己。进程 3 也是如此。因此,输出:

    Rank=0 | LocalRank=0 | Got broadcast value of 1
    Rank=1 | LocalRank=0 | Got broadcast value of 0
    Rank=2 | LocalRank=1 | Got broadcast value of 0
    Rank=3 | LocalRank=1 | Got broadcast value of 16
    

    Rank=0 和 Rank=3 与自己通信,而其他进程不属于MPI_Bcast。因此它们的值都是 0。

    尝试以下方法:

    int main(int argc, char **argv){
        MPI_Comm col_comm,row_comm;
        int myrank, size, even, value=0;
        int localRank=0;
        MPI_Init (&argc, &argv);
        MPI_Comm_rank (MPI_COMM_WORLD, &myrank);
        MPI_Comm_size (MPI_COMM_WORLD, &size);      
        MPI_Comm_split(MPI_COMM_WORLD, myrank%2, myrank, &col_comm); 
        MPI_Comm_rank (col_comm, &localRank);
         
        if(myrank == 0 || myrank == 3)    
           value = myrank*5+1;
        
        MPI_Bcast(&value, 1, MPI_INT, myrank%2 != 0, col_comm);
        
        printf("Rank=%d | LocalRank=%d | Got broadcast value of %d\n", myrank, localRank, value);
        MPI_Finalize();
        return 0;
    }
    

    进程 0 向 2 广播。而 3 应该向 1 广播。

    输出:

    Rank=0 | LocalRank=0 | Got broadcast value of 1
    Rank=1 | LocalRank=0 | Got broadcast value of 16
    Rank=2 | LocalRank=1 | Got broadcast value of 1
    Rank=3 | LocalRank=1 | Got broadcast value of 16
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-08
      • 2018-05-29
      • 2015-04-25
      • 2014-07-18
      • 2012-11-20
      • 2013-11-30
      • 1970-01-01
      相关资源
      最近更新 更多