在 if 语句中使用 MPI_Comm_split

using MPI_Comm_split into an if statement

当我 运行 这个代码只有一个进程时,它工作正常:

#include <iostream>
#include "mpi.h"

using namespace std;

int main(int argc, char* argv[])
{
    MPI_Comm SubWorld;
    MPI_Init(&argc, &argv);

    int Rank;
    MPI_Comm_rank(MPI_COMM_WORLD, &Rank);

    if (Rank == 0)
        MPI_Comm_split(MPI_COMM_WORLD, 1, Rank, &SubWorld);

    cout << Rank << endl;

    MPI_Finalize();

    return 0;
}

输出:0

但是当我运行它有多个进程时,输出只有“1”!!

这段代码工作正常:

#include <iostream>
#include "mpi.h"

using namespace std;

int main(int argc, char* argv[])
{
    MPI_Comm SubWorld;
    MPI_Init(&argc, &argv);

    int Rank;
    MPI_Comm_rank(MPI_COMM_WORLD, &Rank);

    MPI_Comm_split(MPI_COMM_WORLD, 1, Rank, &SubWorld);

    cout << Rank << endl;

    MPI_Finalize();

    return 0;
}

按某种顺序输出“0”和“1”两行。

所以,问题是当我 运行 它有多个进程时,第一个代码有什么问题?

MPI_Comm_split()是集体操作,必须由所有通信器的MPI任务调用(MPI_COMM_WORLD这里)

因此,在您的第一个示例 运行 中,在多个节点上真正发生的是 MPI 任务 0 在 MPI_Comm_split()

中挂起