X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/68f707462521f974a8839675ab66e3527125ccbc..d5cc61332edae35867a41bb38ad9401faaab2716:/src/smpi/colls/smpi_coll.cpp diff --git a/src/smpi/colls/smpi_coll.cpp b/src/smpi/colls/smpi_coll.cpp index 36eca5fc52..4cd2155046 100644 --- a/src/smpi/colls/smpi_coll.cpp +++ b/src/smpi/colls/smpi_coll.cpp @@ -115,46 +115,27 @@ void Colls::set_collectives(){ } } +//Implementations of the single algorithm collectives -//Implementations of the single algorith collectives - -int Colls::gatherv(void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int *recvcounts, int *displs, +int Colls::gatherv(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, const int *recvcounts, const int *displs, MPI_Datatype recvtype, int root, MPI_Comm comm) { MPI_Request request; Colls::igatherv(sendbuf, sendcount, sendtype, recvbuf, recvcounts, displs, recvtype, root, comm, &request); - MPI_Request* requests = request->get_nbc_requests(); - int count = request->get_nbc_requests_size(); - Request::waitall(count, requests, MPI_STATUS_IGNORE); - for (int i = 0; i < count; i++) { - if(requests[i]!=MPI_REQUEST_NULL) - Request::unref(&requests[i]); - } - delete[] requests; - Request::unref(&request); - return MPI_SUCCESS; + return Request::wait(&request, MPI_STATUS_IGNORE); } -int Colls::scatterv(void *sendbuf, int *sendcounts, int *displs, MPI_Datatype sendtype, void *recvbuf, int recvcount, +int Colls::scatterv(const void *sendbuf, const int *sendcounts, const int *displs, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm) { MPI_Request request; Colls::iscatterv(sendbuf, sendcounts, displs, sendtype, recvbuf, recvcount, recvtype, root, comm, &request); - MPI_Request* requests = request->get_nbc_requests(); - int count = request->get_nbc_requests_size(); - Request::waitall(count, requests, MPI_STATUS_IGNORE); - for (int dst = 0; dst < count; dst++) { - if(requests[dst]!=MPI_REQUEST_NULL) - Request::unref(&requests[dst]); - } - delete[] requests; - Request::unref(&request); - return MPI_SUCCESS; + return Request::wait(&request, MPI_STATUS_IGNORE); } -int Colls::scan(void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm) +int Colls::scan(const void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm) { int system_tag = -888; MPI_Aint lb = 0; @@ -169,8 +150,8 @@ int Colls::scan(void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, Datatype::copy(sendbuf, count, datatype, recvbuf, count, datatype); // Send/Recv buffers to/from others - MPI_Request *requests = xbt_new(MPI_Request, size - 1); - void **tmpbufs = xbt_new(void *, rank); + MPI_Request* requests = new MPI_Request[size - 1]; + void** tmpbufs = new void*[rank]; int index = 0; for (int other = 0; other < rank; other++) { tmpbufs[index] = smpi_get_tmp_sendbuffer(count * dataext); @@ -210,12 +191,12 @@ int Colls::scan(void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, for(index = 0; index < size-1; index++) { Request::unref(&requests[index]); } - xbt_free(tmpbufs); - xbt_free(requests); + delete[] tmpbufs; + delete[] requests; return MPI_SUCCESS; } -int Colls::exscan(void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm) +int Colls::exscan(const void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm) { int system_tag = -888; MPI_Aint lb = 0; @@ -227,8 +208,8 @@ int Colls::exscan(void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype datatype->extent(&lb, &dataext); // Send/Recv buffers to/from others - MPI_Request *requests = xbt_new(MPI_Request, size - 1); - void **tmpbufs = xbt_new(void *, rank); + MPI_Request* requests = new MPI_Request[size - 1]; + void** tmpbufs = new void*[rank]; int index = 0; for (int other = 0; other < rank; other++) { tmpbufs[index] = smpi_get_tmp_sendbuffer(count * dataext); @@ -277,27 +258,17 @@ int Colls::exscan(void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype for(index = 0; index < size-1; index++) { Request::unref(&requests[index]); } - xbt_free(tmpbufs); - xbt_free(requests); + delete[] tmpbufs; + delete[] requests; return MPI_SUCCESS; } -int Colls::alltoallw(void *sendbuf, int *sendcounts, int *senddisps, MPI_Datatype* sendtypes, - void *recvbuf, int *recvcounts, int *recvdisps, MPI_Datatype* recvtypes, MPI_Comm comm) +int Colls::alltoallw(const void *sendbuf, const int *sendcounts, const int *senddisps, const MPI_Datatype* sendtypes, + void *recvbuf, const int *recvcounts, const int *recvdisps, const MPI_Datatype* recvtypes, MPI_Comm comm) { MPI_Request request; - int err = Colls::ialltoallw(sendbuf, sendcounts, senddisps, sendtypes, recvbuf, recvcounts, recvdisps, recvtypes, comm, &request); - MPI_Request* requests = request->get_nbc_requests(); - int count = request->get_nbc_requests_size(); - XBT_DEBUG("<%d> wait for %d requests", comm->rank(), count); - Request::waitall(count, requests, MPI_STATUS_IGNORE); - for (int i = 0; i < count; i++) { - if(requests[i]!=MPI_REQUEST_NULL) - Request::unref(&requests[i]); - } - delete[] requests; - Request::unref(&request); - return err; + Colls::ialltoallw(sendbuf, sendcounts, senddisps, sendtypes, recvbuf, recvcounts, recvdisps, recvtypes, comm, &request); + return Request::wait(&request, MPI_STATUS_IGNORE); } }