=============== Sample solution [TOC] =============== ---- CODE (type=cpp) ---------------------------------------------------------- template class MA, template class MB, Require>, Ge>> = true> int scatter_by_block(const MA& A, MB& B, int root, MPI_Comm grid) { int nof_processes; MPI_Comm_size(grid, &nof_processes); int rank; MPI_Comm_rank(grid, &rank); int dims[2]; int coords[2]; int periods[2]; MPI_Cart_get(grid, 2, dims, periods, coords); hpc::aux::UniformSlices rows(dims[0], A.numRows()); hpc::aux::UniformSlices columns(dims[1], A.numCols()); if (rank == root) { MPI_Request requests[nof_processes-1]; int ri = 0; for (int i = 0; i < nof_processes; ++i) { MPI_Cart_coords(grid, i, 2, coords); auto A_ = A.block(rows.offset(coords[0]), columns.offset(coords[1])).dim( rows.size(coords[0]), columns.size(coords[1])); if (i == root) { hpc::matvec::copy(A_, B); } else { MPI_Isend(&A_(0, 0), 1, get_type(A_), i, 0, grid, &requests[ri++]); } } for (auto& request: requests) { MPI_Status status; MPI_Wait(&request, &status); } } else { MPI_Status status; MPI_Recv(&B(0, 0), 1, get_type(B), root, 0, grid, &status); } } template typename MA, template typename MB, Require>, Ge>> = true> int gather_by_block(const MA& A, MB& B, int root, MPI_Comm grid) { int nof_processes; MPI_Comm_size(grid, &nof_processes); int rank; MPI_Comm_rank(grid, &rank); int dims[2]; int coords[2]; int periods[2]; MPI_Cart_get(grid, 2, dims, periods, coords); hpc::aux::UniformSlices rows(dims[0], B.numRows()); hpc::aux::UniformSlices columns(dims[1], B.numCols()); if (rank == root) { MPI_Request requests[nof_processes-1]; int ri = 0; for (int i = 0; i < nof_processes; ++i) { MPI_Cart_coords(grid, i, 2, coords); auto B_ = B.block(rows.offset(coords[0]), columns.offset(coords[1])).dim( rows.size(coords[0]), columns.size(coords[1])); if (i == root) { hpc::matvec::copy(A, B_); } else { MPI_Irecv(&B_(0, 0), 1, get_type(B_), i, 0, grid, &requests[ri++]); } } for (auto& request: requests) { MPI_Status status; MPI_Wait(&request, &status); } } else { MPI_Send(&A(0, 0), 1, get_type(A), root, 0, grid); } } ------------------------------------------------------------------------------- ---- SHELL (path=session07) --------------------------------------------------- mpic++ -g -std=c++17 -I/home/numerik/pub/pp/ss19/lib -o scatter-gather4 scatter-gather4.cpp mpirun -np 4 scatter-gather4 ------------------------------------------------------------------------------- ---- SHELL (path=session07,hostname=heim) ------------------------------------- OMPI_CXX=g++-8.3 mpic++ -g -std=c++17 -I/home/numerik/pub/pp/ss19/lib -o scatter-gather4 scatter-gather4.cpp -Wno-literal-suffix mpirun -np 4 scatter-gather4 ------------------------------------------------------------------------------- :navigate: up -> doc:index back -> doc:session07/page07 next -> doc:session07/page09