В учебнике boost есть примеры операций сбора и сокращения. Код для сбора выглядит следующим образом:
#include
#include
#include
#include
namespace mpi = boost::mpi;
int main(int argc, char* argv[])
{
mpi::environment env(argc, argv);
mpi::communicator world;
std::srand(time(0) + world.rank());
int my_number = std::rand();
if (world.rank() == 0) {
std::vector all_numbers;
gather(world, my_number, all_numbers, 0);
for (int proc = 0; proc < world.size(); ++proc)
std::cout << "Process #" << proc << " thought of "
<< all_numbers[proc] << std::endl;
} else {
gather(world, my_number, 0);
}
return 0;
}
И пример для сокращения выглядит следующим образом:
#include
#include
#include
namespace mpi = boost::mpi;
int main(int argc, char* argv[])
{
mpi::environment env(argc, argv);
mpi::communicator world;
std::srand(time(0) + world.rank());
int my_number = std::rand();
if (world.rank() == 0) {
int minimum;
reduce(world, my_number, minimum, mpi::minimum(), 0);
std::cout << "The minimum value is " << minimum << std::endl;
} else {
reduce(world, my_number, mpi::minimum(), 0);
}
return 0;
}
В обоих этих примерах у нас есть условие if/else следующего вида:
if(world.rank() == 0){
//gather or reduce operation
//Output
}else{
//gather or reduce operation
}
Чего я здесь не понимаю, так это разницы между коллективной операцией в if и whats в else? Есть разница в количестве параметров, но я не совсем понимаю, как работает логика.
Спасибо