mpi_pi_reduction_inplace.cpp (963B)
1 #include <iostream> 2 #include <mpi.h> 3 4 int main(int argc, char* argv[]) 5 { 6 int rank, size; 7 MPI_Init(&argc, &argv); 8 MPI_Comm_rank(MPI_COMM_WORLD, &rank); 9 MPI_Comm_size(MPI_COMM_WORLD, &size); 10 11 const size_t n = 100000000; 12 13 // domain decomposition 14 const size_t chunk_size = (n + size - 1) / size; 15 const size_t my_start = rank * chunk_size; 16 const size_t my_end = std::min((rank + 1) * chunk_size, n); 17 18 // partial sum 19 double sum = 0.0; // rank local sum (on each process, no race condition!) 20 for (size_t k = my_start; k < my_end; ++k) { 21 sum += (1.0 - 2.0 * (k % 2)) / (2.0 * k + 1.0); 22 } 23 24 // reduction 25 MPI_Reduce((0 == rank) ? MPI_IN_PLACE : &sum, 26 &sum, 27 1, 28 MPI_DOUBLE, 29 MPI_SUM, 30 0, 31 MPI_COMM_WORLD); 32 if (0 == rank) { 33 std::cout << "pi = " << 4.0 * sum << '\n'; 34 } 35 36 MPI_Finalize(); 37 return 0; 38 }