X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/af04b9f138fd2e3cdac1752e4e8bf94b7ccec1fc..6302d9298b1dd180f6112a141d12e6ec7cf498d3:/src/smpi/bindings/smpi_pmpi_coll.cpp diff --git a/src/smpi/bindings/smpi_pmpi_coll.cpp b/src/smpi/bindings/smpi_pmpi_coll.cpp index f71f6c6b4d..aaf32c3441 100644 --- a/src/smpi/bindings/smpi_pmpi_coll.cpp +++ b/src/smpi/bindings/smpi_pmpi_coll.cpp @@ -27,14 +27,10 @@ int PMPI_Bcast(void *buf, int count, MPI_Datatype datatype, int root, MPI_Comm c retval = MPI_ERR_ARG; } else { int rank = smpi_process()->index(); - int root_traced = comm->group()->index(root); - - instr_extra_data extra = xbt_new0(s_instr_extra_data_t, 1); - extra->type = TRACING_BCAST; - extra->root = root_traced; - extra->datatype1 = encode_datatype(datatype); - extra->send_size = datatype->is_basic() ? count : count * datatype->size(); - TRACE_smpi_comm_in(rank, __FUNCTION__, extra); + TRACE_smpi_comm_in(rank, __FUNCTION__, + new simgrid::instr::CollTIData("bcast", comm->group()->index(root), -1.0, + datatype->is_basic() ? count : count * datatype->size(), -1, + encode_datatype(datatype), "")); if (comm->size() > 1) simgrid::smpi::Colls::bcast(buf, count, datatype, root, comm); retval = MPI_SUCCESS; @@ -54,10 +50,8 @@ int PMPI_Barrier(MPI_Comm comm) if (comm == MPI_COMM_NULL) { retval = MPI_ERR_COMM; } else { - int rank = smpi_process()->index(); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t, 1); - extra->type = TRACING_BARRIER; - TRACE_smpi_comm_in(rank, __FUNCTION__, extra); + int rank = smpi_process()->index(); + TRACE_smpi_comm_in(rank, __FUNCTION__, new simgrid::instr::NoOpTIData("barrier")); simgrid::smpi::Colls::barrier(comm); @@ -97,17 +91,13 @@ int PMPI_Gather(void *sendbuf, int sendcount, MPI_Datatype sendtype,void *recvbu sendtmptype=recvtype; } int rank = smpi_process()->index(); - int root_traced = comm->group()->index(root); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t, 1); - extra->type = TRACING_GATHER; - extra->root = root_traced; - - extra->datatype1 = encode_datatype(sendtmptype); - extra->send_size = sendtmptype->is_basic() ? sendtmpcount : sendtmpcount * sendtmptype->size(); - extra->datatype2 = encode_datatype(recvtype); - extra->recv_size = (comm->rank() != root || recvtype->is_basic()) ? recvcount : recvcount * recvtype->size(); - TRACE_smpi_comm_in(rank, __FUNCTION__, extra); + TRACE_smpi_comm_in(rank, __FUNCTION__, + new simgrid::instr::CollTIData( + "gather", comm->group()->index(root), -1.0, + sendtmptype->is_basic() ? sendtmpcount : sendtmpcount * sendtmptype->size(), + (comm->rank() != root || recvtype->is_basic()) ? recvcount : recvcount * recvtype->size(), + encode_datatype(sendtmptype), encode_datatype(recvtype))); simgrid::smpi::Colls::gather(sendtmpbuf, sendtmpcount, sendtmptype, recvbuf, recvcount, recvtype, root, comm); @@ -144,24 +134,21 @@ int PMPI_Gatherv(void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recv sendtmptype=recvtype; } - int rank = smpi_process()->index(); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t, 1); - extra->type = TRACING_GATHERV; - extra->num_processes = comm->size(); - extra->root = comm->group()->index(root); - - extra->datatype1 = encode_datatype(sendtmptype); - extra->send_size = sendtmptype->is_basic() ? sendtmpcount : sendtmpcount * sendtmptype->size(); - extra->datatype2 = encode_datatype(recvtype); + int rank = smpi_process()->index(); int dt_size_recv = recvtype->is_basic() ? 1 : recvtype->size(); + std::vector* trace_recvcounts = new std::vector; if (comm->rank() == root) { - extra->recvcounts = new int[extra->num_processes]; - for (int i = 0; i < extra->num_processes; i++) // copy data to avoid bad free - extra->recvcounts[i] = recvcounts[i] * dt_size_recv; + for (int i = 0; i < comm->size(); i++) // copy data to avoid bad free + trace_recvcounts->push_back(recvcounts[i] * dt_size_recv); } - TRACE_smpi_comm_in(rank, __FUNCTION__, extra); + TRACE_smpi_comm_in(rank, __FUNCTION__, + new simgrid::instr::VarCollTIData( + "gatherV", comm->group()->index(root), + sendtmptype->is_basic() ? sendtmpcount : sendtmpcount * sendtmptype->size(), nullptr, + dt_size_recv, trace_recvcounts, encode_datatype(sendtmptype), encode_datatype(recvtype))); + retval = simgrid::smpi::Colls::gatherv(sendtmpbuf, sendtmpcount, sendtmptype, recvbuf, recvcounts, displs, recvtype, root, comm); TRACE_smpi_comm_out(rank); } @@ -173,7 +160,7 @@ int PMPI_Gatherv(void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recv int PMPI_Allgather(void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, MPI_Comm comm) { - int retval = 0; + int retval = MPI_SUCCESS; smpi_bench_end(); @@ -192,18 +179,14 @@ int PMPI_Allgather(void *sendbuf, int sendcount, MPI_Datatype sendtype, sendtype=recvtype; } int rank = smpi_process()->index(); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t, 1); - extra->type = TRACING_ALLGATHER; - extra->datatype1 = encode_datatype(sendtype); - extra->send_size = sendtype->is_basic() ? sendcount : sendcount * sendtype->size(); - extra->datatype2 = encode_datatype(recvtype); - extra->recv_size = recvtype->is_basic() ? recvcount : recvcount * recvtype->size(); - - TRACE_smpi_comm_in(rank, __FUNCTION__, extra); + TRACE_smpi_comm_in(rank, __FUNCTION__, + new simgrid::instr::CollTIData("allGather", -1, -1.0, + sendtype->is_basic() ? sendcount : sendcount * sendtype->size(), + recvtype->is_basic() ? recvcount : recvcount * recvtype->size(), + encode_datatype(sendtype), encode_datatype(recvtype))); simgrid::smpi::Colls::allgather(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm); - retval = MPI_SUCCESS; TRACE_smpi_comm_out(rank); } smpi_bench_begin(); @@ -233,19 +216,16 @@ int PMPI_Allgatherv(void *sendbuf, int sendcount, MPI_Datatype sendtype, sendtype=recvtype; } int rank = smpi_process()->index(); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t, 1); - extra->type = TRACING_ALLGATHERV; - extra->num_processes = comm->size(); - extra->datatype1 = encode_datatype(sendtype); - extra->send_size = sendtype->is_basic() ? sendcount : sendcount * sendtype->size(); - extra->datatype2 = encode_datatype(recvtype); int dt_size_recv = recvtype->is_basic() ? 1 : recvtype->size(); - extra->recvcounts = new int[extra->num_processes]; - for (int i = 0; i < extra->num_processes; i++) // copy data to avoid bad free - extra->recvcounts[i] = recvcounts[i] * dt_size_recv; + std::vector* trace_recvcounts = new std::vector; + for (int i = 0; i < comm->size(); i++) // copy data to avoid bad free + trace_recvcounts->push_back(recvcounts[i] * dt_size_recv); - TRACE_smpi_comm_in(rank, __FUNCTION__, extra); + TRACE_smpi_comm_in(rank, __FUNCTION__, + new simgrid::instr::VarCollTIData( + "allGatherV", -1, sendtype->is_basic() ? sendcount : sendcount * sendtype->size(), nullptr, + dt_size_recv, trace_recvcounts, encode_datatype(sendtype), encode_datatype(recvtype))); simgrid::smpi::Colls::allgatherv(sendbuf, sendcount, sendtype, recvbuf, recvcounts, displs, recvtype, comm); retval = MPI_SUCCESS; @@ -278,17 +258,13 @@ int PMPI_Scatter(void *sendbuf, int sendcount, MPI_Datatype sendtype, recvcount = sendcount; } int rank = smpi_process()->index(); - int root_traced = comm->group()->index(root); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t, 1); - extra->type = TRACING_SCATTER; - extra->root = root_traced; - - extra->datatype1 = encode_datatype(sendtype); - extra->send_size = (comm->rank() != root || sendtype->is_basic()) ? sendcount : sendcount * sendtype->size(); - extra->datatype2 = encode_datatype(recvtype); - extra->recv_size = recvtype->is_basic() ? recvcount : recvcount * recvtype->size(); - TRACE_smpi_comm_in(rank, __FUNCTION__, extra); + TRACE_smpi_comm_in(rank, __FUNCTION__, + new simgrid::instr::CollTIData( + "scatter", comm->group()->index(root), -1.0, + (comm->rank() != root || sendtype->is_basic()) ? sendcount : sendcount * sendtype->size(), + recvtype->is_basic() ? recvcount : recvcount * recvtype->size(), encode_datatype(sendtype), + encode_datatype(recvtype))); simgrid::smpi::Colls::scatter(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm); retval = MPI_SUCCESS; @@ -319,21 +295,18 @@ int PMPI_Scatterv(void *sendbuf, int *sendcounts, int *displs, recvcount = sendcounts[comm->rank()]; } int rank = smpi_process()->index(); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t, 1); - extra->type = TRACING_SCATTERV; - extra->num_processes = comm->size(); - extra->root = comm->group()->index(root); - extra->datatype1 = encode_datatype(sendtype); - extra->datatype2 = encode_datatype(recvtype); int dt_size_send = sendtype->is_basic() ? 1 : sendtype->size(); - extra->recv_size = recvtype->is_basic() ? recvcount : recvcount * recvtype->size(); + + std::vector* trace_sendcounts = new std::vector; if (comm->rank() == root) { - extra->sendcounts = new int[extra->num_processes]; - for (int i = 0; i < extra->num_processes; i++) // copy data to avoid bad free - extra->sendcounts[i] = sendcounts[i] * dt_size_send; + for (int i = 0; i < comm->size(); i++) // copy data to avoid bad free + trace_sendcounts->push_back(sendcounts[i] * dt_size_send); } - TRACE_smpi_comm_in(rank, __FUNCTION__, extra); + TRACE_smpi_comm_in(rank, __FUNCTION__, new simgrid::instr::VarCollTIData( + "scatterV", comm->group()->index(root), dt_size_send, trace_sendcounts, + recvtype->is_basic() ? recvcount : recvcount * recvtype->size(), nullptr, + encode_datatype(sendtype), encode_datatype(recvtype))); retval = simgrid::smpi::Colls::scatterv(sendbuf, sendcounts, displs, sendtype, recvbuf, recvcount, recvtype, root, comm); @@ -357,13 +330,10 @@ int PMPI_Reduce(void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, } else { int rank = smpi_process()->index(); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t, 1); - extra->root = comm->group()->index(root); - extra->type = TRACING_REDUCE; - extra->datatype1 = encode_datatype(datatype); - extra->send_size = datatype->is_basic() ? count : count * datatype->size(); - - TRACE_smpi_comm_in(rank, __FUNCTION__, extra); + TRACE_smpi_comm_in(rank, __FUNCTION__, + new simgrid::instr::CollTIData("reduce", comm->group()->index(root), 0, + datatype->is_basic() ? count : count * datatype->size(), -1, + encode_datatype(datatype), "")); simgrid::smpi::Colls::reduce(sendbuf, recvbuf, count, datatype, op, root, comm); @@ -409,13 +379,11 @@ int PMPI_Allreduce(void *sendbuf, void *recvbuf, int count, MPI_Datatype datatyp simgrid::smpi::Datatype::copy(recvbuf, count, datatype,sendtmpbuf, count, datatype); } int rank = smpi_process()->index(); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t, 1); - extra->type = TRACING_ALLREDUCE; - extra->datatype1 = encode_datatype(datatype); - extra->send_size = datatype->is_basic() ? count : count * datatype->size(); - - TRACE_smpi_comm_in(rank, __FUNCTION__, extra); + TRACE_smpi_comm_in(rank, __FUNCTION__, + new simgrid::instr::CollTIData("allReduce", -1, 0, + datatype->is_basic() ? count : count * datatype->size(), -1, + encode_datatype(datatype), "")); simgrid::smpi::Colls::allreduce(sendtmpbuf, recvbuf, count, datatype, op, comm); @@ -444,13 +412,10 @@ int PMPI_Scan(void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MP retval = MPI_ERR_OP; } else { int rank = smpi_process()->index(); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t, 1); - extra->type = TRACING_SCAN; - - extra->datatype1 = encode_datatype(datatype); - extra->send_size = datatype->is_basic() ? count : count * datatype->size(); - TRACE_smpi_comm_in(rank, __FUNCTION__, extra); + TRACE_smpi_comm_in(rank, __FUNCTION__, new simgrid::instr::Pt2PtTIData( + "scan", -1, datatype->is_basic() ? count : count * datatype->size(), + encode_datatype(datatype))); retval = simgrid::smpi::Colls::scan(sendbuf, recvbuf, count, datatype, op, comm); @@ -474,16 +439,15 @@ int PMPI_Exscan(void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, retval = MPI_ERR_OP; } else { int rank = smpi_process()->index(); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t, 1); - extra->type = TRACING_EXSCAN; - extra->datatype1 = encode_datatype(datatype); - extra->send_size = datatype->is_basic() ? count : count * datatype->size(); void* sendtmpbuf = sendbuf; if (sendbuf == MPI_IN_PLACE) { sendtmpbuf = static_cast(xbt_malloc(count * datatype->size())); memcpy(sendtmpbuf, recvbuf, count * datatype->size()); } - TRACE_smpi_comm_in(rank, __FUNCTION__, extra); + + TRACE_smpi_comm_in(rank, __FUNCTION__, new simgrid::instr::Pt2PtTIData( + "exscan", -1, datatype->is_basic() ? count : count * datatype->size(), + encode_datatype(datatype))); retval = simgrid::smpi::Colls::exscan(sendtmpbuf, recvbuf, count, datatype, op, comm); @@ -511,27 +475,24 @@ int PMPI_Reduce_scatter(void *sendbuf, void *recvbuf, int *recvcounts, MPI_Datat retval = MPI_ERR_ARG; } else { int rank = smpi_process()->index(); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t, 1); - extra->type = TRACING_REDUCE_SCATTER; - extra->num_processes = comm->size(); - ; - extra->type = TRACING_EXSCAN; - extra->datatype1 = encode_datatype(datatype); - extra->send_size = datatype->is_basic() ? 1 : datatype->size(); - - extra->recvcounts = new int[extra->num_processes]; + std::vector* trace_recvcounts = new std::vector; + int dt_send_size = datatype->is_basic() ? 1 : datatype->size(); int totalcount = 0; - for (int i = 0; i < extra->num_processes; i++) { // copy data to avoid bad free - extra->recvcounts[i] = recvcounts[i] * extra->send_size; + + for (int i = 0; i < comm->size(); i++) { // copy data to avoid bad free + trace_recvcounts->push_back(recvcounts[i] * dt_send_size); totalcount += recvcounts[i]; } + void* sendtmpbuf = sendbuf; if (sendbuf == MPI_IN_PLACE) { sendtmpbuf = static_cast(xbt_malloc(totalcount * datatype->size())); memcpy(sendtmpbuf, recvbuf, totalcount * datatype->size()); } - TRACE_smpi_comm_in(rank, __FUNCTION__, extra); + TRACE_smpi_comm_in(rank, __FUNCTION__, + new simgrid::instr::VarCollTIData("reduceScatter", -1, dt_send_size, nullptr, -1, + trace_recvcounts, encode_datatype(datatype), "")); simgrid::smpi::Colls::reduce_scatter(sendtmpbuf, recvbuf, recvcounts, datatype, op, comm); retval = MPI_SUCCESS; @@ -563,22 +524,18 @@ int PMPI_Reduce_scatter_block(void *sendbuf, void *recvbuf, int recvcount, int count = comm->size(); int rank = smpi_process()->index(); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t, 1); - extra->type = TRACING_REDUCE_SCATTER; - extra->num_processes = count; - extra->datatype1 = encode_datatype(datatype); - int dt_size_send = datatype->is_basic() ? 1 : datatype->size(); - extra->send_size = 0; - extra->recvcounts = new int[extra->num_processes]; - for (int i = 0; i < extra->num_processes; i++) // copy data to avoid bad free - extra->recvcounts[i] = recvcount * dt_size_send; + int dt_send_size = datatype->is_basic() ? 1 : datatype->size(); + std::vector* trace_recvcounts = new std::vector(recvcount * dt_send_size); // copy data to avoid bad free + void* sendtmpbuf = sendbuf; if (sendbuf == MPI_IN_PLACE) { sendtmpbuf = static_cast(xbt_malloc(recvcount * count * datatype->size())); memcpy(sendtmpbuf, recvbuf, recvcount * count * datatype->size()); } - TRACE_smpi_comm_in(rank, __FUNCTION__, extra); + TRACE_smpi_comm_in(rank, __FUNCTION__, + new simgrid::instr::VarCollTIData("reduceScatter", -1, 0, nullptr, -1, trace_recvcounts, + encode_datatype(datatype), "")); int* recvcounts = new int[count]; for (int i = 0; i < count; i++) @@ -609,9 +566,6 @@ int PMPI_Alltoall(void* sendbuf, int sendcount, MPI_Datatype sendtype, void* rec retval = MPI_ERR_TYPE; } else { int rank = smpi_process()->index(); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t, 1); - extra->type = TRACING_ALLTOALL; - void* sendtmpbuf = static_cast(sendbuf); int sendtmpcount = sendcount; MPI_Datatype sendtmptype = sendtype; @@ -622,12 +576,12 @@ int PMPI_Alltoall(void* sendbuf, int sendcount, MPI_Datatype sendtype, void* rec sendtmptype = recvtype; } - extra->datatype1 = encode_datatype(sendtmptype); - extra->send_size = sendtmptype->is_basic() ? sendtmpcount : sendtmpcount * sendtmptype->size(); - extra->datatype2 = encode_datatype(recvtype); - extra->recv_size = recvtype->is_basic() ? recvcount : recvcount * recvtype->size(); - - TRACE_smpi_comm_in(rank, __FUNCTION__, extra); + TRACE_smpi_comm_in( + rank, __FUNCTION__, + new simgrid::instr::CollTIData("allToAll", -1, -1.0, + sendtmptype->is_basic() ? sendtmpcount : sendtmpcount * sendtmptype->size(), + recvtype->is_basic() ? recvcount : recvcount * recvtype->size(), + encode_datatype(sendtmptype), encode_datatype(recvtype))); retval = simgrid::smpi::Colls::alltoall(sendtmpbuf, sendtmpcount, sendtmptype, recvbuf, recvcount, recvtype, comm); @@ -657,15 +611,11 @@ int PMPI_Alltoallv(void* sendbuf, int* sendcounts, int* senddisps, MPI_Datatype retval = MPI_ERR_ARG; } else { int rank = smpi_process()->index(); - int i = 0; int size = comm->size(); - instr_extra_data extra = xbt_new0(s_instr_extra_data_t, 1); - extra->type = TRACING_ALLTOALLV; - extra->send_size = 0; - extra->recv_size = 0; - extra->recvcounts = new int[size]; - extra->sendcounts = new int[size]; - extra->datatype2 = encode_datatype(recvtype); + int send_size = 0; + int recv_size = 0; + std::vector* trace_sendcounts = new std::vector; + std::vector* trace_recvcounts = new std::vector; int dt_size_recv = recvtype->size(); void* sendtmpbuf = static_cast(sendbuf); @@ -673,9 +623,9 @@ int PMPI_Alltoallv(void* sendbuf, int* sendcounts, int* senddisps, MPI_Datatype int* sendtmpdisps = senddisps; MPI_Datatype sendtmptype = sendtype; int maxsize = 0; - for (i = 0; i < size; i++) { // copy data to avoid bad free - extra->recv_size += recvcounts[i] * dt_size_recv; - extra->recvcounts[i] = recvcounts[i] * dt_size_recv; + for (int i = 0; i < size; i++) { // copy data to avoid bad free + recv_size += recvcounts[i] * dt_size_recv; + trace_recvcounts->push_back(recvcounts[i] * dt_size_recv); if (((recvdisps[i] + recvcounts[i]) * dt_size_recv) > maxsize) maxsize = (recvdisps[i] + recvcounts[i]) * dt_size_recv; } @@ -690,15 +640,17 @@ int PMPI_Alltoallv(void* sendbuf, int* sendcounts, int* senddisps, MPI_Datatype sendtmptype = recvtype; } - extra->datatype1 = encode_datatype(sendtmptype); int dt_size_send = sendtmptype->size(); - for (i = 0; i < size; i++) { // copy data to avoid bad free - extra->send_size += sendtmpcounts[i] * dt_size_send; - extra->sendcounts[i] = sendtmpcounts[i] * dt_size_send; + for (int i = 0; i < size; i++) { // copy data to avoid bad free + send_size += sendtmpcounts[i] * dt_size_send; + trace_sendcounts->push_back(sendtmpcounts[i] * dt_size_send); } - extra->num_processes = size; - TRACE_smpi_comm_in(rank, __FUNCTION__, extra); + + TRACE_smpi_comm_in(rank, __FUNCTION__, new simgrid::instr::VarCollTIData( + "allToAllV", -1, send_size, trace_sendcounts, recv_size, + trace_recvcounts, encode_datatype(sendtype), encode_datatype(recvtype))); + retval = simgrid::smpi::Colls::alltoallv(sendtmpbuf, sendtmpcounts, sendtmpdisps, sendtmptype, recvbuf, recvcounts, recvdisps, recvtype, comm); TRACE_smpi_comm_out(rank);