【问题标题】:communications in MPMD MPI executionsMPMD MPI 执行中的通信
【发布时间】:2017-05-12 12:00:02
【问题描述】:

此帖子与之前的帖子 binding threads to certain MPI processes 有关。在这里,有人询问如何为 MPI 等级分配不同的 OpenMP 线程数。一种可能性如下

$ mpiexec <global parameters>
          -n n1 <local parameters> executable_1 <args1> :
          -n n2 <local parameters> executable_2 <args2> :
          ...
          -n nk <local parameters> executable_k <argsk>

我不知道独立实例 executable_1、executable_2、...、executable_k 是如何相互通信的。我是说 如果在执行过程中的某个时刻他们需要交换数据,他们会 使用内部通信器(实例之间)和内部通信器 (在同一个实例中,例如executable_1)?

谢谢。

【问题讨论】:

    标签: multithreading mpi openmp openmpi


    【解决方案1】:

    由于该命令而启动的所有进程形成一个单一的 MIMD/MPMD MPI 作业,即它们共享同一个世界通信器。第一个n1 rank 运行executable_1,后面的n2 rank 运行executable_2,等等。

                       rank                 |  executable
    ----------------------------------------+---------------
                      0 .. n1-1             |  executable_1
                     n1 .. n1+n2-1          |  executable_2
                  n1+n2 .. n1+n2+n3-1       |  executable_3
                       ....                 |      ....
     n1+n2+n3+..+n(k-1) .. n1+n2+n3+..+nk-1 |  executable_k
    

    只需在MPI_COMM_WORLD 中发送消息即可进行通信。单独的可执行文件不会自动形成自己的通信器组。这就是 MPMD 与使用 MPI_Comm_spawn 开始子作业的区别 - 子作业有自己的世界通信器,一个使用内部通信器与他们交谈,而 MIMD/MPMD 作业中的单独子作业没有。

    通过查询MPI_COMM_WORLDMPI_APPNUM 属性,rank 仍然可以找出它属于哪个应用程序上下文。只需使用 appnum 值作为颜色进行拆分,就可以为每个上下文创建单独的子通信器(不同的上下文是由: 分隔的命令):

    int *appnum, present;
    
    MPI_Comm_get_attr(MPI_COMM_WORLD, MPI_APPNUM, &appnum, &present);
    if (!present)
    {
       printf("MPI_APPNUM is not provided!\n");
       MPI_Abort(MPI_COMM_WORLD, 0);
    }
    
    MPI_Comm appcomm;
    MPI_Comm_split(MPI_COMM_WORLD, *appnum, 0, &appcomm);
    

    【讨论】:

      猜你喜欢
      • 2016-06-25
      • 2018-03-04
      • 2011-12-13
      • 2017-12-17
      • 2012-03-17
      • 1970-01-01
      • 2021-09-13
      • 2019-09-15
      • 2019-05-29
      相关资源
      最近更新 更多