#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 */ MPI_Datatype rowtype_B = get_row_type(B); if (rank == 0) { Matrix A(num_rows, num_cols); /* entire matrix */ for (auto [i, j, Aij]: A) { Aij = i * 100 + j; } MPI_Datatype rowtype_A = get_row_type(A); MPI_Scatter(&A(0, 0), share, rowtype_A, &B(0, 0), share, rowtype_B, 0, MPI_COMM_WORLD); for (auto [i, j, Bij]: B) { Bij += 10000 * (rank + 1); (void) i; (void) j; // suppress gcc warning } MPI_Gather(&B(0, 0), share, rowtype_B, &A(0, 0), share, rowtype_A, 0, MPI_COMM_WORLD); print(A, " %6g"); } else { MPI_Scatter(nullptr, 0, nullptr, /* ignored parameters */ &B(0, 0), share, rowtype_B, 0, MPI_COMM_WORLD); for (auto [i, j, Bij]: B) { B(i, j) += 10000 * (rank + 1); (void) i; (void) j; // suppress gcc warning } MPI_Gather(&B(0, 0), share, rowtype_B, nullptr, 0, nullptr, /* ignored parameters */ 0, MPI_COMM_WORLD); } MPI_Finalize(); }