mpi_pi.cpp (1182B)
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 if (0 == rank) { 26 double pi = sum; 27 double recv; 28 for (int r = 1; r < size; ++r) { 29 MPI_Recv(&recv, 30 1, 31 MPI_DOUBLE, 32 r, 33 123, 34 MPI_COMM_WORLD, 35 MPI_STATUS_IGNORE); 36 pi += recv; 37 } 38 std::cout << "pi = " << 4.0 * pi << '\n'; 39 } else { 40 MPI_Send(&sum, 1, MPI_DOUBLE, 0, 123, MPI_COMM_WORLD); 41 } 42 43 MPI_Finalize(); 44 return 0; 45 }