Skip to content
P2PCommunicator.cpp 1.16 KiB
Newer Older
#include "P2PCommunicator.hpp"

void P2PCommunicator::Communicate(State* model) {
	AsyncCommunicate(model).Wait();
}

Communicator::MpiRequest P2PCommunicator::AsyncCommunicate(State* model) {
	Communicator::MpiRequest::DoubleVector<MPI_Request> reqs;
	for (std::size_t i{0}; i < _neighbors.size(); ++i) {
		{
			MPI_Request req;
			MPI_Isend(model + _sendDisplacements[i], // buf
			          1,                             // count
			          _sendTypes[i],                 // datatype
			          _neighbors[i],                 // dest
			          0,                             // tag
			          MPI_COMM_WORLD,                // comm
			          &req);                         // request
			reqs.push_back(req);
		}

		{
			MPI_Request req;
			MPI_Irecv(model + _recvDisplacements[i], // buf
			          1,                             // count
			          _recvTypes[i],                 // datatype
			          _neighbors[i],                 // source
			          0,                             // tag
			          MPI_COMM_WORLD,                // comm
			          &req);                         // request
			reqs.push_back(req);
		}
	}
	return MpiRequest{reqs};
}