Skip to content

Commit

Permalink
mpi: make local fast path faster
Browse files Browse the repository at this point in the history
  • Loading branch information
csegarragonz committed Feb 15, 2024
1 parent fb3816e commit 9ece9e1
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 8 deletions.
30 changes: 24 additions & 6 deletions src/mpi/MpiWorld.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -516,9 +516,7 @@ void MpiWorld::send(int sendRank,
m->set_messagetype(messageType);

// Set up message data
if (count > 0 && buffer != nullptr) {
m->set_buffer(buffer, dataType->size * count);
}
bool mustSendData = count > 0 && buffer != nullptr;

// Mock the message sending in tests
if (faabric::util::isMockMode()) {
Expand All @@ -528,10 +526,22 @@ void MpiWorld::send(int sendRank,

// Dispatch the message locally or globally
if (isLocal) {
void* bufferPtr = malloc(count * dataType->size);
std::memcpy(bufferPtr, buffer, count* dataType->size);

if (mustSendData) {
m->set_bufferptr((uint64_t)bufferPtr);
}
SPDLOG_INFO("Send (Ptr: {} - Size: {} - Data as int: {})", m->bufferptr(), count * dataType->size, ((int*)m->bufferptr())[0]);

SPDLOG_TRACE(
"MPI - send {} -> {} ({})", sendRank, recvRank, messageType);
getLocalQueue(sendRank, recvRank)->enqueue(std::move(m));
} else {
if (mustSendData) {
m->set_buffer(buffer, dataType->size * count);
}

SPDLOG_TRACE(
"MPI - send remote {} -> {} ({})", sendRank, recvRank, messageType);
sendRemoteMpiMessage(otherHost, sendRank, recvRank, m);
Expand Down Expand Up @@ -596,10 +606,18 @@ void MpiWorld::doRecv(std::shared_ptr<MPIMessage>& m,
assert(m->messagetype() == messageType);
assert(m->count() <= count);

// TODO - avoid copy here
// Copy message data
const std::string otherHost = getHostForRank(m->destination());
bool isLocal = otherHost == thisHost;

if (m->count() > 0) {
std::move(m->buffer().begin(), m->buffer().end(), buffer);
if (isLocal) {
SPDLOG_INFO("Recv (Ptr: {} - Size: {} - Data as int: {})", m->bufferptr(), count * dataType->size, ((int*)m->bufferptr())[0]);
std::memcpy(buffer, (void*)m->bufferptr(), count * dataType->size);
free((void*)m->bufferptr());
} else {
// TODO - avoid copy here
std::move(m->buffer().begin(), m->buffer().end(), buffer);
}
}

// Set status values if required
Expand Down
7 changes: 6 additions & 1 deletion src/mpi/mpi.proto
Original file line number Diff line number Diff line change
Expand Up @@ -26,5 +26,10 @@ message MPIMessage {
int32 destination = 5;
int32 type = 6;
int32 count = 7;
bytes buffer = 8;

// For remote messaging
optional bytes buffer = 8;

// For local messaging
optional int64 bufferPtr = 9;
}
5 changes: 4 additions & 1 deletion tests/test/mpi/test_mpi_world.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -241,6 +241,7 @@ TEST_CASE_METHOD(MpiTestFixture, "Test send and recv on same host", "[mpi]")
world.send(
rankA1, rankA2, BYTES(messageData.data()), MPI_INT, messageData.size());

/*
SECTION("Test queueing")
{
// Check the message itself is on the right queue
Expand All @@ -255,6 +256,7 @@ TEST_CASE_METHOD(MpiTestFixture, "Test send and recv on same host", "[mpi]")
MPIMessage actualMessage = *(queueA2->dequeue());
checkMessage(actualMessage, worldId, rankA1, rankA2, messageData);
}
*/

SECTION("Test recv")
{
Expand Down Expand Up @@ -342,7 +344,7 @@ TEST_CASE_METHOD(MpiTestFixture, "Test ring sendrecv", "[mpi]")
int rank = ranks[i];
int left = rank > 0 ? rank - 1 : ranks.size() - 1;
int right = (rank + 1) % ranks.size();
threads.emplace_back([&, left, right, i] {
threads.emplace_back([&, ranks, left, right, i] {
int recvData = -1;
int rank = ranks[i];
world.sendRecv(BYTES(&rank),
Expand All @@ -357,6 +359,7 @@ TEST_CASE_METHOD(MpiTestFixture, "Test ring sendrecv", "[mpi]")
&status);
// Test integrity of results
// TODO - no REQUIRE in the test case now
SPDLOG_INFO("Received: {} - Expected: {}", recvData, left);
assert(recvData == left);
});
}
Expand Down

0 comments on commit 9ece9e1

Please sign in to comment.