Как эффективно использовать функцию усиления 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, в то время как прием звонков от других процессов выполняется следующим образом

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

в этих примерах оба варианта работают одинаково, но я хочу знать, есть ли здесь какие-либо предпочтения в отношении эффективности и производительности кода.

Спасибо!

1 ответ

Решение

Используйте равнину broadcast,

Вторая версия не является правильной программой MPI. Если это работает, это только случайно. В общем broadcast и другие коллективы высоко оптимизированы и могут использовать информацию о топологии системы. Таким образом, они работают лучше, чем если бы вы реализовали это самостоятельно, используя двухточечные сообщения. Также они выражают вашу коммуникационную структуру более абстрактным образом, что приводит к более чистому коду.

Другие вопросы по тегам