cs205-lecture-examples

Example codes used during Harvard CS205 lectures
git clone https://git.0xfab.ch/cs205-lecture-examples.git
Log | Files | Refs | README | LICENSE

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 }