如何有效地使用boost mpi广播功能?

时间:2016-06-02 17:42:20

标签: c++ boost mpi boost-mpi

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

#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。我只从root调用broadcast,而来自其他进程的调用如下:

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

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

谢谢!

1 个答案:

答案 0 :(得分:1)

使用普通broadcast

第二个版本不是正确的MPI程序。如果它有效,那只是偶然的。通常broadcast和其他集合体都经过高度优化,可以利用系统拓扑信息。因此,与使用点对点消息自行实现它们相比,它们的性能更好。他们还以更抽象的方式表达您的通信结构,从而产生更清晰的代码。