在 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()
中挂起
当我 运行 这个代码只有一个进程时,它工作正常:
#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()