如何以有效的方式使用boost mpi广播功能



我正在尝试从根进程广播一个值,并在所有其他进程中接收它。我已经用以下两种格式实现了它。1.我在所有进程(根进程和所有其他从进程)中使用了广播功能

#include <boost/mpi.hpp>
#include <iostream>
#include <boost/serialization/string.hpp>
namespace mpi = boost::mpi;
int main(int argc, char* argv[])
{
mpi::environment env(argc, argv);
mpi::communicator world;
std::string value;
if (world.rank() == 0) {
value = "Hello, World!";
}
broadcast(world, value, 0);
std::cout << "Process #" << world.rank() << " says " << value << std::endl;
return 0;
} 

2.我只从根调用广播,而从其他进程调用接收,如下所示:

if (world.rank() == 0) {
value = "Hello, World!";
broadcast(world, value, 0);
}
else {
world.recv(boost::mpi::any_source, boost::mpi::any_tag, value);
}

在这些例子中,两者的工作方式似乎相似,但我想知道在代码效率和性能方面是否有任何偏好。

谢谢!

使用普通broadcast

第二个版本不是正确的MPI程序。如果它起作用,那只是偶然的。一般来说,broadcast和其他集体是高度优化的,并且可以利用系统拓扑信息。因此,它们的性能比您使用点对点消息自行实现要好。此外,它们以更抽象的方式表达您的通信结构,从而产生更干净的代码。

最新更新