当我使用一个进程运行此代码时,它可以正常工作:
#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;按某种顺序。
所以,问题是当我用多个进程运行它时,第一个代码中的错误是什么?
答案 0 :(得分:0)
MPI_Comm_split()
是一个集体操作,它必须由所有通信器的MPI任务调用(此处为MPI_COMM_WORLD
)。
因此,在第一个在多个节点上运行的示例中,实际发生的是MPI任务0挂起MPI_Comm_split()