【问题标题】:MPI: Multiple Overlapping CommunicatorsMPI:多个重叠的通信器
【发布时间】:2016-12-31 02:11:12
【问题描述】:

我想创建 MPI 通信器,将等级为 0 的进程链接到其他所有进程。假设 n 是进程的总数。那么秩为 0 的进程应该有 n-1 个通信器,而其他每个进程都有一个通信器。这可能吗?如果可以,为什么我不能使用下面的程序来实现呢?

使用 mpic++ 编译器编译下面的代码会在我的计算机上终止,而不会出现警告和错误。但是当我使用 3 个或更多进程 (mpiexec -n 3) 运行生成的程序时,它永远不会终止。

我可能误解了 MPI 中通信器的概念。也许有人可以帮助我理解为什么下面的程序会卡住,以及创建这些通信器的更好方法是什么?谢谢。

#include <iostream>
#include <vector>
#include <thread>
#include <chrono>
#include "mpi.h"
void FinalizeMPI();
void InitMPI(int argc, char** argv);
int main(int argc, char** argv) {
    InitMPI(argc, argv);

    int rank,comm_size;
    MPI_Comm_rank(MPI_COMM_WORLD,&rank);
    MPI_Comm_size(MPI_COMM_WORLD,&comm_size);

    if(comm_size<2) {
        FinalizeMPI();
        return 0;
    }

    MPI_Group GroupAll;
    MPI_Comm_group(MPI_COMM_WORLD, &GroupAll);

    if(rank==0) {
        std::vector<MPI_Group> myGroups(comm_size-1);
        std::vector<MPI_Comm> myComms(comm_size-1);
        for(int k=1;k<comm_size;++k) {
           int ranks[2]{0, k};
           MPI_Group_incl(GroupAll, 2, ranks, &myGroups[k-1]);
           int err = MPI_Comm_create(MPI_COMM_WORLD, myGroups[k-1], &myComms[k-1]);
           std::cout << "Error: " << err << std::endl;
        }
    } else {
        MPI_Group myGroup;
        MPI_Comm myComm;
        int ranks[2]{0,rank};
        MPI_Group_incl(GroupAll, 2, ranks, &myGroup);
        int err = MPI_Comm_create(MPI_COMM_WORLD, myGroup, &myComm);
        std::cout << "Error: " << err << std::endl;
    }
    std::cout << "Communicators created: " << rank << std::endl;
    std::this_thread::sleep_for(std::chrono::milliseconds(1000));

    FinalizeMPI();
    return 0;
}

void FinalizeMPI() {
   int flag;
   MPI_Finalized(&flag);
   if(!flag)
      MPI_Finalize();
}

void InitMPI(int argc, char** argv) {
   int flag;
   MPI_Initialized(&flag);
   if(!flag) {
      int provided_Support;
      MPI_Init_thread(&argc, &argv, MPI_THREAD_MULTIPLE, &provided_Support);
      if(provided_Support!=MPI_THREAD_MULTIPLE) {
          exit(0);
      }
   }
}

【问题讨论】:

    标签: mpi communicator


    【解决方案1】:

    MPI_Comm_create 是对初始通信器 (MPI_COMM_WORLD) 的集体操作 - 您必须在所有进程上调用它。

    解决问题的最简单方法是按照您的方式使用MPI_Comm_create_group。它类似于MPI_Comm_create,只是它对组是集体的。

    【讨论】:

      猜你喜欢
      • 2017-12-17
      • 2021-09-13
      • 1970-01-01
      • 2012-04-26
      • 2012-12-07
      • 2018-03-04
      • 2018-04-03
      • 2022-01-01
      • 2018-04-06
      相关资源
      最近更新 更多