Skip to content
CollectiveCommunicator.cpp 1.6 KiB
Newer Older
#include "CollectiveCommunicator.hpp"

void CollectiveCommunicator::Communicate(State* model) {
	if (_commDistGraph == MPI_COMM_NULL)
		MpiReportErrorAbort("Communicator not initialized");

	MPI_Neighbor_alltoallw(model,                     // sendbuf
	                       _sizes.data(),             // sendcounts
	                       _sendDisplacements.data(), // sdispl
	                       _sendTypes.data(),         // sendtypes
	                       model,                     // recvbuf
	                       _sizes.data(),             // recvcounts
	                       _recvDisplacements.data(), // rdispls
	                       _recvTypes.data(),         // recvtypes
	                       _commDistGraph             // comm
	                       );
}

Communicator::MpiRequest CollectiveCommunicator::AsyncCommunicate(State* model) {
	if (_commDistGraph == MPI_COMM_NULL)
		MpiReportErrorAbort("Communicator not initialized");

	MPI_Request req;
	MPI_Ineighbor_alltoallw(model,                     // sendbuf
	                        _sizes.data(),             // sendcounts
	                        _sendDisplacements.data(), // sdispl
	                        _sendTypes.data(),         // sendtypes
	                        model,                     // recvbuf
	                        _sizes.data(),             // recvcounts
	                        _recvDisplacements.data(), // rdispls
	                        _recvTypes.data(),         // recvtypes
	                        _commDistGraph,            // comm
	                        &req);                     // request
	return MpiRequest{{req}};
}