我正在寻找与此处提出的问题相似的内容:MPI communicator as global variable。
答案基本上是MPI_COMM_WORLD
是一个全局变量。
Boost很好地包装了它的通信器,并且在构造MPI_COMM_WORLD
类型的对象时默认为boost::mpi::communicator
生成通信器包装器。 [Boost MPI tutorial]
我的问题:
如果我想访问通讯器给出的内容,例如进程的排名,我可以调用
boost::mpi::communicator world;
int mpi_rank = world.rank();
这也适用于main.cpp
之外的单独函数,等等。如果我在那里使用相同的构造函数,我会在每种情况下获得相同的mpi_rank
值吗?更具体地说,如果我在新文件/函数中构造新的rank = 0
对象,那么rank = 0
的进程是否仍会有boost::mpi::communicator
?从Boost文档中我看起来并不清楚。
答案 0 :(得分:0)
简单回答:看起来像是。
示例程序(没有相关的#include
s,语法很好):
int main()
{
boost::mpi::communicator main_comm;
int mpi_rank = main_comm.rank();
myClass myObj;
myObj.test(mpi_rank);
}
// Separate file
class myClass
{
void test(int i) {
boost::mpi::communicator local;
int local_rank = local.rank();
std::cout << "local rank = " << local_rank
<< ", i(main rank) = " << i
<< std::endl;
}
};
这个程序总是打印两次相同的数字(总是= = 10次左右,有4个过程。不是任何方式的详尽测试,但至少让我信服)
答案 1 :(得分:0)
确认您已经测试过的内容。是。一旦你设置了一个MPI通信器(或者像你的情况一样使用MPI_COMM_WORLD
),一个过程&#39;在整个计划中,该沟通者中的排名不会改变。甚至跨文件/功能。