Я использую кластер Windows HPC с 12 узлами (каждый с 24 ядрами) для запуска программы C++ MPI (используйте Boost MPI). Один запуск с уменьшением MPI, одно уменьшение MPI с комментарием (только для теста скорости). Время выполнения 01:17:23 и 01:03:49. Мне кажется, что сокращение MPI занимает большую часть времени. Я думаю, что стоит попробовать сначала уменьшить на уровне узла, а затем уменьшить до головного узла, чтобы повысить производительность.
Ниже приведен простой пример для тестирования. Предположим, есть 4 компьютерных узла, каждый из которых имеет 2 ядра. Я хочу сначала использовать mpi для уменьшения на каждом узле. После этого сведите к головному узлу. Я не совсем знаком с mpi, и приведенная ниже программа дает сбой.
#include <iostream>
#include <boost/mpi.hpp>
namespace mpi = boost::mpi;
using namespace std;
int main()
{
mpi::environment env;
mpi::communicator world;
int i = world.rank();
boost::mpi::communicator local = world.split(world.rank()/2); // total 8 cores, divide in 4 groups
boost::mpi::communicator heads = world.split(world.rank()%4);
int res = 0;
boost::mpi::reduce(local, i, res, std::plus<int>(), 0);
if(world.rank()%2==0)
cout<<res<<endl;
boost::mpi::reduce(heads, res, res, std::plus<int>(), 0);
if(world.rank()==0)
cout<<res<<endl;
return 0;
}
Вывод неразборчив, что-то вроде этого
Z
h
h
h
h
a
a
a
a
n
n
n
n
g
g
g
g
\
\
\
\
b
b
b
b
o
o
o
o
o
o
o
o
s
...
...
...
Сообщение об ошибке
Test.exe ended prematurely and may have crashed. exit code 3
Я подозреваю, что сделал что-то не так с разделением/или сокращением группы, но не могу понять это с помощью нескольких испытаний. Как мне изменить, чтобы это работало? Спасибо.
MPI_Reduce()
илиMPI_Allreduce()
? Вообще говоря, вы должны позволить библиотеке MPI оптимизировать это для вас (иерархический алгоритм не всегда самый эффективный алгоритм). В MPI вы бы использовали разные буферы отправки и приема илиMPI_IN_PLACE
, хотя не уверен, что это применимо к Boost.MPI. - person Gilles Gouaillardet   schedule 02.07.2019