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.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 }