#include #include #include #include #include int main(int argc, char** argv) { MPI_Init(&argc, &argv); int nof_processes; MPI_Comm_size(MPI_COMM_WORLD, &nof_processes); int rank; MPI_Comm_rank(MPI_COMM_WORLD, &rank); using namespace hpc::matvec; using namespace hpc::mpi; using Matrix = GeMatrix; int share = 3; int num_rows = nof_processes * share; int num_cols = 5; Matrix B(share, num_cols, Order::RowMajor); /* individual share */ if (rank == 0) { Matrix A(num_rows, num_cols); /* entire matrix */ for (auto [i, j, Aij]: A) { Aij = i * 100 + j; } /* using MPI_Scatter: scatter A / receive our share into B */ for (auto [i, j, Bij]: B) { Bij += 10000 * (rank + 1); (void) i; (void) j; // suppress gcc warning } /* using MPI_Gather: gather into A / send our share from B */ print(A, " %6g"); } else { /* using MPI_Scatter: receive our share into B */ for (auto [i, j, Bij]: B) { Bij += 10000 * (rank + 1); (void) i; (void) j; // suppress gcc warning } /* using MPI_Gather: send our share from B */ } MPI_Finalize(); }