1

ルート プロセスから値をブロードキャストし、それを他のすべてのプロセスで受信しようとしています。以下の2つの形式で実装しました。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);
  }

これらの例ではどちらも同様に機能しているように見えますが、ここでコードの効率とパフォーマンスに関して好みがあるかどうかを知りたいです。

ありがとうございました!

4

1 に答える 1

1

無地を使用broadcast

2 番目のバージョンは正しい MPI プログラムではありません。うまくいくとしたら、それはたまたまです。一般broadcastに、その他の集合は高度に最適化されており、システム トポロジ情報を利用できます。したがって、ポイント ツー ポイント メッセージを使用して独自に実装する場合よりもパフォーマンスが向上します。また、コミュニケーション構造をより抽象的な方法で表現するため、コードがよりクリーンになります。

于 2016-06-02T18:06:15.617 に答える