是否有MPI_Comm_create_group的非阻塞版本?

问题描述

假设我们要为等级为0、1和2的三个进程创建3个通信器,并且通信器的组为{0,1},{0,2}和{1,2}。

似乎(请参见下面的示例代码)如果每个进程按以下顺序调用MPI_Comm_create_group(),则会出现阻塞。

进程0

为组{0,1}创建通信器

为组{0,2}创建通信器

过程1

为组{1,2}创建通信器

为组{0,1}创建通信器

过程2

为组{0,2}创建通信器

为组{1,2}创建通信器

有什么解决方案?一种解决方案显然是更改对MPI_Comm_create_group()调用顺序。

示例代码

#include <mpi.h>
#include <stdlib.h>
#include <stdio.h>

int main()
{
    MPI_Init(NULL,NULL);

    int worldsize,worldrank;

    MPI_Comm_size(MPI_COMM_WORLD,&worldsize);
    MPI_Comm_rank(MPI_COMM_WORLD,&worldrank);

    if (worldsize < 3)
    {
        if (worldrank==0) printf("Please launch at least 3 processes!\n");
        MPI_Finalize();
        return 0;
    }

    MPI_Group worldgroup,newgroup;
    MPI_Comm newcomm1,newcomm2;

    MPI_Comm_group(MPI_COMM_WORLD,&worldgroup);

    int set01[2] = {0,1};
    int set02[2] = {0,2};
    int set12[2] = {1,2};

    switch (worldrank)
    {
        case 0:
            MPI_Group_incl(worldgroup,2,set01,&newgroup);
            MPI_Comm_create_group(MPI_COMM_WORLD,newgroup,&newcomm1);
            MPI_Group_incl(worldgroup,set02,1,&newcomm2);
            break;
        case 1:
            MPI_Group_incl(worldgroup,set12,&newcomm2);
            break;
        case 2:
            MPI_Group_incl(worldgroup,&newcomm2);
            break;
    }

    MPI_Finalize();
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)