1 #if COMPILATION_INSTRUCTIONS
2 mpicxx -O3 -std=c++17 `#-Wfatal-errors` $0 -o $0x.x && time mpirun -np 4 $0x.x $@ && rm -f $0x.x; exit
3 #endif
4 // based on https://computing.llnl.gov/tutorials/mpi/samples/C/mpi_array.c
5 #include "alf/boost/mpi3/main.hpp"
6 #include "alf/boost/mpi3/version.hpp"
7 #include "alf/boost/mpi3/processor_name.hpp"
8
9 #include<iostream>
10
11 using std::cout;
12 using std::endl;
13
update(std::vector<double> & data,int offset,int chunk_size)14 double update(std::vector<double>& data, int offset, int chunk_size){
15 double sum = 0;
16 for(int i = offset; i != offset + chunk_size; ++i){
17 data[i] += i*1.0;
18 sum += data[i];
19 }
20 return sum;
21 }
22
main(int argc,char * argv[],boost::mpi3::communicator const & world)23 int boost::mpi3::main(int argc, char* argv[], boost::mpi3::communicator const& world){
24 if(world.size() % 4 != 0){
25 if(world.master()) cout << "Quitting. Need an even number of tasks: numtasks = " << world.size() << std::endl;
26 return 1;
27 }
28
29 int const array_size = 16000000;
30 int chunk_size = array_size/world.size();
31
32 if(world.master()){
33 std::vector<double> data(array_size);
34 {
35 double sum = 0;
36 for(int i = 0; i != data.size(); ++i){
37 data[i] = i*1.0;
38 sum += data[i];
39 }
40 cout << "serial sum " << sum << endl;
41 }
42
43 int offset = chunk_size;
44 for(int dest = 1; dest != world.size(); ++dest){
45 world.send_n(data.begin() + offset, chunk_size, dest);
46 offset += chunk_size;
47 }
48
49 double partial_sum = 0;
50 for(int i = 0; i != chunk_size; ++i)
51 partial_sum += data[i];
52
53 double parallel_sum = world.reduce(partial_sum);
54 cout << "parallel sum is " << parallel_sum << endl;
55 }else{
56 std::vector<double> partial_data(chunk_size);
57 world.receive_n(partial_data.begin(), chunk_size, 0);
58
59 double partial_sum = 0;
60 for(int i = 0; i != partial_data.size(); ++i)
61 partial_sum += partial_data[i];
62
63 world.reduce(partial_sum);
64 }
65
66
67 }
68
69