================ Lösungsvorschlag ================ ---- CODE (type=cpp) ---------------------------------------------------------- template typename std::enable_if< hpc::matvec::IsGeMatrix::value && hpc::matvec::IsGeMatrix::value && std::is_same::value, int>::type scatter_by_row(const MA& A, MB& B, int root, MPI_Comm comm) { assert(A.numCols == B.numCols); int nof_processes; MPI_Comm_size(comm, &nof_processes); int rank; MPI_Comm_rank(comm, &rank); hpc::aux::Slices slices(nof_processes, A.numRows); std::vector counts(nof_processes); std::vector offsets(nof_processes); MPI_Datatype rowtype_A = get_row_type(A); for (int i = 0; i < nof_processes; ++i) { if (i < A.numRows) { counts[i] = slices.size(i); offsets[i] = slices.offset(i); } else { counts[i] = 0; offsets[i] = 0; } } int recvcount = counts[rank]; assert(B.numRows == recvcount); MPI_Datatype rowtype_B = get_row_type(B); /* OpenMPI implementation of Debian wheezy expects void* instead of const void*; hence we need to remove const */ return MPI_Scatterv((void*) &A(0, 0), &counts[0], &offsets[0], rowtype_A, &B(0, 0), recvcount, rowtype_B, root, comm); } template typename std::enable_if< hpc::matvec::IsGeMatrix::value && hpc::matvec::IsGeMatrix::value && std::is_same::value, int>::type gather_by_row(const MA& A, MB& B, int root, MPI_Comm comm) { assert(A.numCols == B.numCols); int nof_processes; MPI_Comm_size(comm, &nof_processes); int rank; MPI_Comm_rank(comm, &rank); hpc::aux::Slices slices(nof_processes, B.numRows); std::vector counts(nof_processes); std::vector offsets(nof_processes); for (int i = 0; i < nof_processes; ++i) { if (i < B.numRows) { counts[i] = slices.size(i); offsets[i] = slices.offset(i); } else { counts[i] = 0; offsets[i] = 0; } } int sendcount = counts[rank]; assert(A.numRows == sendcount); MPI_Datatype rowtype_A = get_row_type(A); MPI_Datatype rowtype_B = get_row_type(B); /* OpenMPI implementation of Debian wheezy expects void* instead of const void*; hence we need to remove const */ return MPI_Gatherv((void*) &A(0, 0), sendcount, rowtype_A, &B(0, 0), &counts[0], &offsets[0], rowtype_B, root, comm); } ------------------------------------------------------------------------------- :navigate: up -> doc:index back -> doc:session22/page03 next -> doc:session22/page05