X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/d646afc27bd30c899d16957194bd9645a72502d4..6ce033605df0be7e58fc5644d9b082ca8bc982f9:/src/smpi/smpi_base.cpp diff --git a/src/smpi/smpi_base.cpp b/src/smpi/smpi_base.cpp index 4f8742edc8..aecb3cbbcf 100644 --- a/src/smpi/smpi_base.cpp +++ b/src/smpi/smpi_base.cpp @@ -4,6 +4,8 @@ /* 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 "private.h" #include "xbt/virtu.h" #include "mc/mc.h" @@ -68,13 +70,17 @@ typedef struct s_smpi_factor_multival { // FIXME: this should be merged (dedupli int nb_values; double values[4];//arbitrary set to 4 } s_smpi_factor_multival_t; + xbt_dynar_t smpi_os_values = NULL; xbt_dynar_t smpi_or_values = NULL; xbt_dynar_t smpi_ois_values = NULL; -double smpi_wtime_sleep = 0.0; -double smpi_iprobe_sleep = 1e-4; -double smpi_test_sleep = 1e-4; +static simgrid::config::Flag smpi_wtime_sleep( + "smpi/wtime", "Minimum time to inject inside a call to MPI_Wtime", 0.0); +static simgrid::config::Flag smpi_iprobe_sleep( + "smpi/iprobe", "Minimum time to inject inside a call to MPI_Iprobe", 1e-4); +static simgrid::config::Flag smpi_test_sleep( + "smpi/test", "Minimum time to inject inside a call to MPI_Test", 1e-4); static int factor_cmp(const void *pa, const void *pb) { @@ -691,6 +697,7 @@ static void finish_wait(MPI_Request * request, MPI_Status * status) }else if(req->flags & RECV){//apply op on contiguous buffer for accumulate int n =req->real_size/smpi_datatype_size(datatype); smpi_op_apply(req->op, req->buf, req->old_buf, &n, &datatype); + xbt_free(req->buf); } } } @@ -1305,10 +1312,7 @@ void smpi_mpi_reduce(void *sendbuf, void *recvbuf, int count, MPI_Datatype datat void **tmpbufs; char* sendtmpbuf = (char*) sendbuf; - if( sendbuf == MPI_IN_PLACE ) { - sendtmpbuf = (char *)smpi_get_tmp_sendbuffer(count*smpi_datatype_get_extent(datatype)); - smpi_datatype_copy(recvbuf, count, datatype,sendtmpbuf, count, datatype); - } + rank = smpi_comm_rank(comm); size = smpi_comm_size(comm); @@ -1317,6 +1321,11 @@ void smpi_mpi_reduce(void *sendbuf, void *recvbuf, int count, MPI_Datatype datat smpi_coll_tuned_reduce_ompi_basic_linear(sendtmpbuf, recvbuf, count, datatype, op, root, comm); return; } + + if( sendbuf == MPI_IN_PLACE ) { + sendtmpbuf = (char *)smpi_get_tmp_sendbuffer(count*smpi_datatype_get_extent(datatype)); + smpi_datatype_copy(recvbuf, count, datatype,sendtmpbuf, count, datatype); + } if(rank != root) { // Send buffer to root @@ -1364,9 +1373,9 @@ void smpi_mpi_reduce(void *sendbuf, void *recvbuf, int count, MPI_Datatype datat xbt_free(tmpbufs); xbt_free(requests); - if( sendbuf == MPI_IN_PLACE ) { - smpi_free_tmp_buffer(sendtmpbuf); - } + } + if( sendbuf == MPI_IN_PLACE ) { + smpi_free_tmp_buffer(sendtmpbuf); } }