将MPI_Comm_split用于if语句

时间:2017-12-14 00:53:26

标签: mpi

当我使用一个进程运行此代码时,它可以正常工作:

#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

但是当我使用多个进程运行它时,输出为&#34; 1&#34;仅!!。

此代码可以正常工作:

#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;
}

输出两行&#34; 0&#34;和&#34; 1&#34;按某种顺序。

所以,问题是当我用多个进程运行它时,第一个代码中的错误是什么?

1 个答案:

答案 0 :(得分:0)

MPI_Comm_split()是一个集体操作,它必须由所有通信器的MPI任务调用(此处为MPI_COMM_WORLD)。

因此,在第一个在多个节点上运行的示例中,实际发生的是MPI任务0挂起MPI_Comm_split()