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