mpi_pi_reduction.cpp (863B)
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 double pi = 0.0; 26 MPI_Reduce(&sum, &pi, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); 27 if (0 == rank) { 28 std::cout << "pi = " << 4.0 * pi << '\n'; 29 } 30 31 MPI_Finalize(); 32 return 0; 33 }