X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/0198d4f8e942b276c9b53f52b421bba99c93ed0a..ccc0a86055f58d796398f25f850dffed91174dff:/src/smpi/smpi_pmpi.c diff --git a/src/smpi/smpi_pmpi.c b/src/smpi/smpi_pmpi.c index d4b259d9c0..f9a06a5ce4 100644 --- a/src/smpi/smpi_pmpi.c +++ b/src/smpi/smpi_pmpi.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2007, 2008, 2009, 2010. The SimGrid Team. +/* Copyright (c) 2007-2013. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -127,12 +127,10 @@ int PMPI_Abort(MPI_Comm comm, int errorcode) double PMPI_Wtime(void) { double time; - - smpi_bench_end(); time = SIMIX_get_clock(); - smpi_bench_begin(); return time; } + extern double sg_maxmin_precision; double PMPI_Wtick(void) { @@ -1376,10 +1374,11 @@ int PMPI_Test(MPI_Request * request, int *flag, MPI_Status * status) int retval = 0; smpi_bench_end(); - if (request == MPI_REQUEST_NULL || flag == NULL) { + if (request == NULL || flag == NULL) { retval = MPI_ERR_ARG; } else if (*request == MPI_REQUEST_NULL) { *flag= TRUE; + smpi_empty_status(status); retval = MPI_ERR_REQUEST; } else { *flag = smpi_mpi_test(request, status); @@ -1470,6 +1469,8 @@ int PMPI_Wait(MPI_Request * request, MPI_Status * status) smpi_bench_end(); + smpi_empty_status(status); + if (request == NULL) { retval = MPI_ERR_ARG; } else if (*request == MPI_REQUEST_NULL) { @@ -1477,32 +1478,32 @@ int PMPI_Wait(MPI_Request * request, MPI_Status * status) } else { #ifdef HAVE_TRACING - int rank = request && (*request)->comm != MPI_COMM_NULL + int rank = request && (*request)->comm != MPI_COMM_NULL ? smpi_process_index() : -1; - TRACE_smpi_computing_out(rank); + TRACE_smpi_computing_out(rank); - int src_traced = (*request)->src; - int dst_traced = (*request)->dst; - MPI_Comm comm = (*request)->comm; - int is_wait_for_receive = (*request)->recv; - TRACE_smpi_ptp_in(rank, src_traced, dst_traced, __FUNCTION__,-1); + int src_traced = (*request)->src; + int dst_traced = (*request)->dst; + MPI_Comm comm = (*request)->comm; + int is_wait_for_receive = (*request)->recv; + TRACE_smpi_ptp_in(rank, src_traced, dst_traced, __FUNCTION__,-1); #endif smpi_mpi_wait(request, status); retval = MPI_SUCCESS; #ifdef HAVE_TRACING - //the src may not have been known at the beginning of the recv (MPI_ANY_SOURCE) - TRACE_smpi_ptp_out(rank, src_traced, dst_traced, __FUNCTION__); - if (is_wait_for_receive) { - if(src_traced==MPI_ANY_SOURCE) - 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_computing_in(rank); + //the src may not have been known at the beginning of the recv (MPI_ANY_SOURCE) + TRACE_smpi_ptp_out(rank, src_traced, dst_traced, __FUNCTION__); + if (is_wait_for_receive) { + if(src_traced==MPI_ANY_SOURCE) + 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_computing_in(rank); #endif } @@ -1671,22 +1672,24 @@ int PMPI_Bcast(void *buf, int count, MPI_Datatype datatype, int root, MPI_Comm c int retval = 0; smpi_bench_end(); + + if (comm == MPI_COMM_NULL) { + retval = MPI_ERR_COMM; + } else { #ifdef HAVE_TRACING int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1; TRACE_smpi_computing_out(rank); int root_traced = smpi_group_index(smpi_comm_group(comm), root); TRACE_smpi_collective_in(rank, root_traced, __FUNCTION__, count*smpi_datatype_size(datatype)); #endif - if (comm == MPI_COMM_NULL) { - retval = MPI_ERR_COMM; - } else { mpi_coll_bcast_fun(buf, count, datatype, root, comm); retval = MPI_SUCCESS; - } #ifdef HAVE_TRACING TRACE_smpi_collective_out(rank, root_traced, __FUNCTION__); TRACE_smpi_computing_in(rank); #endif + } + smpi_bench_begin(); return retval; } @@ -1696,21 +1699,23 @@ int PMPI_Barrier(MPI_Comm comm) int retval = 0; smpi_bench_end(); + + if (comm == MPI_COMM_NULL) { + retval = MPI_ERR_COMM; + } else { #ifdef HAVE_TRACING int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1; TRACE_smpi_computing_out(rank); TRACE_smpi_collective_in(rank, -1, __FUNCTION__, smpi_comm_size(comm)); #endif - if (comm == MPI_COMM_NULL) { - retval = MPI_ERR_COMM; - } else { mpi_coll_barrier_fun(comm); retval = MPI_SUCCESS; - } #ifdef HAVE_TRACING TRACE_smpi_collective_out(rank, -1, __FUNCTION__); TRACE_smpi_computing_in(rank); #endif + } + smpi_bench_begin(); return retval; } @@ -1722,12 +1727,7 @@ int PMPI_Gather(void *sendbuf, int sendcount, MPI_Datatype sendtype, int retval = 0; smpi_bench_end(); -#ifdef HAVE_TRACING - int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1; - TRACE_smpi_computing_out(rank); - int root_traced = smpi_group_index(smpi_comm_group(comm), root); - TRACE_smpi_collective_in(rank, root_traced, __FUNCTION__,sendcount*smpi_datatype_size(sendtype)); -#endif + if (comm == MPI_COMM_NULL) { retval = MPI_ERR_COMM; } else if ((( sendbuf != MPI_IN_PLACE) && (sendtype == MPI_DATATYPE_NULL)) || @@ -1745,17 +1745,23 @@ int PMPI_Gather(void *sendbuf, int sendcount, MPI_Datatype sendtype, sendtmpcount=0; sendtmptype=recvtype; } - +#ifdef HAVE_TRACING + int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1; + TRACE_smpi_computing_out(rank); + int root_traced = smpi_group_index(smpi_comm_group(comm), root); + TRACE_smpi_collective_in(rank, root_traced, __FUNCTION__,sendcount*smpi_datatype_size(sendtmptype)); +#endif mpi_coll_gather_fun(sendtmpbuf, sendtmpcount, sendtmptype, recvbuf, recvcount, recvtype, root, comm); retval = MPI_SUCCESS; - } #ifdef HAVE_TRACING TRACE_smpi_collective_out(rank, root_traced, __FUNCTION__); TRACE_smpi_computing_in(rank); #endif + } + smpi_bench_begin(); return retval; } @@ -1767,12 +1773,7 @@ int PMPI_Gatherv(void *sendbuf, int sendcount, MPI_Datatype sendtype, int retval = 0; smpi_bench_end(); -#ifdef HAVE_TRACING - int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1; - TRACE_smpi_computing_out(rank); - int root_traced = smpi_group_index(smpi_comm_group(comm), root); - TRACE_smpi_collective_in(rank, root_traced, __FUNCTION__,sendcount*smpi_datatype_size(sendtype)); -#endif + if (comm == MPI_COMM_NULL) { retval = MPI_ERR_COMM; } else if ((( sendbuf != MPI_IN_PLACE) && (sendtype == MPI_DATATYPE_NULL)) || @@ -1783,7 +1784,6 @@ int PMPI_Gatherv(void *sendbuf, int sendcount, MPI_Datatype sendtype, } else if (recvcounts == NULL || displs == NULL) { retval = MPI_ERR_ARG; } else { - char* sendtmpbuf = (char*) sendbuf; int sendtmpcount = sendcount; MPI_Datatype sendtmptype = sendtype; @@ -1792,14 +1792,21 @@ int PMPI_Gatherv(void *sendbuf, int sendcount, MPI_Datatype sendtype, sendtmptype=recvtype; } +#ifdef HAVE_TRACING + int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1; + TRACE_smpi_computing_out(rank); + int root_traced = smpi_group_index(smpi_comm_group(comm), root); + TRACE_smpi_collective_in(rank, root_traced, __FUNCTION__,sendcount*smpi_datatype_size(sendtmptype)); +#endif smpi_mpi_gatherv(sendtmpbuf, sendtmpcount, sendtmptype, recvbuf, recvcounts, displs, recvtype, root, comm); retval = MPI_SUCCESS; - } #ifdef HAVE_TRACING TRACE_smpi_collective_out(rank, root_traced, __FUNCTION__); TRACE_smpi_computing_in(rank); #endif + } + smpi_bench_begin(); return retval; } @@ -1811,11 +1818,7 @@ int PMPI_Allgather(void *sendbuf, int sendcount, MPI_Datatype sendtype, int retval = 0; smpi_bench_end(); -#ifdef HAVE_TRACING - int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1; - TRACE_smpi_computing_out(rank); - TRACE_smpi_collective_in(rank, -1, __FUNCTION__,sendcount*smpi_datatype_size(sendtype)); -#endif + if (comm == MPI_COMM_NULL) { retval = MPI_ERR_COMM; } else if ((( sendbuf != MPI_IN_PLACE) && (sendtype == MPI_DATATYPE_NULL)) || @@ -1825,20 +1828,24 @@ int PMPI_Allgather(void *sendbuf, int sendcount, MPI_Datatype sendtype, (recvcount <0)){ retval = MPI_ERR_COUNT; } else { - if(sendbuf == MPI_IN_PLACE) { sendbuf=((char*)recvbuf)+smpi_datatype_get_extent(recvtype)*recvcount*smpi_comm_rank(comm); sendcount=recvcount; sendtype=recvtype; } - +#ifdef HAVE_TRACING + int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1; + TRACE_smpi_computing_out(rank); + TRACE_smpi_collective_in(rank, -1, __FUNCTION__,sendcount*smpi_datatype_size(sendtype)); +#endif mpi_coll_allgather_fun(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm); retval = MPI_SUCCESS; - } + #ifdef HAVE_TRACING TRACE_smpi_collective_out(rank, -1, __FUNCTION__); #endif + } smpi_bench_begin(); return retval; } @@ -1850,11 +1857,7 @@ int PMPI_Allgatherv(void *sendbuf, int sendcount, MPI_Datatype sendtype, int retval = 0; smpi_bench_end(); -#ifdef HAVE_TRACING - int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1; - TRACE_smpi_computing_out(rank); - TRACE_smpi_collective_in(rank, -1, __FUNCTION__,sendcount*smpi_datatype_size(sendtype)); -#endif + if (comm == MPI_COMM_NULL) { retval = MPI_ERR_COMM; } else if ((( sendbuf != MPI_IN_PLACE) && (sendtype == MPI_DATATYPE_NULL)) || @@ -1871,15 +1874,20 @@ int PMPI_Allgatherv(void *sendbuf, int sendcount, MPI_Datatype sendtype, sendcount=recvcounts[smpi_comm_rank(comm)]; sendtype=recvtype; } - +#ifdef HAVE_TRACING + int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1; + TRACE_smpi_computing_out(rank); + TRACE_smpi_collective_in(rank, -1, __FUNCTION__,sendcount*smpi_datatype_size(sendtype)); +#endif mpi_coll_allgatherv_fun(sendbuf, sendcount, sendtype, recvbuf, recvcounts, displs, recvtype, comm); retval = MPI_SUCCESS; - } #ifdef HAVE_TRACING TRACE_smpi_collective_out(rank, -1, __FUNCTION__); TRACE_smpi_computing_in(rank); #endif + } + smpi_bench_begin(); return retval; } @@ -1891,31 +1899,34 @@ int PMPI_Scatter(void *sendbuf, int sendcount, MPI_Datatype sendtype, int retval = 0; smpi_bench_end(); -#ifdef HAVE_TRACING - int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1; - TRACE_smpi_computing_out(rank); - int root_traced = smpi_group_index(smpi_comm_group(comm), root); - TRACE_smpi_collective_in(rank, root_traced, __FUNCTION__,sendcount*smpi_datatype_size(sendtype)); -#endif if (comm == MPI_COMM_NULL) { retval = MPI_ERR_COMM; } else if (((smpi_comm_rank(comm)==root) && (sendtype == MPI_DATATYPE_NULL)) || ((recvbuf !=MPI_IN_PLACE) && (recvtype == MPI_DATATYPE_NULL))) { retval = MPI_ERR_TYPE; } else { + if (recvbuf == MPI_IN_PLACE) { recvtype=sendtype; recvcount=sendcount; } +#ifdef HAVE_TRACING + int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1; + TRACE_smpi_computing_out(rank); + int root_traced = smpi_group_index(smpi_comm_group(comm), root); + + TRACE_smpi_collective_in(rank, root_traced, __FUNCTION__,sendcount*smpi_datatype_size(recvtype)); +#endif mpi_coll_scatter_fun(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm); retval = MPI_SUCCESS; - } #ifdef HAVE_TRACING TRACE_smpi_collective_out(rank, root_traced, __FUNCTION__); TRACE_smpi_computing_in(rank); #endif + } + smpi_bench_begin(); return retval; } @@ -1927,14 +1938,7 @@ int PMPI_Scatterv(void *sendbuf, int *sendcounts, int *displs, int retval = 0; smpi_bench_end(); -#ifdef HAVE_TRACING - int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1; - TRACE_smpi_computing_out(rank); - int root_traced = smpi_group_index(smpi_comm_group(comm), root); - int count=0, i; - for(i=0; i