From 98df1910047ee49bd36a800594ea6b90a732d9e6 Mon Sep 17 00:00:00 2001 From: Arnaud Giersch Date: Tue, 19 Feb 2019 23:10:16 +0100 Subject: [PATCH] Define and use optimized variants for simcalls comm_testany and comm_waitany. --- include/simgrid/simix.h | 3 +++ src/msg/msg_gos.cpp | 8 ++++---- src/s4u/s4u_Comm.cpp | 26 ++++++++++++-------------- src/simix/libsmx.cpp | 12 ++++++++++++ src/smpi/mpi/smpi_request.cpp | 8 ++++---- 5 files changed, 35 insertions(+), 22 deletions(-) diff --git a/include/simgrid/simix.h b/include/simgrid/simix.h index a48968933c..fb1aa18073 100644 --- a/include/simgrid/simix.h +++ b/include/simgrid/simix.h @@ -227,9 +227,12 @@ XBT_PUBLIC smx_activity_t simcall_comm_iprobe(smx_mailbox_t mbox, int type, /* FIXME: waitany is going to be a vararg function, and should take a timeout */ XBT_PUBLIC unsigned int simcall_comm_waitany(smx_activity_t comms[], size_t count, double timeout); +XBT_PUBLIC unsigned int simcall_comm_waitany(simgrid::kernel::activity::CommImpl* comms[], size_t count, + double timeout); XBT_PUBLIC void simcall_comm_wait(const smx_activity_t& comm, double timeout); XBT_PUBLIC int simcall_comm_test(const smx_activity_t& comm); XBT_PUBLIC int simcall_comm_testany(smx_activity_t comms[], size_t count); +XBT_PUBLIC int simcall_comm_testany(simgrid::kernel::activity::CommImpl* comms[], size_t count); #endif /************************** Synchro simcalls **********************************/ diff --git a/src/msg/msg_gos.cpp b/src/msg/msg_gos.cpp index 47a947b863..fd90d4f4be 100644 --- a/src/msg/msg_gos.cpp +++ b/src/msg/msg_gos.cpp @@ -480,12 +480,12 @@ int MSG_comm_testany(xbt_dynar_t comms) int finished_index = -1; /* Create the equivalent array with SIMIX objects: */ - std::vector s_comms; + std::vector s_comms; s_comms.reserve(xbt_dynar_length(comms)); msg_comm_t comm; unsigned int cursor; xbt_dynar_foreach(comms, cursor, comm) { - s_comms.push_back(comm->s_comm); + s_comms.push_back(static_cast(comm->s_comm.get())); } msg_error_t status = MSG_OK; @@ -576,12 +576,12 @@ int MSG_comm_waitany(xbt_dynar_t comms) int finished_index = -1; /* Create the equivalent array with SIMIX objects: */ - std::vector s_comms; + std::vector s_comms; s_comms.reserve(xbt_dynar_length(comms)); msg_comm_t comm; unsigned int cursor; xbt_dynar_foreach(comms, cursor, comm) { - s_comms.push_back(comm->s_comm); + s_comms.push_back(static_cast(comm->s_comm.get())); } msg_error_t status = MSG_OK; diff --git a/src/s4u/s4u_Comm.cpp b/src/s4u/s4u_Comm.cpp index 24d6688f13..7d3a926e6d 100644 --- a/src/s4u/s4u_Comm.cpp +++ b/src/s4u/s4u_Comm.cpp @@ -31,13 +31,12 @@ Comm::~Comm() int Comm::wait_any_for(std::vector* comms, double timeout) { - smx_activity_t* array = new smx_activity_t[comms->size()]; - for (unsigned int i = 0; i < comms->size(); i++) { - array[i] = comms->at(i)->pimpl_; - } - int idx = simcall_comm_waitany(array, comms->size(), timeout); - delete[] array; - return idx; + std::unique_ptr rcomms( + new simgrid::kernel::activity::CommImpl*[comms->size()]); + std::transform(begin(*comms), end(*comms), rcomms.get(), [](const CommPtr& comm) { + return static_cast(comm->pimpl_.get()); + }); + return simcall_comm_waitany(rcomms.get(), comms->size(), timeout); } void Comm::wait_all(std::vector* comms) @@ -172,13 +171,12 @@ Comm* Comm::wait_for(double timeout) } int Comm::test_any(std::vector* comms) { - smx_activity_t* array = new smx_activity_t[comms->size()]; - for (unsigned int i = 0; i < comms->size(); i++) { - array[i] = comms->at(i)->pimpl_; - } - int res = simcall_comm_testany(array, comms->size()); - delete[] array; - return res; + std::unique_ptr rcomms( + new simgrid::kernel::activity::CommImpl*[comms->size()]); + std::transform(begin(*comms), end(*comms), rcomms.get(), [](const CommPtr& comm) { + return static_cast(comm->pimpl_.get()); + }); + return simcall_comm_testany(rcomms.get(), comms->size()); } Comm* Comm::detach() diff --git a/src/simix/libsmx.cpp b/src/simix/libsmx.cpp index 1da03e0235..a7461149a4 100644 --- a/src/simix/libsmx.cpp +++ b/src/simix/libsmx.cpp @@ -224,6 +224,11 @@ unsigned int simcall_comm_waitany(smx_activity_t comms[], size_t count, double t return simcall_BODY_comm_waitany(rcomms.get(), count, timeout); } +unsigned int simcall_comm_waitany(simgrid::kernel::activity::CommImpl* comms[], size_t count, double timeout) +{ + return simcall_BODY_comm_waitany(comms, count, timeout); +} + /** * @ingroup simix_comm_management */ @@ -238,6 +243,13 @@ int simcall_comm_testany(smx_activity_t comms[], size_t count) return simcall_BODY_comm_testany(rcomms.get(), count); } +int simcall_comm_testany(simgrid::kernel::activity::CommImpl* comms[], size_t count) +{ + if (count == 0) + return -1; + return simcall_BODY_comm_testany(comms, count); +} + /** * @ingroup simix_comm_management */ diff --git a/src/smpi/mpi/smpi_request.cpp b/src/smpi/mpi/smpi_request.cpp index 5dbc53b291..b9ba84893e 100644 --- a/src/smpi/mpi/smpi_request.cpp +++ b/src/smpi/mpi/smpi_request.cpp @@ -603,7 +603,7 @@ int Request::testsome(int incount, MPI_Request requests[], int *indices, MPI_Sta int Request::testany(int count, MPI_Request requests[], int *index, MPI_Status * status) { - std::vector comms; + std::vector comms; comms.reserve(count); int i; @@ -614,7 +614,7 @@ int Request::testany(int count, MPI_Request requests[], int *index, MPI_Status * std::vector map; /** Maps all matching comms back to their location in requests **/ for(i = 0; i < count; i++) { if ((requests[i] != MPI_REQUEST_NULL) && requests[i]->action_ && not(requests[i]->flags_ & MPI_REQ_PREPARED)) { - comms.push_back(requests[i]->action_); + comms.push_back(static_cast(requests[i]->action_.get())); map.push_back(i); } } @@ -842,7 +842,7 @@ void Request::wait(MPI_Request * request, MPI_Status * status) int Request::waitany(int count, MPI_Request requests[], MPI_Status * status) { - std::vector comms; + std::vector comms; comms.reserve(count); int index = MPI_UNDEFINED; @@ -855,7 +855,7 @@ int Request::waitany(int count, MPI_Request requests[], MPI_Status * status) not(requests[i]->flags_ & MPI_REQ_FINISHED)) { if (requests[i]->action_ != nullptr) { XBT_DEBUG("Waiting any %p ", requests[i]); - comms.push_back(requests[i]->action_); + comms.push_back(static_cast(requests[i]->action_.get())); map.push_back(i); } else { // This is a finished detached request, let's return this one -- 2.20.1