X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/1555ef43eee251e5892a2f7fd49bc96e99d68fef..2bcb5dd3317c733c31c288ae79e72fb28863d936:/src/smpi/smpi_pmpi.cpp diff --git a/src/smpi/smpi_pmpi.cpp b/src/smpi/smpi_pmpi.cpp index eb4e4909e9..0cb559ce3c 100644 --- a/src/smpi/smpi_pmpi.cpp +++ b/src/smpi/smpi_pmpi.cpp @@ -1,10 +1,9 @@ - -/* Copyright (c) 2007-2015. The SimGrid Team. - * All rights reserved. */ +/* Copyright (c) 2007-2016. The SimGrid Team. All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ +#include #include #include "private.h" @@ -23,6 +22,7 @@ void TRACE_smpi_set_category(const char *category) } /* PMPI User level calls */ +extern "C" { // Obviously, the C MPI interface should use the C linkage int PMPI_Init(int *argc, char ***argv) { @@ -47,7 +47,7 @@ int PMPI_Init(int *argc, char ***argv) return MPI_SUCCESS; } -int PMPI_Finalize(void) +int PMPI_Finalize() { smpi_bench_end(); int rank = smpi_process_index(); @@ -128,13 +128,13 @@ int PMPI_Abort(MPI_Comm comm, int errorcode) return MPI_SUCCESS; } -double PMPI_Wtime(void) +double PMPI_Wtime() { return smpi_mpi_wtime(); } extern double sg_maxmin_precision; -double PMPI_Wtick(void) +double PMPI_Wtick() { return sg_maxmin_precision; } @@ -185,6 +185,21 @@ int PMPI_Type_size(MPI_Datatype datatype, int *size) return retval; } +int PMPI_Type_size_x(MPI_Datatype datatype, MPI_Count *size) +{ + int retval = 0; + + if (datatype == MPI_DATATYPE_NULL) { + retval = MPI_ERR_TYPE; + } else if (size == nullptr) { + retval = MPI_ERR_ARG; + } else { + *size = static_cast(smpi_datatype_size(datatype)); + retval = MPI_SUCCESS; + } + return retval; +} + int PMPI_Type_get_extent(MPI_Datatype datatype, MPI_Aint * lb, MPI_Aint * extent) { int retval = 0; @@ -500,7 +515,7 @@ int PMPI_Group_excl(MPI_Group group, int n, int *ranks, MPI_Group * newgroup) } else { if (n == 0) { *newgroup = group; - if(group!= smpi_comm_group(MPI_COMM_WORLD) && group != MPI_GROUP_NULL + if (group != smpi_comm_group(MPI_COMM_WORLD) && group != smpi_comm_group(MPI_COMM_SELF) && group != MPI_GROUP_EMPTY) smpi_group_use(group); } else if (n == smpi_group_size(group)) { @@ -603,7 +618,7 @@ int PMPI_Group_range_excl(MPI_Group group, int n, int ranges[][3], MPI_Group * n } else { if (n == 0) { *newgroup = group; - if(group!= smpi_comm_group(MPI_COMM_WORLD) && group != MPI_GROUP_NULL + if (group!= smpi_comm_group(MPI_COMM_WORLD) && group != smpi_comm_group(MPI_COMM_SELF) && group != MPI_GROUP_EMPTY) smpi_group_use(group); } else { @@ -839,6 +854,23 @@ int PMPI_Comm_split(MPI_Comm comm, int color, int key, MPI_Comm* comm_out) return retval; } +int PMPI_Comm_create_group(MPI_Comm comm, MPI_Group group, int, MPI_Comm* comm_out) +{ + int retval = 0; + smpi_bench_end(); + + if (comm_out == nullptr) { + retval = MPI_ERR_ARG; + } else if (comm == MPI_COMM_NULL) { + retval = MPI_ERR_COMM; + } else { + retval = MPI_Comm_create(comm, group, comm_out); + } + smpi_bench_begin(); + + return retval; +} + int PMPI_Send_init(void *buf, int count, MPI_Datatype datatype, int dst, int tag, MPI_Comm comm, MPI_Request * request) { int retval = 0; @@ -1047,7 +1079,7 @@ int PMPI_Isend(void *buf, int count, MPI_Datatype datatype, int dst, int tag, MP dt_size_send = smpi_datatype_size(datatype); extra->send_size = count*dt_size_send; TRACE_smpi_ptp_in(rank, rank, dst_traced, __FUNCTION__, extra); - TRACE_smpi_send(rank, rank, dst_traced, count*smpi_datatype_size(datatype)); + TRACE_smpi_send(rank, rank, dst_traced, tag, count*smpi_datatype_size(datatype)); *request = smpi_mpi_isend(buf, count, datatype, dst, tag, comm); retval = MPI_SUCCESS; @@ -1097,7 +1129,7 @@ int PMPI_Issend(void* buf, int count, MPI_Datatype datatype, int dst, int tag, M dt_size_send = smpi_datatype_size(datatype); extra->send_size = count*dt_size_send; TRACE_smpi_ptp_in(rank, rank, dst_traced, __FUNCTION__, extra); - TRACE_smpi_send(rank, rank, dst_traced, count*smpi_datatype_size(datatype)); + TRACE_smpi_send(rank, rank, dst_traced, tag, count*smpi_datatype_size(datatype)); *request = smpi_mpi_issend(buf, count, datatype, dst, tag, comm); retval = MPI_SUCCESS; @@ -1153,7 +1185,7 @@ int PMPI_Recv(void *buf, int count, MPI_Datatype datatype, int src, int tag, MPI if(status!=MPI_STATUS_IGNORE){ src_traced = smpi_group_index(smpi_comm_group(comm), status->MPI_SOURCE); if (!TRACE_smpi_view_internals()) { - TRACE_smpi_recv(rank, src_traced, rank); + TRACE_smpi_recv(rank, src_traced, rank, tag); } } TRACE_smpi_ptp_out(rank, src_traced, rank, __FUNCTION__); @@ -1197,7 +1229,7 @@ int PMPI_Send(void *buf, int count, MPI_Datatype datatype, int dst, int tag, MPI extra->send_size = count*dt_size_send; TRACE_smpi_ptp_in(rank, rank, dst_traced, __FUNCTION__, extra); if (!TRACE_smpi_view_internals()) { - TRACE_smpi_send(rank, rank, dst_traced,count*smpi_datatype_size(datatype)); + TRACE_smpi_send(rank, rank, dst_traced, tag,count*smpi_datatype_size(datatype)); } smpi_mpi_send(buf, count, datatype, dst, tag, comm); @@ -1242,7 +1274,7 @@ int PMPI_Ssend(void* buf, int count, MPI_Datatype datatype, int dst, int tag, MP } extra->send_size = count*dt_size_send; TRACE_smpi_ptp_in(rank, rank, dst_traced, __FUNCTION__, extra); - TRACE_smpi_send(rank, rank, dst_traced,count*smpi_datatype_size(datatype)); + TRACE_smpi_send(rank, rank, dst_traced, tag,count*smpi_datatype_size(datatype)); smpi_mpi_ssend(buf, count, datatype, dst, tag, comm); retval = MPI_SUCCESS; @@ -1300,14 +1332,14 @@ int PMPI_Sendrecv(void *sendbuf, int sendcount, MPI_Datatype sendtype, int dst, extra->recv_size = recvcount*dt_size_recv; TRACE_smpi_ptp_in(rank, src_traced, dst_traced, __FUNCTION__, extra); - TRACE_smpi_send(rank, rank, dst_traced,sendcount*smpi_datatype_size(sendtype)); + TRACE_smpi_send(rank, rank, dst_traced, sendtag,sendcount*smpi_datatype_size(sendtype)); smpi_mpi_sendrecv(sendbuf, sendcount, sendtype, dst, sendtag, recvbuf, recvcount, recvtype, src, recvtag, comm, status); retval = MPI_SUCCESS; TRACE_smpi_ptp_out(rank, src_traced, dst_traced, __FUNCTION__); - TRACE_smpi_recv(rank, src_traced, rank); + TRACE_smpi_recv(rank, src_traced, rank, recvtag); } smpi_bench_begin(); @@ -1347,7 +1379,7 @@ int PMPI_Test(MPI_Request * request, int *flag, MPI_Status * status) smpi_empty_status(status); retval = MPI_SUCCESS; } else { - int rank = (request!=nullptr && (*request)->comm != MPI_COMM_NULL) ? smpi_process_index() : -1; + int rank = ((*request)->comm != MPI_COMM_NULL) ? smpi_process_index() : -1; instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1); extra->type = TRACING_TEST; @@ -1451,6 +1483,7 @@ int PMPI_Wait(MPI_Request * request, MPI_Status * status) int src_traced = (*request)->src; int dst_traced = (*request)->dst; + int tag_traced= (*request)->tag; MPI_Comm comm = (*request)->comm; int is_wait_for_receive = (*request)->recv; instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1); @@ -1467,7 +1500,7 @@ int PMPI_Wait(MPI_Request * request, MPI_Status * status) src_traced = (status!=MPI_STATUS_IGNORE) ? smpi_group_rank(smpi_comm_group(comm), status->MPI_SOURCE) : src_traced; - TRACE_smpi_recv(rank, src_traced, dst_traced); + TRACE_smpi_recv(rank, src_traced, dst_traced, tag_traced); } } @@ -1483,21 +1516,21 @@ int PMPI_Waitany(int count, MPI_Request requests[], int *index, MPI_Status * sta smpi_bench_end(); //save requests information for tracing int i; - int *srcs = nullptr, *dsts = nullptr, *recvs = nullptr; - MPI_Comm* comms = nullptr; + typedef struct { + int src; + int dst; + int recv; + int tag; + MPI_Comm comm; + } savedvalstype; + savedvalstype* savedvals=nullptr; if(count>0){ - srcs = xbt_new0(int, count); - dsts = xbt_new0(int, count); - recvs = xbt_new0(int, count); - comms = xbt_new0(MPI_Comm, count); + savedvals = xbt_new0(savedvalstype, count); } for (i = 0; i < count; i++) { MPI_Request req = requests[i]; //already received requests are no longer valid if (req) { - srcs[i] = req->src; - dsts[i] = req->dst; - recvs[i] = req->recv; - comms[i] = req->comm; + savedvals[i]=(savedvalstype){req->src, req->dst, req->recv, req->tag, req->comm}; } } int rank_traced = smpi_process_index(); @@ -1509,23 +1542,20 @@ int PMPI_Waitany(int count, MPI_Request requests[], int *index, MPI_Status * sta *index = smpi_mpi_waitany(count, requests, status); if(*index!=MPI_UNDEFINED){ - int src_traced = srcs[*index]; + int src_traced = savedvals[*index].src; //the src may not have been known at the beginning of the recv (MPI_ANY_SOURCE) - int dst_traced = dsts[*index]; - int is_wait_for_receive = recvs[*index]; + int dst_traced = savedvals[*index].dst; + int is_wait_for_receive = savedvals[*index].recv; if (is_wait_for_receive) { - if(srcs[*index]==MPI_ANY_SOURCE) + if(savedvals[*index].src==MPI_ANY_SOURCE) src_traced = (status!=MPI_STATUSES_IGNORE) ? - smpi_group_rank(smpi_comm_group(comms[*index]), status->MPI_SOURCE) : srcs[*index]; - TRACE_smpi_recv(rank_traced, src_traced, dst_traced); + smpi_group_rank(smpi_comm_group(savedvals[*index].comm), status->MPI_SOURCE) : savedvals[*index].src; + TRACE_smpi_recv(rank_traced, src_traced, dst_traced, savedvals[*index].tag); } TRACE_smpi_ptp_out(rank_traced, src_traced, dst_traced, __FUNCTION__); - xbt_free(srcs); - xbt_free(dsts); - xbt_free(recvs); - xbt_free(comms); - } + xbt_free(savedvals); + smpi_bench_begin(); return MPI_SUCCESS; } @@ -1535,22 +1565,22 @@ int PMPI_Waitall(int count, MPI_Request requests[], MPI_Status status[]) smpi_bench_end(); //save information from requests int i; - int *srcs = xbt_new0(int, count); - int *dsts = xbt_new0(int, count); - int *recvs = xbt_new0(int, count); - int *valid = xbt_new0(int, count); - MPI_Comm *comms = xbt_new0(MPI_Comm, count); + typedef struct { + int src; + int dst; + int recv; + int tag; + int valid; + MPI_Comm comm; + } savedvalstype; + savedvalstype* savedvals=xbt_new0(savedvalstype, count); for (i = 0; i < count; i++) { MPI_Request req = requests[i]; if(req!=MPI_REQUEST_NULL){ - srcs[i] = req->src; - dsts[i] = req->dst; - recvs[i] = req->recv; - comms[i] = req->comm; - valid[i]=1;; + savedvals[i]=(savedvalstype){req->src, req->dst, req->recv, req->tag, 1, req->comm}; }else{ - valid[i]=0; + savedvals[i].valid=0; } } int rank_traced = smpi_process_index(); @@ -1562,25 +1592,21 @@ int PMPI_Waitall(int count, MPI_Request requests[], MPI_Status status[]) int retval = smpi_mpi_waitall(count, requests, status); for (i = 0; i < count; i++) { - if(valid[i]){ + if(savedvals[i].valid){ //the src may not have been known at the beginning of the recv (MPI_ANY_SOURCE) - int src_traced = srcs[i]; - int dst_traced = dsts[i]; - int is_wait_for_receive = recvs[i]; + int src_traced = savedvals[i].src; + int dst_traced = savedvals[i].dst; + int is_wait_for_receive = savedvals[i].recv; if (is_wait_for_receive) { if(src_traced==MPI_ANY_SOURCE) src_traced = (status!=MPI_STATUSES_IGNORE) ? - smpi_group_rank(smpi_comm_group(comms[i]), status[i].MPI_SOURCE) : srcs[i]; - TRACE_smpi_recv(rank_traced, src_traced, dst_traced); + smpi_group_rank(smpi_comm_group(savedvals[i].comm), status[i].MPI_SOURCE) : savedvals[i].src; + TRACE_smpi_recv(rank_traced, src_traced, dst_traced,savedvals[i].tag); } } } TRACE_smpi_ptp_out(rank_traced, -1, -1, __FUNCTION__); - xbt_free(srcs); - xbt_free(dsts); - xbt_free(recvs); - xbt_free(valid); - xbt_free(comms); + xbt_free(savedvals); smpi_bench_begin(); return retval; @@ -1661,15 +1687,15 @@ int PMPI_Barrier(MPI_Comm comm) if (comm == MPI_COMM_NULL) { retval = MPI_ERR_COMM; } else { - int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1; - instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1); - extra->type = TRACING_BARRIER; - TRACE_smpi_collective_in(rank, -1, __FUNCTION__, extra); + int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1; + instr_extra_data extra = xbt_new0(s_instr_extra_data_t, 1); + extra->type = TRACING_BARRIER; + TRACE_smpi_collective_in(rank, -1, __FUNCTION__, extra); - mpi_coll_barrier_fun(comm); - retval = MPI_SUCCESS; + mpi_coll_barrier_fun(comm); + retval = MPI_SUCCESS; - TRACE_smpi_collective_out(rank, -1, __FUNCTION__); + TRACE_smpi_collective_out(rank, -1, __FUNCTION__); } smpi_bench_begin(); @@ -2138,11 +2164,18 @@ int PMPI_Exscan(void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, if(known==0) dt_size_send = smpi_datatype_size(datatype); extra->send_size = count*dt_size_send; + void * sendtmpbuf = sendbuf; + if(sendbuf==MPI_IN_PLACE){ + sendtmpbuf= static_cast(xbt_malloc(count*smpi_datatype_size(datatype))); + memcpy(sendtmpbuf,recvbuf, count*smpi_datatype_size(datatype)); + } TRACE_smpi_collective_in(rank, -1, __FUNCTION__,extra); - smpi_mpi_exscan(sendbuf, recvbuf, count, datatype, op, comm); + smpi_mpi_exscan(sendtmpbuf, recvbuf, count, datatype, op, comm); retval = MPI_SUCCESS; TRACE_smpi_collective_out(rank, -1, __FUNCTION__); + if(sendbuf==MPI_IN_PLACE) + xbt_free(sendtmpbuf); } smpi_bench_begin(); @@ -2176,17 +2209,25 @@ int PMPI_Reduce_scatter(void *sendbuf, void *recvbuf, int *recvcounts, MPI_Datat dt_size_send = smpi_datatype_size(datatype); extra->send_size = 0; extra->recvcounts= xbt_new(int, size); - for(i=0; i< size; i++)//copy data to avoid bad free + int totalcount = 0; + for(i=0; i< size; i++){//copy data to avoid bad free extra->recvcounts[i] = recvcounts[i]*dt_size_send; - TRACE_smpi_collective_in(rank, -1, __FUNCTION__,extra); - + totalcount+= recvcounts[i]; + } void* sendtmpbuf=sendbuf; - if(sendbuf==MPI_IN_PLACE) - sendtmpbuf=recvbuf; + if(sendbuf==MPI_IN_PLACE){ + sendtmpbuf= static_cast(xbt_malloc(totalcount*smpi_datatype_size(datatype))); + memcpy(sendtmpbuf,recvbuf, totalcount*smpi_datatype_size(datatype)); + } - mpi_coll_reduce_scatter_fun(sendtmpbuf, recvbuf, recvcounts, datatype, op, comm); - retval = MPI_SUCCESS; + TRACE_smpi_collective_in(rank, -1, __FUNCTION__,extra); + + mpi_coll_reduce_scatter_fun(sendtmpbuf, recvbuf, recvcounts, datatype, op, comm); + retval = MPI_SUCCESS; TRACE_smpi_collective_out(rank, -1, __FUNCTION__); + + if(sendbuf==MPI_IN_PLACE) + xbt_free(sendtmpbuf); } smpi_bench_begin(); @@ -2208,7 +2249,7 @@ int PMPI_Reduce_scatter_block(void *sendbuf, void *recvbuf, int recvcount, } else if (recvcount < 0) { retval = MPI_ERR_ARG; } else { - int count=smpi_comm_size(comm); + int count=smpi_comm_size(comm); int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1; instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1); @@ -2223,17 +2264,25 @@ int PMPI_Reduce_scatter_block(void *sendbuf, void *recvbuf, int recvcount, extra->recvcounts= xbt_new(int, count); for(i=0; i< count; i++)//copy data to avoid bad free extra->recvcounts[i] = recvcount*dt_size_send; + void* sendtmpbuf=sendbuf; + if(sendbuf==MPI_IN_PLACE){ + sendtmpbuf= static_cast(xbt_malloc(recvcount*count*smpi_datatype_size(datatype))); + memcpy(sendtmpbuf,recvbuf, recvcount*count*smpi_datatype_size(datatype)); + } TRACE_smpi_collective_in(rank, -1, __FUNCTION__,extra); - int* recvcounts=static_cast(xbt_malloc(count)); - for (i=0; i(xbt_malloc(count*sizeof(int))); + for (i=0; itype = TRACING_ALLTOALL; + + void* sendtmpbuf = static_cast(sendbuf); + int sendtmpcount = sendcount; + MPI_Datatype sendtmptype = sendtype; + if( sendbuf == MPI_IN_PLACE ) { + sendtmpbuf = static_cast(xbt_malloc(recvcount*smpi_comm_size(comm)*smpi_datatype_size(recvtype))); + memcpy(sendtmpbuf,recvbuf, recvcount*smpi_comm_size(comm)*smpi_datatype_size(recvtype)); + sendtmpcount = recvcount; + sendtmptype = recvtype; + } + int known=0; - extra->datatype1 = encode_datatype(sendtype, &known); + extra->datatype1 = encode_datatype(sendtmptype, &known); if(known==0) - extra->send_size = sendcount*smpi_datatype_size(sendtype); + extra->send_size = sendtmpcount*smpi_datatype_size(sendtmptype); else - extra->send_size = sendcount; + extra->send_size = sendtmpcount; extra->datatype2 = encode_datatype(recvtype, &known); if(known==0) extra->recv_size = recvcount*smpi_datatype_size(recvtype); else extra->recv_size = recvcount; + TRACE_smpi_collective_in(rank, -1, __FUNCTION__,extra); - retval = mpi_coll_alltoall_fun(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm); + retval = mpi_coll_alltoall_fun(sendtmpbuf, sendtmpcount, sendtmptype, recvbuf, recvcount, recvtype, comm); TRACE_smpi_collective_out(rank, -1, __FUNCTION__); + + if( sendbuf == MPI_IN_PLACE ) + xbt_free(sendtmpbuf); } smpi_bench_begin(); @@ -2289,7 +2353,7 @@ int PMPI_Alltoallv(void *sendbuf, int *sendcounts, int *senddisps,MPI_Datatype s retval = MPI_ERR_COMM; } else if (sendtype == MPI_DATATYPE_NULL || recvtype == MPI_DATATYPE_NULL) { retval = MPI_ERR_TYPE; - } else if (sendcounts == nullptr || senddisps == nullptr || recvcounts == nullptr || recvdisps == nullptr) { + } else if ((sendbuf!= MPI_IN_PLACE && (sendcounts == nullptr || senddisps == nullptr)) || recvcounts == nullptr || recvdisps == nullptr) { retval = MPI_ERR_ARG; } else { int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1; @@ -2302,27 +2366,51 @@ int PMPI_Alltoallv(void *sendbuf, int *sendcounts, int *senddisps,MPI_Datatype s extra->recvcounts= xbt_new(int, size); extra->sendcounts= xbt_new(int, size); int known=0; - extra->datatype1 = encode_datatype(sendtype, &known); - int dt_size_send = 1; - if(known==0) - dt_size_send = smpi_datatype_size(sendtype); int dt_size_recv = 1; extra->datatype2 = encode_datatype(recvtype, &known); - if(known==0) - dt_size_recv = smpi_datatype_size(recvtype); + dt_size_recv = smpi_datatype_size(recvtype); + + void* sendtmpbuf = static_cast(sendbuf); + int * sendtmpcounts = sendcounts; + int *sendtmpdisps = senddisps; + MPI_Datatype sendtmptype = sendtype; + int maxsize=0; for(i=0; i< size; i++){//copy data to avoid bad free - extra->send_size += sendcounts[i]*dt_size_send; extra->recv_size += recvcounts[i]*dt_size_recv; - - extra->sendcounts[i] = sendcounts[i]*dt_size_send; extra->recvcounts[i] = recvcounts[i]*dt_size_recv; + if (((recvdisps[i]+recvcounts[i])*dt_size_recv) > maxsize) + maxsize=(recvdisps[i]+recvcounts[i])*dt_size_recv; + } + + if( sendbuf == MPI_IN_PLACE ) { + sendtmpbuf = static_cast(xbt_malloc(maxsize)); + memcpy(sendtmpbuf,recvbuf, maxsize); + sendtmpcounts= static_cast(xbt_malloc(size*sizeof(int))); + memcpy(sendtmpcounts,recvcounts, size*sizeof(int)); + sendtmpdisps= static_cast(xbt_malloc(size*sizeof(int))); + memcpy(sendtmpdisps,recvdisps, size*sizeof(int)); + sendtmptype=recvtype; + } + + extra->datatype1 = encode_datatype(sendtmptype, &known); + int dt_size_send = 1; + dt_size_send = smpi_datatype_size(sendtmptype); + + 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; } extra->num_processes = size; TRACE_smpi_collective_in(rank, -1, __FUNCTION__,extra); - - retval = mpi_coll_alltoallv_fun(sendbuf, sendcounts, senddisps, sendtype, recvbuf, recvcounts, recvdisps, recvtype, + retval = mpi_coll_alltoallv_fun(sendtmpbuf, sendtmpcounts, sendtmpdisps, sendtmptype, recvbuf, recvcounts, recvdisps, recvtype, comm); TRACE_smpi_collective_out(rank, -1, __FUNCTION__); + + if( sendbuf == MPI_IN_PLACE ) { + xbt_free(sendtmpbuf); + xbt_free(sendtmpcounts); + xbt_free(sendtmpdisps); + } } smpi_bench_begin(); @@ -2334,9 +2422,9 @@ int PMPI_Get_processor_name(char *name, int *resultlen) { int retval = MPI_SUCCESS; - strncpy(name, sg_host_get_name(SIMIX_host_self()), - strlen(sg_host_get_name(SIMIX_host_self())) < MPI_MAX_PROCESSOR_NAME - 1 ? - strlen(sg_host_get_name(SIMIX_host_self())) +1 : MPI_MAX_PROCESSOR_NAME - 1 ); + strncpy(name, SIMIX_host_self()->cname(), strlen(SIMIX_host_self()->cname()) < MPI_MAX_PROCESSOR_NAME - 1 + ? strlen(SIMIX_host_self()->cname()) + 1 + : MPI_MAX_PROCESSOR_NAME - 1); *resultlen = strlen(name) > MPI_MAX_PROCESSOR_NAME ? MPI_MAX_PROCESSOR_NAME : strlen(name); return retval; @@ -2454,7 +2542,7 @@ int PMPI_Type_create_indexed_block(int count, int blocklength, int* indices, MPI } else if (count<0){ retval = MPI_ERR_COUNT; } else { - int* blocklens=static_cast(xbt_malloc(blocklength*count)); + int* blocklens=static_cast(xbt_malloc(blocklength*count*sizeof(int))); for (i=0; iinfo_dict= xbt_dict_new_homogeneous(nullptr); + (*info)->info_dict= xbt_dict_new_homogeneous(xbt_free_f); (*info)->refcount=1; return MPI_SUCCESS; } @@ -3129,7 +3217,7 @@ int PMPI_Info_set( MPI_Info info, char *key, char *value){ if (info == nullptr || key == nullptr || value == nullptr) return MPI_ERR_ARG; - xbt_dict_set(info->info_dict, key, (void*)value, nullptr); + xbt_dict_set(info->info_dict, key, xbt_strdup(value), nullptr); return MPI_SUCCESS; } @@ -3164,13 +3252,13 @@ int PMPI_Info_dup(MPI_Info info, MPI_Info *newinfo){ if (info == nullptr || newinfo==nullptr) return MPI_ERR_ARG; *newinfo = xbt_new(s_smpi_mpi_info_t, 1); - (*newinfo)->info_dict= xbt_dict_new_homogeneous(nullptr); + (*newinfo)->info_dict= xbt_dict_new_homogeneous(xbt_free_f); (*newinfo)->refcount=1; xbt_dict_cursor_t cursor = nullptr; int *key; void* data; xbt_dict_foreach(info->info_dict,cursor,key,data){ - xbt_dict_set((*newinfo)->info_dict, reinterpret_cast(key), data, nullptr); + xbt_dict_set((*newinfo)->info_dict, reinterpret_cast(key), xbt_strdup(reinterpret_cast(data)), nullptr); } return MPI_SUCCESS; } @@ -3258,3 +3346,4 @@ int PMPI_Pack_size(int incount, MPI_Datatype datatype, MPI_Comm comm, int* size) return MPI_SUCCESS; } +} // extern "C"