X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/482cc3463d7b94d6c39816c23f0d1e972a289728..c4f40214500b2b521f98a60d33f666c062ca318c:/src/smpi/smpi_pmpi.c diff --git a/src/smpi/smpi_pmpi.c b/src/smpi/smpi_pmpi.c index 58cfb15661..b034aaf69f 100644 --- a/src/smpi/smpi_pmpi.c +++ b/src/smpi/smpi_pmpi.c @@ -50,6 +50,28 @@ int PMPI_Finalize(void) return MPI_SUCCESS; } +int PMPI_Finalized(int* flag) +{ + *flag=smpi_process_finalized(); + return MPI_SUCCESS; +} + +int PMPI_Get_version (int *version,int *subversion){ + *version = MPI_VERSION; + *subversion= MPI_SUBVERSION; + return MPI_SUCCESS; +} + +int PMPI_Get_library_version (char *version,int *len){ + int retval = MPI_SUCCESS; + smpi_bench_end(); + snprintf(version,MPI_MAX_LIBRARY_VERSION_STRING,"SMPI Version %d.%d. Copyright The Simgrid Team 2007-2013",SIMGRID_VERSION_MAJOR, + SIMGRID_VERSION_MINOR); + *len = strlen(version) > MPI_MAX_LIBRARY_VERSION_STRING ? MPI_MAX_LIBRARY_VERSION_STRING : strlen(version); + smpi_bench_begin(); + return retval; +} + int PMPI_Init_thread(int *argc, char ***argv, int required, int *provided) { if (provided != NULL) { @@ -131,6 +153,11 @@ int PMPI_Address(void *location, MPI_Aint * address) return retval; } +int PMPI_Get_address(void *location, MPI_Aint * address) +{ + return PMPI_Address(location, address); +} + int PMPI_Type_free(MPI_Datatype * datatype) { int retval; @@ -179,6 +206,11 @@ int PMPI_Type_get_extent(MPI_Datatype datatype, MPI_Aint * lb, MPI_Aint * extent return retval; } +int PMPI_Type_get_true_extent(MPI_Datatype datatype, MPI_Aint * lb, MPI_Aint * extent) +{ + return PMPI_Type_get_extent(datatype, lb, extent); +} + int PMPI_Type_extent(MPI_Datatype datatype, MPI_Aint * extent) { int retval; @@ -986,7 +1018,7 @@ int PMPI_Isend(void *buf, int count, MPI_Datatype datatype, int dst, *request = MPI_REQUEST_NULL; retval = MPI_SUCCESS; } else if (dst >= smpi_group_size(smpi_comm_group(comm)) || dst <0){ - retval = MPI_ERR_COMM; + retval = MPI_ERR_RANK; } else if (count < 0) { retval = MPI_ERR_COUNT; } else if (buf==NULL && count > 0) { @@ -1031,7 +1063,7 @@ int PMPI_Issend(void* buf, int count, MPI_Datatype datatype, int dst, int tag, M *request = MPI_REQUEST_NULL; retval = MPI_SUCCESS; } else if (dst >= smpi_group_size(smpi_comm_group(comm)) || dst <0){ - retval = MPI_ERR_COMM; + retval = MPI_ERR_RANK; } else if (count < 0) { retval = MPI_ERR_COUNT; } else if (buf==NULL && count > 0) { @@ -1077,7 +1109,7 @@ int PMPI_Recv(void *buf, int count, MPI_Datatype datatype, int src, int tag, status->MPI_SOURCE = MPI_PROC_NULL; retval = MPI_SUCCESS; } else if (src!=MPI_ANY_SOURCE && (src >= smpi_group_size(smpi_comm_group(comm)) || src <0)){ - retval = MPI_ERR_COMM; + retval = MPI_ERR_RANK; } else if (count < 0) { retval = MPI_ERR_COUNT; } else if (buf==NULL && count > 0) { @@ -1123,7 +1155,7 @@ int PMPI_Send(void *buf, int count, MPI_Datatype datatype, int dst, int tag, } else if (dst == MPI_PROC_NULL) { retval = MPI_SUCCESS; } else if (dst >= smpi_group_size(smpi_comm_group(comm)) || dst <0){ - retval = MPI_ERR_COMM; + retval = MPI_ERR_RANK; } else if (count < 0) { retval = MPI_ERR_COUNT; } else if (buf==NULL && count > 0) { @@ -1167,7 +1199,7 @@ int PMPI_Ssend(void* buf, int count, MPI_Datatype datatype, int dst, int tag, MP } else if (dst == MPI_PROC_NULL) { retval = MPI_SUCCESS; } else if (dst >= smpi_group_size(smpi_comm_group(comm)) || dst <0){ - retval = MPI_ERR_COMM; + retval = MPI_ERR_RANK; } else if (count < 0) { retval = MPI_ERR_COUNT; } else if (buf==NULL && count > 0) { @@ -1219,7 +1251,7 @@ int PMPI_Sendrecv(void *sendbuf, int sendcount, MPI_Datatype sendtype, retval = MPI_SUCCESS; }else if (dst >= smpi_group_size(smpi_comm_group(comm)) || dst <0 || (src!=MPI_ANY_SOURCE && (src >= smpi_group_size(smpi_comm_group(comm)) || src <0))){ - retval = MPI_ERR_COMM; + retval = MPI_ERR_RANK; } else if (sendcount < 0 || recvcount<0) { retval = MPI_ERR_COUNT; } else if ((sendbuf==NULL && sendcount > 0)||(recvbuf==NULL && recvcount>0)) { @@ -1235,7 +1267,6 @@ int PMPI_Sendrecv(void *sendbuf, int sendcount, MPI_Datatype sendtype, int src_traced = smpi_group_index(smpi_comm_group(comm), src); TRACE_smpi_ptp_in(rank, src_traced, dst_traced, __FUNCTION__); TRACE_smpi_send(rank, rank, dst_traced); - TRACE_smpi_send(rank, src_traced, rank); #endif @@ -1245,7 +1276,6 @@ int PMPI_Sendrecv(void *sendbuf, int sendcount, MPI_Datatype sendtype, #ifdef HAVE_TRACING TRACE_smpi_ptp_out(rank, src_traced, dst_traced, __FUNCTION__); - TRACE_smpi_recv(rank, rank, dst_traced); TRACE_smpi_recv(rank, src_traced, rank); TRACE_smpi_computing_in(rank); #endif @@ -1263,18 +1293,18 @@ int PMPI_Sendrecv_replace(void *buf, int count, MPI_Datatype datatype, //TODO: suboptimal implementation void *recvbuf; int retval; - if ((datatype == MPI_DATATYPE_NULL)||(datatype->has_subtype==1)) { + if (datatype == MPI_DATATYPE_NULL) { retval = MPI_ERR_TYPE; } else if (count < 0) { retval = MPI_ERR_COUNT; } else { - int size = smpi_datatype_size(datatype) * count; + int size = smpi_datatype_get_extent(datatype) * count; recvbuf = xbt_new(char, size); retval = MPI_Sendrecv(buf, count, datatype, dst, sendtag, recvbuf, count, datatype, src, recvtag, comm, status); if(retval==MPI_SUCCESS){ - memcpy(buf, recvbuf, size * sizeof(char)); + smpi_datatype_copy(recvbuf, count, datatype, buf, count, datatype); } xbt_free(recvbuf); @@ -1392,9 +1422,8 @@ int PMPI_Wait(MPI_Request * request, MPI_Status * status) : -1; TRACE_smpi_computing_out(rank); - MPI_Group group = smpi_comm_group((*request)->comm); - int src_traced = smpi_group_index(group, (*request)->src); - int dst_traced = smpi_group_index(group, (*request)->dst); + int src_traced = (*request)->src; + int dst_traced = (*request)->dst; int is_wait_for_receive = (*request)->recv; TRACE_smpi_ptp_in(rank, src_traced, dst_traced, __FUNCTION__); #endif @@ -1479,7 +1508,7 @@ int PMPI_Waitall(int count, MPI_Request requests[], MPI_Status status[]) int valid_count = 0; for (i = 0; i < count; i++) { MPI_Request req = requests[i]; - if(req){ + if(req!=MPI_REQUEST_NULL){ srcs[valid_count] = req->src; dsts[valid_count] = req->dst; recvs[valid_count] = req->recv; @@ -1558,7 +1587,7 @@ int PMPI_Bcast(void *buf, int count, MPI_Datatype datatype, int root, MPI_Comm c if (comm == MPI_COMM_NULL) { retval = MPI_ERR_COMM; } else { - smpi_mpi_bcast(buf, count, datatype, root, comm); + mpi_coll_bcast_fun(buf, count, datatype, root, comm); retval = MPI_SUCCESS; } #ifdef HAVE_TRACING @@ -1582,7 +1611,7 @@ int PMPI_Barrier(MPI_Comm comm) if (comm == MPI_COMM_NULL) { retval = MPI_ERR_COMM; } else { - smpi_mpi_barrier(comm); + mpi_coll_barrier_fun(comm); retval = MPI_SUCCESS; } #ifdef HAVE_TRACING @@ -1612,7 +1641,7 @@ int PMPI_Gather(void *sendbuf, int sendcount, MPI_Datatype sendtype, || recvtype == MPI_DATATYPE_NULL) { retval = MPI_ERR_TYPE; } else { - smpi_mpi_gather(sendbuf, sendcount, sendtype, recvbuf, recvcount, + mpi_coll_gather_fun(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm); retval = MPI_SUCCESS; } @@ -1675,8 +1704,8 @@ int PMPI_Allgather(void *sendbuf, int sendcount, MPI_Datatype sendtype, || recvtype == MPI_DATATYPE_NULL) { retval = MPI_ERR_TYPE; } else { - smpi_mpi_allgather(sendbuf, sendcount, sendtype, recvbuf, recvcount, - recvtype, comm); + mpi_coll_allgather_fun(sendbuf, sendcount, sendtype, recvbuf, recvcount, + recvtype, comm); retval = MPI_SUCCESS; } #ifdef HAVE_TRACING @@ -1706,7 +1735,7 @@ int PMPI_Allgatherv(void *sendbuf, int sendcount, MPI_Datatype sendtype, } else if (recvcounts == NULL || displs == NULL) { retval = MPI_ERR_ARG; } else { - smpi_mpi_allgatherv(sendbuf, sendcount, sendtype, recvbuf, recvcounts, + mpi_coll_allgatherv_fun(sendbuf, sendcount, sendtype, recvbuf, recvcounts, displs, recvtype, comm); retval = MPI_SUCCESS; } @@ -1738,7 +1767,7 @@ int PMPI_Scatter(void *sendbuf, int sendcount, MPI_Datatype sendtype, || recvtype == MPI_DATATYPE_NULL) { retval = MPI_ERR_TYPE; } else { - smpi_mpi_scatter(sendbuf, sendcount, sendtype, recvbuf, recvcount, + mpi_coll_scatter_fun(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm); retval = MPI_SUCCESS; } @@ -1800,7 +1829,7 @@ int PMPI_Reduce(void *sendbuf, void *recvbuf, int count, } else if (datatype == MPI_DATATYPE_NULL || op == MPI_OP_NULL) { retval = MPI_ERR_ARG; } else { - smpi_mpi_reduce(sendbuf, recvbuf, count, datatype, op, root, comm); + mpi_coll_reduce_fun(sendbuf, recvbuf, count, datatype, op, root, comm); retval = MPI_SUCCESS; } #ifdef HAVE_TRACING @@ -1811,6 +1840,21 @@ int PMPI_Reduce(void *sendbuf, void *recvbuf, int count, return retval; } +int PMPI_Reduce_local(void *inbuf, void *inoutbuf, int count, + MPI_Datatype datatype, MPI_Op op){ + int retval; + + smpi_bench_end(); + if (datatype == MPI_DATATYPE_NULL || op == MPI_OP_NULL) { + retval = MPI_ERR_ARG; + } else { + smpi_op_apply(op, inbuf, inoutbuf, &count, &datatype); + retval=MPI_SUCCESS; + } + smpi_bench_begin(); + return retval; +} + int PMPI_Allreduce(void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm) { @@ -1829,7 +1873,7 @@ int PMPI_Allreduce(void *sendbuf, void *recvbuf, int count, } else if (op == MPI_OP_NULL) { retval = MPI_ERR_OP; } else { - smpi_mpi_allreduce(sendbuf, recvbuf, count, datatype, op, comm); + mpi_coll_allreduce_fun(sendbuf, recvbuf, count, datatype, op, comm); retval = MPI_SUCCESS; } #ifdef HAVE_TRACING @@ -1872,12 +1916,42 @@ int PMPI_Scan(void *sendbuf, void *recvbuf, int count, int PMPI_Reduce_scatter(void *sendbuf, void *recvbuf, int *recvcounts, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm) { - int retval, i, size, count; - int *displs; + int retval; + 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__); +#endif + if (comm == MPI_COMM_NULL) { + retval = MPI_ERR_COMM; + } else if (datatype == MPI_DATATYPE_NULL) { + retval = MPI_ERR_TYPE; + } else if (op == MPI_OP_NULL) { + retval = MPI_ERR_OP; + } else if (recvcounts == NULL) { + retval = MPI_ERR_ARG; + } else { + mpi_coll_reduce_scatter_fun(sendbuf, recvbuf, recvcounts, + datatype, op, 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; +} + +int PMPI_Reduce_scatter_block(void *sendbuf, void *recvbuf, int recvcount, + MPI_Datatype datatype, MPI_Op op, MPI_Comm comm) +{ + int retval,i; 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__); #endif @@ -1887,22 +1961,15 @@ int PMPI_Reduce_scatter(void *sendbuf, void *recvbuf, int *recvcounts, retval = MPI_ERR_TYPE; } else if (op == MPI_OP_NULL) { retval = MPI_ERR_OP; - } else if (recvcounts == NULL) { + } else if (recvcount < 0) { retval = MPI_ERR_ARG; } else { - /* arbitrarily choose root as rank 0 */ - /* TODO: faster direct implementation ? */ - size = smpi_comm_size(comm); - count = 0; - displs = xbt_new(int, size); - for (i = 0; i < size; i++) { - count += recvcounts[i]; - displs[i] = 0; - } - smpi_mpi_reduce(sendbuf, recvbuf, count, datatype, op, 0, comm); - smpi_mpi_scatterv(recvbuf, recvcounts, displs, datatype, recvbuf, - recvcounts[rank], datatype, 0, comm); - xbt_free(displs); + int count=smpi_comm_size(comm); + int* recvcounts=(int*)xbt_malloc(count); + for (i=0; i