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