X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/c126fdf651057c849b4614da3fdd76a64d9c0036..198a6259727de39df5bb03861f67cb88f9a84373:/src/smpi/smpi_pmpi.c diff --git a/src/smpi/smpi_pmpi.c b/src/smpi/smpi_pmpi.c index d730222bf8..1c12d353be 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,10 +206,14 @@ 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; - MPI_Aint dummy; smpi_bench_end(); if (datatype == MPI_DATATYPE_NULL) { @@ -190,7 +221,8 @@ int PMPI_Type_extent(MPI_Datatype datatype, MPI_Aint * extent) } else if (extent == NULL) { retval = MPI_ERR_ARG; } else { - retval = smpi_datatype_extent(datatype, &dummy, extent); + *extent = smpi_datatype_get_extent(datatype); + retval = MPI_SUCCESS; } smpi_bench_begin(); return retval; @@ -271,6 +303,7 @@ int PMPI_Group_free(MPI_Group * group) if (group == NULL) { retval = MPI_ERR_ARG; } else { + if(*group!= smpi_comm_group(MPI_COMM_WORLD))// do not free the group of the comm_world smpi_group_destroy(*group); *group = MPI_GROUP_NULL; retval = MPI_SUCCESS; @@ -317,14 +350,17 @@ int PMPI_Group_translate_ranks(MPI_Group group1, int n, int *ranks1, MPI_Group group2, int *ranks2) { int retval, i, index; - smpi_bench_end(); if (group1 == MPI_GROUP_NULL || group2 == MPI_GROUP_NULL) { retval = MPI_ERR_GROUP; } else { for (i = 0; i < n; i++) { - index = smpi_group_index(group1, ranks1[i]); - ranks2[i] = smpi_group_rank(group2, index); + if(ranks1[i]==MPI_PROC_NULL){ + ranks2[i]=MPI_PROC_NULL; + }else{ + index = smpi_group_index(group1, ranks1[i]); + ranks2[i] = smpi_group_rank(group2, index); + } } retval = MPI_SUCCESS; } @@ -393,7 +429,7 @@ int PMPI_Group_union(MPI_Group group1, MPI_Group group2, int PMPI_Group_intersection(MPI_Group group1, MPI_Group group2, MPI_Group * newgroup) { - int retval, i, proc1, proc2, size, size2; + int retval, i, proc1, proc2, size; smpi_bench_end(); if (group1 == MPI_GROUP_NULL || group2 == MPI_GROUP_NULL) { @@ -401,9 +437,8 @@ int PMPI_Group_intersection(MPI_Group group1, MPI_Group group2, } else if (newgroup == NULL) { retval = MPI_ERR_ARG; } else { - size = smpi_group_size(group1); - size2 = smpi_group_size(group2); - for (i = 0; i < size2; i++) { + size = smpi_group_size(group2); + for (i = 0; i < size; i++) { proc2 = smpi_group_index(group2, i); proc1 = smpi_group_rank(group1, proc2); if (proc1 == MPI_UNDEFINED) { @@ -414,12 +449,13 @@ int PMPI_Group_intersection(MPI_Group group1, MPI_Group group2, *newgroup = MPI_GROUP_EMPTY; } else { *newgroup = smpi_group_new(size); - size2 = smpi_group_size(group1); - for (i = 0; i < size2; i++) { - proc1 = smpi_group_index(group1, i); - proc2 = smpi_group_rank(group2, proc1); - if (proc2 != MPI_UNDEFINED) { - smpi_group_set_mapping(*newgroup, proc1, i); + int j=0; + for (i = 0; i < smpi_group_size(group2); i++) { + proc2 = smpi_group_index(group2, i); + proc1 = smpi_group_rank(group1, proc2); + if (proc1 != MPI_UNDEFINED) { + smpi_group_set_mapping(*newgroup, proc2, j); + j++; } } } @@ -497,7 +533,7 @@ int PMPI_Group_incl(MPI_Group group, int n, int *ranks, MPI_Group * newgroup) int PMPI_Group_excl(MPI_Group group, int n, int *ranks, MPI_Group * newgroup) { - int retval, i, size, rank, index; + int retval, i, j, newsize, oldsize, index; smpi_bench_end(); if (group == MPI_GROUP_NULL) { @@ -510,21 +546,26 @@ int PMPI_Group_excl(MPI_Group group, int n, int *ranks, MPI_Group * newgroup) } else if (n == smpi_group_size(group)) { *newgroup = MPI_GROUP_EMPTY; } else { - size = smpi_group_size(group) - n; - *newgroup = smpi_group_new(size); - rank = 0; - while (rank < size) { - for (i = 0; i < n; i++) { - if (ranks[i] == rank) { - break; - } - } - if (i >= n) { - index = smpi_group_index(group, rank); - smpi_group_set_mapping(*newgroup, index, rank); - rank++; + oldsize=smpi_group_size(group); + newsize = oldsize - n; + *newgroup = smpi_group_new(newsize); + + int* to_exclude=xbt_new(int, smpi_group_size(group)); + for(i=0; i= 0 && rank <= ranges[i][1]; /* Last */ - rank += ranges[i][2] /* Stride */ ) { + rank >= 0; /* Last */ + ) { size++; + + rank += ranges[i][2]; /* Stride */ + if (ranges[i][0] ranges[i][1]) + break; + }else{ + if(rank < ranges[i][1]) + break; + } } } - if (size == smpi_group_size(group)) { - *newgroup = group; - } else { + *newgroup = smpi_group_new(size); j = 0; for (i = 0; i < n; i++) { for (rank = ranges[i][0]; /* First */ - rank >= 0 && rank <= ranges[i][1]; /* Last */ - rank += ranges[i][2] /* Stride */ ) { + rank >= 0; /* Last */ + ) { index = smpi_group_index(group, rank); smpi_group_set_mapping(*newgroup, index, j); j++; + rank += ranges[i][2]; /* Stride */ + if (ranges[i][0] ranges[i][1]) + break; + }else{ + if(rank < ranges[i][1]) + break; + } } } - } + //} } smpi_group_use(*newgroup); retval = MPI_SUCCESS; @@ -621,6 +677,7 @@ int PMPI_Group_range_excl(MPI_Group group, int n, int ranges[][3], smpi_group_set_mapping(*newgroup, index, newrank); } } + newrank++; //added to avoid looping, need to be checked .. } } } @@ -753,7 +810,11 @@ int PMPI_Comm_create(MPI_Comm comm, MPI_Group group, MPI_Comm * newcomm) retval = MPI_ERR_GROUP; } else if (newcomm == NULL) { retval = MPI_ERR_ARG; - } else { + } else if(smpi_group_rank(group,smpi_process_index())==MPI_UNDEFINED){ + *newcomm= MPI_COMM_NULL; + retval = MPI_SUCCESS; + }else{ + *newcomm = smpi_comm_new(group); retval = MPI_SUCCESS; } @@ -825,6 +886,8 @@ int PMPI_Send_init(void *buf, int count, MPI_Datatype datatype, int dst, retval = MPI_ERR_ARG; } else if (comm == MPI_COMM_NULL) { retval = MPI_ERR_COMM; + } else if (dst == MPI_PROC_NULL) { + retval = MPI_SUCCESS; } else { *request = smpi_mpi_send_init(buf, count, datatype, dst, tag, comm); retval = MPI_SUCCESS; @@ -843,6 +906,8 @@ int PMPI_Recv_init(void *buf, int count, MPI_Datatype datatype, int src, retval = MPI_ERR_ARG; } else if (comm == MPI_COMM_NULL) { retval = MPI_ERR_COMM; + } else if (src == MPI_PROC_NULL) { + retval = MPI_SUCCESS; } else { *request = smpi_mpi_recv_init(buf, count, datatype, src, tag, comm); retval = MPI_SUCCESS; @@ -851,12 +916,30 @@ int PMPI_Recv_init(void *buf, int count, MPI_Datatype datatype, int src, return retval; } +int PMPI_Ssend_init(void* buf, int count, MPI_Datatype datatype, int dst, int tag, MPI_Comm comm, MPI_Request* request) { + int retval; + + smpi_bench_end(); + if (request == NULL) { + retval = MPI_ERR_ARG; + } else if (comm == MPI_COMM_NULL) { + retval = MPI_ERR_COMM; + } else if (dst == MPI_PROC_NULL) { + retval = MPI_SUCCESS; + } else { + *request = smpi_mpi_ssend_init(buf, count, datatype, dst, tag, comm); + retval = MPI_SUCCESS; + } + smpi_bench_begin(); + return retval; +} + int PMPI_Start(MPI_Request * request) { int retval; smpi_bench_end(); - if (request == NULL) { + if (request == NULL || *request == MPI_REQUEST_NULL) { retval = MPI_ERR_ARG; } else { smpi_mpi_start(*request); @@ -886,9 +969,10 @@ int PMPI_Request_free(MPI_Request * request) int retval; smpi_bench_end(); - if (request == NULL) { + if (*request == MPI_REQUEST_NULL) { retval = MPI_ERR_ARG; } else { + if((*request)->flags & PERSISTENT)(*request)->refcount--; smpi_mpi_request_free(request); retval = MPI_SUCCESS; } @@ -902,23 +986,41 @@ int PMPI_Irecv(void *buf, int count, MPI_Datatype datatype, int src, int retval; smpi_bench_end(); -#ifdef HAVE_TRACING - int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1; - int src_traced = smpi_group_rank(smpi_comm_group(comm), src); - TRACE_smpi_ptp_in(rank, src_traced, rank, __FUNCTION__); -#endif + if (request == NULL) { retval = MPI_ERR_ARG; } else if (comm == MPI_COMM_NULL) { retval = MPI_ERR_COMM; + } else if (src == MPI_PROC_NULL) { + *request = MPI_REQUEST_NULL; + retval = MPI_SUCCESS; + } else if (src!=MPI_ANY_SOURCE && (src >= smpi_group_size(smpi_comm_group(comm)) || src <0)){ + retval = MPI_ERR_COMM; + } else if (count < 0) { + retval = MPI_ERR_COUNT; + } else if (buf==NULL && count > 0) { + retval = MPI_ERR_COUNT; + } else if (datatype == MPI_DATATYPE_NULL){ + retval = MPI_ERR_TYPE; + } else if(tag<0 && tag != MPI_ANY_TAG){ + retval = MPI_ERR_TAG; } else { + +#ifdef HAVE_TRACING + int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1; + int src_traced = smpi_group_index(smpi_comm_group(comm), src); + TRACE_smpi_ptp_in(rank, src_traced, rank, __FUNCTION__); +#endif + *request = smpi_mpi_irecv(buf, count, datatype, src, tag, comm); retval = MPI_SUCCESS; - } + #ifdef HAVE_TRACING TRACE_smpi_ptp_out(rank, src_traced, rank, __FUNCTION__); (*request)->recv = 1; #endif + } + smpi_bench_begin(); return retval; } @@ -930,58 +1032,135 @@ int PMPI_Isend(void *buf, int count, MPI_Datatype datatype, int dst, int retval; smpi_bench_end(); + if (request == NULL) { + retval = MPI_ERR_ARG; + } else if (comm == MPI_COMM_NULL) { + retval = MPI_ERR_COMM; + } else if (dst == MPI_PROC_NULL) { + *request = MPI_REQUEST_NULL; + retval = MPI_SUCCESS; + } else if (dst >= smpi_group_size(smpi_comm_group(comm)) || dst <0){ + retval = MPI_ERR_RANK; + } else if (count < 0) { + retval = MPI_ERR_COUNT; + } else if (buf==NULL && count > 0) { + retval = MPI_ERR_COUNT; + } else if (datatype == MPI_DATATYPE_NULL){ + retval = MPI_ERR_TYPE; + } else if(tag<0 && tag != MPI_ANY_TAG){ + retval = MPI_ERR_TAG; + } else { + #ifdef HAVE_TRACING - int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1; + int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1; TRACE_smpi_computing_out(rank); - int dst_traced = smpi_group_rank(smpi_comm_group(comm), dst); + int dst_traced = smpi_group_index(smpi_comm_group(comm), dst); TRACE_smpi_ptp_in(rank, rank, dst_traced, __FUNCTION__); TRACE_smpi_send(rank, rank, dst_traced); #endif + + *request = smpi_mpi_isend(buf, count, datatype, dst, tag, comm); + retval = MPI_SUCCESS; + +#ifdef HAVE_TRACING + TRACE_smpi_ptp_out(rank, rank, dst_traced, __FUNCTION__); + (*request)->send = 1; + TRACE_smpi_computing_in(rank); +#endif + } + + smpi_bench_begin(); + return retval; +} + +int PMPI_Issend(void* buf, int count, MPI_Datatype datatype, int dst, int tag, MPI_Comm comm, MPI_Request* request) { + int retval; + + smpi_bench_end(); if (request == NULL) { retval = MPI_ERR_ARG; } else if (comm == MPI_COMM_NULL) { retval = MPI_ERR_COMM; + } else if (dst == MPI_PROC_NULL) { + *request = MPI_REQUEST_NULL; + retval = MPI_SUCCESS; + } else if (dst >= smpi_group_size(smpi_comm_group(comm)) || dst <0){ + retval = MPI_ERR_RANK; + } else if (count < 0) { + retval = MPI_ERR_COUNT; + } else if (buf==NULL && count > 0) { + retval = MPI_ERR_COUNT; + } else if (datatype == MPI_DATATYPE_NULL){ + retval = MPI_ERR_TYPE; + } else if(tag<0 && tag != MPI_ANY_TAG){ + retval = MPI_ERR_TAG; } else { - *request = smpi_mpi_isend(buf, count, datatype, dst, tag, comm); + +#ifdef HAVE_TRACING + int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1; + TRACE_smpi_computing_out(rank); + int dst_traced = smpi_group_index(smpi_comm_group(comm), dst); + TRACE_smpi_ptp_in(rank, rank, dst_traced, __FUNCTION__); + TRACE_smpi_send(rank, rank, dst_traced); +#endif + + *request = smpi_mpi_issend(buf, count, datatype, dst, tag, comm); retval = MPI_SUCCESS; - } + #ifdef HAVE_TRACING TRACE_smpi_ptp_out(rank, rank, dst_traced, __FUNCTION__); (*request)->send = 1; TRACE_smpi_computing_in(rank); #endif + } + smpi_bench_begin(); return retval; } - - int PMPI_Recv(void *buf, int count, MPI_Datatype datatype, int src, int tag, MPI_Comm comm, MPI_Status * status) { int retval; smpi_bench_end(); + if (comm == MPI_COMM_NULL) { + retval = MPI_ERR_COMM; + } else if (src == MPI_PROC_NULL) { + smpi_empty_status(status); + 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_RANK; + } else if (count < 0) { + retval = MPI_ERR_COUNT; + } else if (buf==NULL && count > 0) { + retval = MPI_ERR_COUNT; + } else if (datatype == MPI_DATATYPE_NULL){ + retval = MPI_ERR_TYPE; + } else if(tag<0 && tag != MPI_ANY_TAG){ + retval = MPI_ERR_TAG; + } else { #ifdef HAVE_TRACING - int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1; - int src_traced = smpi_group_rank(smpi_comm_group(comm), src); + int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1; + int src_traced = smpi_group_index(smpi_comm_group(comm), src); TRACE_smpi_computing_out(rank); TRACE_smpi_ptp_in(rank, src_traced, rank, __FUNCTION__); #endif - if (comm == MPI_COMM_NULL) { - retval = MPI_ERR_COMM; - } else { + smpi_mpi_recv(buf, count, datatype, src, tag, comm, status); retval = MPI_SUCCESS; - } + #ifdef HAVE_TRACING //the src may not have been known at the beginning of the recv (MPI_ANY_SOURCE) - if(status!=MPI_STATUS_IGNORE)src_traced = smpi_group_rank(smpi_comm_group(comm), status->MPI_SOURCE); + if(status!=MPI_STATUS_IGNORE)src_traced = smpi_group_index(smpi_comm_group(comm), status->MPI_SOURCE); TRACE_smpi_ptp_out(rank, src_traced, rank, __FUNCTION__); TRACE_smpi_recv(rank, src_traced, rank); TRACE_smpi_computing_in(rank); #endif + } + smpi_bench_begin(); return retval; } @@ -992,27 +1171,88 @@ int PMPI_Send(void *buf, int count, MPI_Datatype datatype, int dst, int tag, int retval; smpi_bench_end(); + + if (comm == MPI_COMM_NULL) { + retval = MPI_ERR_COMM; + } else if (dst == MPI_PROC_NULL) { + retval = MPI_SUCCESS; + } else if (dst >= smpi_group_size(smpi_comm_group(comm)) || dst <0){ + retval = MPI_ERR_RANK; + } else if (count < 0) { + retval = MPI_ERR_COUNT; + } else if (buf==NULL && count > 0) { + retval = MPI_ERR_COUNT; + } else if (datatype == MPI_DATATYPE_NULL){ + retval = MPI_ERR_TYPE; + } else if(tag<0 && tag != MPI_ANY_TAG){ + retval = MPI_ERR_TAG; + } else { + #ifdef HAVE_TRACING - int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1; + int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1; TRACE_smpi_computing_out(rank); - int dst_traced = smpi_group_rank(smpi_comm_group(comm), dst); + int dst_traced = smpi_group_index(smpi_comm_group(comm), dst); TRACE_smpi_ptp_in(rank, rank, dst_traced, __FUNCTION__); TRACE_smpi_send(rank, rank, dst_traced); #endif - if (comm == MPI_COMM_NULL) { - retval = MPI_ERR_COMM; - } else { + smpi_mpi_send(buf, count, datatype, dst, tag, comm); retval = MPI_SUCCESS; - } + #ifdef HAVE_TRACING TRACE_smpi_ptp_out(rank, rank, dst_traced, __FUNCTION__); TRACE_smpi_computing_in(rank); #endif + } + smpi_bench_begin(); return retval; } + + +int PMPI_Ssend(void* buf, int count, MPI_Datatype datatype, int dst, int tag, MPI_Comm comm) { + int retval; + + smpi_bench_end(); + + if (comm == MPI_COMM_NULL) { + retval = MPI_ERR_COMM; + } else if (dst == MPI_PROC_NULL) { + retval = MPI_SUCCESS; + } else if (dst >= smpi_group_size(smpi_comm_group(comm)) || dst <0){ + retval = MPI_ERR_RANK; + } else if (count < 0) { + retval = MPI_ERR_COUNT; + } else if (buf==NULL && count > 0) { + retval = MPI_ERR_COUNT; + } else if (datatype == MPI_DATATYPE_NULL){ + retval = MPI_ERR_TYPE; + } else if(tag<0 && tag != MPI_ANY_TAG){ + retval = MPI_ERR_TAG; + } else { + + #ifdef HAVE_TRACING + int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1; + TRACE_smpi_computing_out(rank); + int dst_traced = smpi_group_index(smpi_comm_group(comm), dst); + TRACE_smpi_ptp_in(rank, rank, dst_traced, __FUNCTION__); + TRACE_smpi_send(rank, rank, dst_traced); + #endif + + smpi_mpi_ssend(buf, count, datatype, dst, tag, comm); + retval = MPI_SUCCESS; + + #ifdef HAVE_TRACING + TRACE_smpi_ptp_out(rank, rank, dst_traced, __FUNCTION__); + TRACE_smpi_computing_in(rank); + #endif + } + + smpi_bench_begin(); + return retval;} + + int PMPI_Sendrecv(void *sendbuf, int sendcount, MPI_Datatype sendtype, int dst, int sendtag, void *recvbuf, int recvcount, MPI_Datatype recvtype, int src, int recvtag, @@ -1021,32 +1261,49 @@ int PMPI_Sendrecv(void *sendbuf, int sendcount, MPI_Datatype sendtype, int retval; smpi_bench_end(); -#ifdef HAVE_TRACING - int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1; - TRACE_smpi_computing_out(rank); - int dst_traced = smpi_group_rank(smpi_comm_group(comm), dst); - int src_traced = smpi_group_rank(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 + if (comm == MPI_COMM_NULL) { retval = MPI_ERR_COMM; } else if (sendtype == MPI_DATATYPE_NULL || recvtype == MPI_DATATYPE_NULL) { retval = MPI_ERR_TYPE; + } else if (src == MPI_PROC_NULL || dst == MPI_PROC_NULL) { + smpi_empty_status(status); + status->MPI_SOURCE = MPI_PROC_NULL; + 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_RANK; + } else if (sendcount < 0 || recvcount<0) { + retval = MPI_ERR_COUNT; + } else if ((sendbuf==NULL && sendcount > 0)||(recvbuf==NULL && recvcount>0)) { + retval = MPI_ERR_COUNT; + } else if((sendtag<0 && sendtag != MPI_ANY_TAG)||(recvtag<0 && recvtag != MPI_ANY_TAG)){ + retval = MPI_ERR_TAG; } else { + +#ifdef HAVE_TRACING + int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1; + TRACE_smpi_computing_out(rank); + int dst_traced = smpi_group_index(smpi_comm_group(comm), dst); + 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); +#endif + + smpi_mpi_sendrecv(sendbuf, sendcount, sendtype, dst, sendtag, recvbuf, recvcount, recvtype, src, recvtag, comm, status); retval = MPI_SUCCESS; - } + #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 + + } + smpi_bench_begin(); return retval; } @@ -1057,15 +1314,23 @@ int PMPI_Sendrecv_replace(void *buf, int count, MPI_Datatype datatype, { //TODO: suboptimal implementation void *recvbuf; - int retval, size; + int retval; + if (datatype == MPI_DATATYPE_NULL) { + retval = MPI_ERR_TYPE; + } else if (count < 0) { + retval = MPI_ERR_COUNT; + } else { + 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){ + smpi_datatype_copy(recvbuf, count, datatype, buf, count, datatype); + } + xbt_free(recvbuf); - size = smpi_datatype_size(datatype) * count; - recvbuf = xbt_new(char, size); - retval = - MPI_Sendrecv(buf, count, datatype, dst, sendtag, recvbuf, count, - datatype, src, recvtag, comm, status); - memcpy(buf, recvbuf, size * sizeof(char)); - xbt_free(recvbuf); + } return retval; } @@ -1074,9 +1339,10 @@ int PMPI_Test(MPI_Request * request, int *flag, MPI_Status * status) int retval; smpi_bench_end(); - if (request == NULL || flag == NULL) { + if (request == MPI_REQUEST_NULL || flag == NULL) { retval = MPI_ERR_ARG; } else if (*request == MPI_REQUEST_NULL) { + *flag= TRUE; retval = MPI_ERR_REQUEST; } else { *flag = smpi_mpi_test(request, status); @@ -1122,12 +1388,16 @@ int PMPI_Probe(int source, int tag, MPI_Comm comm, MPI_Status* status) { smpi_bench_end(); if (status == NULL) { - retval = MPI_ERR_ARG; - }else if (comm == MPI_COMM_NULL) { - retval = MPI_ERR_COMM; + retval = MPI_ERR_ARG; + } else if (comm == MPI_COMM_NULL) { + retval = MPI_ERR_COMM; + } else if (source == MPI_PROC_NULL) { + smpi_empty_status(status); + status->MPI_SOURCE = MPI_PROC_NULL; + retval = MPI_SUCCESS; } else { - smpi_mpi_probe(source, tag, comm, status); - retval = MPI_SUCCESS; + smpi_mpi_probe(source, tag, comm, status); + retval = MPI_SUCCESS; } smpi_bench_begin(); return retval; @@ -1139,14 +1409,18 @@ int PMPI_Iprobe(int source, int tag, MPI_Comm comm, int* flag, MPI_Status* statu smpi_bench_end(); if (flag == NULL) { - retval = MPI_ERR_ARG; - }else if (status == NULL) { - retval = MPI_ERR_ARG; - }else if (comm == MPI_COMM_NULL) { - retval = MPI_ERR_COMM; + retval = MPI_ERR_ARG; + } else if (status == NULL) { + retval = MPI_ERR_ARG; + } else if (comm == MPI_COMM_NULL) { + retval = MPI_ERR_COMM; + } else if (source == MPI_PROC_NULL) { + smpi_empty_status(status); + status->MPI_SOURCE = MPI_PROC_NULL; + retval = MPI_SUCCESS; } else { - smpi_mpi_iprobe(source, tag, comm, flag, status); - retval = MPI_SUCCESS; + smpi_mpi_iprobe(source, tag, comm, flag, status); + retval = MPI_SUCCESS; } smpi_bench_begin(); return retval; @@ -1157,34 +1431,38 @@ int PMPI_Wait(MPI_Request * request, MPI_Status * status) int retval; smpi_bench_end(); + + if (request == NULL) { + retval = MPI_ERR_ARG; + } else if (*request == MPI_REQUEST_NULL) { + retval = MPI_ERR_REQUEST; + } else { + #ifdef HAVE_TRACING int rank = request && (*request)->comm != MPI_COMM_NULL - ? smpi_comm_rank((*request)->comm) + ? smpi_process_index() : -1; TRACE_smpi_computing_out(rank); - MPI_Group group = smpi_comm_group((*request)->comm); - int src_traced = smpi_group_rank(group, (*request)->src); - int dst_traced = smpi_group_rank(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 - if (request == NULL) { - retval = MPI_ERR_ARG; - } else if (*request == MPI_REQUEST_NULL) { - retval = MPI_ERR_REQUEST; - } else { + smpi_mpi_wait(request, status); retval = MPI_SUCCESS; - } + #ifdef HAVE_TRACING TRACE_smpi_ptp_out(rank, src_traced, dst_traced, __FUNCTION__); if (is_wait_for_receive) { TRACE_smpi_recv(rank, src_traced, dst_traced); } TRACE_smpi_computing_in(rank); - #endif + + } + smpi_bench_begin(); return retval; } @@ -1197,33 +1475,18 @@ int PMPI_Waitany(int count, MPI_Request requests[], int *index, MPI_Status * sta #ifdef HAVE_TRACING //save requests information for tracing int i; - xbt_dynar_t srcs = xbt_dynar_new(sizeof(int), NULL); - xbt_dynar_t dsts = xbt_dynar_new(sizeof(int), NULL); - xbt_dynar_t recvs = xbt_dynar_new(sizeof(int), NULL); + int *srcs = xbt_new(int, count); + int *dsts = xbt_new(int, count); + int *recvs = xbt_new(int, count); for (i = 0; i < count; i++) { MPI_Request req = requests[i]; //already received requests are no longer valid if (req) { - int *asrc = xbt_new(int, 1); - int *adst = xbt_new(int, 1); - int *arecv = xbt_new(int, 1); - *asrc = req->src; - *adst = req->dst; - *arecv = req->recv; - xbt_dynar_insert_at(srcs, i, asrc); - xbt_dynar_insert_at(dsts, i, adst); - xbt_dynar_insert_at(recvs, i, arecv); - xbt_free(asrc); - xbt_free(adst); - xbt_free(arecv); - } else { - int *t = xbt_new(int, 1); - xbt_dynar_insert_at(srcs, i, t); - xbt_dynar_insert_at(dsts, i, t); - xbt_dynar_insert_at(recvs, i, t); - xbt_free(t); + srcs[i] = req->src; + dsts[i] = req->dst; + recvs[i] = req->recv; } } - int rank_traced = smpi_comm_rank(MPI_COMM_WORLD); + int rank_traced = smpi_process_index(); TRACE_smpi_computing_out(rank_traced); TRACE_smpi_ptp_in(rank_traced, -1, -1, __FUNCTION__); @@ -1236,20 +1499,19 @@ int PMPI_Waitany(int count, MPI_Request requests[], int *index, MPI_Status * sta retval = MPI_SUCCESS; } #ifdef HAVE_TRACING - int src_traced, dst_traced, is_wait_for_receive; - xbt_dynar_get_cpy(srcs, *index, &src_traced); - xbt_dynar_get_cpy(dsts, *index, &dst_traced); - xbt_dynar_get_cpy(recvs, *index, &is_wait_for_receive); - if (is_wait_for_receive) { - TRACE_smpi_recv(rank_traced, src_traced, dst_traced); + if(*index!=MPI_UNDEFINED){ + int src_traced = srcs[*index]; + int dst_traced = dsts[*index]; + int is_wait_for_receive = recvs[*index]; + if (is_wait_for_receive) { + TRACE_smpi_recv(rank_traced, src_traced, dst_traced); + } + TRACE_smpi_ptp_out(rank_traced, src_traced, dst_traced, __FUNCTION__); + xbt_free(srcs); + xbt_free(dsts); + xbt_free(recvs); } - TRACE_smpi_ptp_out(rank_traced, src_traced, dst_traced, __FUNCTION__); - //clean-up of dynars - xbt_dynar_free(&srcs); - xbt_dynar_free(&dsts); - xbt_dynar_free(&recvs); TRACE_smpi_computing_in(rank_traced); - #endif smpi_bench_begin(); return retval; @@ -1262,49 +1524,42 @@ int PMPI_Waitall(int count, MPI_Request requests[], MPI_Status status[]) #ifdef HAVE_TRACING //save information from requests int i; - xbt_dynar_t srcs = xbt_dynar_new(sizeof(int), NULL); - xbt_dynar_t dsts = xbt_dynar_new(sizeof(int), NULL); - xbt_dynar_t recvs = xbt_dynar_new(sizeof(int), NULL); + int *srcs = xbt_new(int, count); + int *dsts = xbt_new(int, count); + int *recvs = xbt_new(int, count); + int valid_count = 0; for (i = 0; i < count; i++) { - MPI_Request req = requests[i]; //all req should be valid in Waitall - int *asrc = xbt_new(int, 1); - int *adst = xbt_new(int, 1); - int *arecv = xbt_new(int, 1); - *asrc = req->src; - *adst = req->dst; - *arecv = req->recv; - xbt_dynar_insert_at(srcs, i, asrc); - xbt_dynar_insert_at(dsts, i, adst); - xbt_dynar_insert_at(recvs, i, arecv); - xbt_free(asrc); - xbt_free(adst); - xbt_free(arecv); - } - int rank_traced = smpi_comm_rank (MPI_COMM_WORLD); + MPI_Request req = requests[i]; + if(req!=MPI_REQUEST_NULL){ + srcs[valid_count] = req->src; + dsts[valid_count] = req->dst; + recvs[valid_count] = req->recv; + valid_count++; + } + } + int rank_traced = smpi_process_index(); TRACE_smpi_computing_out(rank_traced); TRACE_smpi_ptp_in(rank_traced, -1, -1, __FUNCTION__); #endif - smpi_mpi_waitall(count, requests, status); + int retval = smpi_mpi_waitall(count, requests, status); #ifdef HAVE_TRACING - for (i = 0; i < count; i++) { - int src_traced, dst_traced, is_wait_for_receive; - xbt_dynar_get_cpy(srcs, i, &src_traced); - xbt_dynar_get_cpy(dsts, i, &dst_traced); - xbt_dynar_get_cpy(recvs, i, &is_wait_for_receive); + for (i = 0; i < valid_count; i++) { + int src_traced = srcs[i]; + int dst_traced = dsts[i]; + int is_wait_for_receive = recvs[i]; if (is_wait_for_receive) { TRACE_smpi_recv(rank_traced, src_traced, dst_traced); } } TRACE_smpi_ptp_out(rank_traced, -1, -1, __FUNCTION__); - //clean-up of dynars - xbt_dynar_free(&srcs); - xbt_dynar_free(&dsts); - xbt_dynar_free(&recvs); + xbt_free(srcs); + xbt_free(dsts); + xbt_free(recvs); TRACE_smpi_computing_in(rank_traced); #endif smpi_bench_begin(); - return MPI_SUCCESS; + return retval; } int PMPI_Waitsome(int incount, MPI_Request requests[], int *outcount, @@ -1323,21 +1578,38 @@ int PMPI_Waitsome(int incount, MPI_Request requests[], int *outcount, return retval; } +int PMPI_Testsome(int incount, MPI_Request requests[], int* outcount, + int* indices, MPI_Status status[]) +{ + int retval; + + smpi_bench_end(); + if (outcount == NULL || indices == NULL) { + retval = MPI_ERR_ARG; + } else { + *outcount = smpi_mpi_testsome(incount, requests, indices, status); + retval = MPI_SUCCESS; + } + smpi_bench_begin(); + return retval; +} + + int PMPI_Bcast(void *buf, int count, MPI_Datatype datatype, int root, MPI_Comm comm) { int retval; smpi_bench_end(); #ifdef HAVE_TRACING - int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1; + int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1; TRACE_smpi_computing_out(rank); - int root_traced = smpi_group_rank(smpi_comm_group(comm), root); + int root_traced = smpi_group_index(smpi_comm_group(comm), root); TRACE_smpi_collective_in(rank, root_traced, __FUNCTION__); #endif 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 @@ -1354,14 +1626,14 @@ int PMPI_Barrier(MPI_Comm comm) smpi_bench_end(); #ifdef HAVE_TRACING - int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1; + 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 { - smpi_mpi_barrier(comm); + mpi_coll_barrier_fun(comm); retval = MPI_SUCCESS; } #ifdef HAVE_TRACING @@ -1380,19 +1652,33 @@ int PMPI_Gather(void *sendbuf, int sendcount, MPI_Datatype sendtype, smpi_bench_end(); #ifdef HAVE_TRACING - int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1; + int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1; TRACE_smpi_computing_out(rank); - int root_traced = smpi_group_rank(smpi_comm_group(comm), root); + int root_traced = smpi_group_index(smpi_comm_group(comm), root); TRACE_smpi_collective_in(rank, root_traced, __FUNCTION__); #endif if (comm == MPI_COMM_NULL) { retval = MPI_ERR_COMM; - } else if (sendtype == MPI_DATATYPE_NULL - || recvtype == MPI_DATATYPE_NULL) { + } else if ((( sendbuf != MPI_IN_PLACE) && (sendtype == MPI_DATATYPE_NULL)) || + ((smpi_comm_rank(comm) == root) && (recvtype == MPI_DATATYPE_NULL))){ retval = MPI_ERR_TYPE; + } else if ((( sendbuf != MPI_IN_PLACE) && (sendcount <0)) || + ((smpi_comm_rank(comm) == root) && (recvcount <0))){ + retval = MPI_ERR_COUNT; } else { - smpi_mpi_gather(sendbuf, sendcount, sendtype, recvbuf, recvcount, + + char* sendtmpbuf = (char*) sendbuf; + int sendtmpcount = sendcount; + MPI_Datatype sendtmptype = sendtype; + if( (smpi_comm_rank(comm) == root) && (sendbuf == MPI_IN_PLACE )) { + sendtmpcount=0; + sendtmptype=recvtype; + } + + mpi_coll_gather_fun(sendtmpbuf, sendtmpcount, sendtmptype, recvbuf, recvcount, recvtype, root, comm); + + retval = MPI_SUCCESS; } #ifdef HAVE_TRACING @@ -1411,20 +1697,31 @@ int PMPI_Gatherv(void *sendbuf, int sendcount, MPI_Datatype sendtype, smpi_bench_end(); #ifdef HAVE_TRACING - int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1; + int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1; TRACE_smpi_computing_out(rank); - int root_traced = smpi_group_rank(smpi_comm_group(comm), root); + int root_traced = smpi_group_index(smpi_comm_group(comm), root); TRACE_smpi_collective_in(rank, root_traced, __FUNCTION__); #endif if (comm == MPI_COMM_NULL) { retval = MPI_ERR_COMM; - } else if (sendtype == MPI_DATATYPE_NULL - || recvtype == MPI_DATATYPE_NULL) { + } else if ((( sendbuf != MPI_IN_PLACE) && (sendtype == MPI_DATATYPE_NULL)) || + ((smpi_comm_rank(comm) == root) && (recvtype == MPI_DATATYPE_NULL))){ retval = MPI_ERR_TYPE; + } else if (( sendbuf != MPI_IN_PLACE) && (sendcount <0)){ + retval = MPI_ERR_COUNT; } else if (recvcounts == NULL || displs == NULL) { retval = MPI_ERR_ARG; } else { - smpi_mpi_gatherv(sendbuf, sendcount, sendtype, recvbuf, recvcounts, + + char* sendtmpbuf = (char*) sendbuf; + int sendtmpcount = sendcount; + MPI_Datatype sendtmptype = sendtype; + if( (smpi_comm_rank(comm) == root) && (sendbuf == MPI_IN_PLACE )) { + sendtmpcount=0; + sendtmptype=recvtype; + } + + smpi_mpi_gatherv(sendtmpbuf, sendtmpcount, sendtmptype, recvbuf, recvcounts, displs, recvtype, root, comm); retval = MPI_SUCCESS; } @@ -1444,18 +1741,28 @@ int PMPI_Allgather(void *sendbuf, int sendcount, MPI_Datatype sendtype, smpi_bench_end(); #ifdef HAVE_TRACING - int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1; + 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 (sendtype == MPI_DATATYPE_NULL - || recvtype == MPI_DATATYPE_NULL) { + } else if ((( sendbuf != MPI_IN_PLACE) && (sendtype == MPI_DATATYPE_NULL)) || + (recvtype == MPI_DATATYPE_NULL)){ retval = MPI_ERR_TYPE; + } else if ((( sendbuf != MPI_IN_PLACE) && (sendcount <0)) || + (recvcount <0)){ + retval = MPI_ERR_COUNT; } else { - smpi_mpi_allgather(sendbuf, sendcount, sendtype, recvbuf, recvcount, - recvtype, comm); + + if(sendbuf == MPI_IN_PLACE) { + sendbuf=((char*)recvbuf)+smpi_datatype_get_extent(recvtype)*recvcount*smpi_comm_rank(comm); + sendcount=recvcount; + sendtype=recvtype; + } + + mpi_coll_allgather_fun(sendbuf, sendcount, sendtype, recvbuf, recvcount, + recvtype, comm); retval = MPI_SUCCESS; } #ifdef HAVE_TRACING @@ -1473,19 +1780,28 @@ int PMPI_Allgatherv(void *sendbuf, int sendcount, MPI_Datatype sendtype, smpi_bench_end(); #ifdef HAVE_TRACING - int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1; + 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 (sendtype == MPI_DATATYPE_NULL - || recvtype == MPI_DATATYPE_NULL) { + } else if ((( sendbuf != MPI_IN_PLACE) && (sendtype == MPI_DATATYPE_NULL)) || + (recvtype == MPI_DATATYPE_NULL)){ retval = MPI_ERR_TYPE; + } else if (( sendbuf != MPI_IN_PLACE) && (sendcount <0)){ + retval = MPI_ERR_COUNT; } else if (recvcounts == NULL || displs == NULL) { retval = MPI_ERR_ARG; } else { - smpi_mpi_allgatherv(sendbuf, sendcount, sendtype, recvbuf, recvcounts, + + if(sendbuf == MPI_IN_PLACE) { + sendbuf=((char*)recvbuf)+smpi_datatype_get_extent(recvtype)*displs[smpi_comm_rank(comm)]; + sendcount=recvcounts[smpi_comm_rank(comm)]; + sendtype=recvtype; + } + + mpi_coll_allgatherv_fun(sendbuf, sendcount, sendtype, recvbuf, recvcounts, displs, recvtype, comm); retval = MPI_SUCCESS; } @@ -1505,18 +1821,23 @@ int PMPI_Scatter(void *sendbuf, int sendcount, MPI_Datatype sendtype, smpi_bench_end(); #ifdef HAVE_TRACING - int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1; + int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1; TRACE_smpi_computing_out(rank); - int root_traced = smpi_group_rank(smpi_comm_group(comm), root); + int root_traced = smpi_group_index(smpi_comm_group(comm), root); + TRACE_smpi_collective_in(rank, root_traced, __FUNCTION__); #endif if (comm == MPI_COMM_NULL) { retval = MPI_ERR_COMM; - } else if (sendtype == MPI_DATATYPE_NULL - || recvtype == MPI_DATATYPE_NULL) { + } else if (((smpi_comm_rank(comm)==root) && (sendtype == MPI_DATATYPE_NULL)) + || ((recvbuf !=MPI_IN_PLACE) && (recvtype == MPI_DATATYPE_NULL))) { retval = MPI_ERR_TYPE; } else { - smpi_mpi_scatter(sendbuf, sendcount, sendtype, recvbuf, recvcount, + + if(recvbuf==MPI_IN_PLACE){ + recvcount=0; + } + mpi_coll_scatter_fun(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm); retval = MPI_SUCCESS; } @@ -1536,19 +1857,24 @@ int PMPI_Scatterv(void *sendbuf, int *sendcounts, int *displs, smpi_bench_end(); #ifdef HAVE_TRACING - int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1; + int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1; TRACE_smpi_computing_out(rank); - int root_traced = smpi_group_rank(smpi_comm_group(comm), root); + int root_traced = smpi_group_index(smpi_comm_group(comm), root); TRACE_smpi_collective_in(rank, root_traced, __FUNCTION__); #endif if (comm == MPI_COMM_NULL) { retval = MPI_ERR_COMM; - } else if (sendtype == MPI_DATATYPE_NULL - || recvtype == MPI_DATATYPE_NULL) { - retval = MPI_ERR_TYPE; } else if (sendcounts == NULL || displs == NULL) { retval = MPI_ERR_ARG; + } 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){ + recvcount=0; + } + smpi_mpi_scatterv(sendbuf, sendcounts, displs, sendtype, recvbuf, recvcount, recvtype, root, comm); retval = MPI_SUCCESS; @@ -1568,9 +1894,9 @@ int PMPI_Reduce(void *sendbuf, void *recvbuf, int count, smpi_bench_end(); #ifdef HAVE_TRACING - int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1; + int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1; TRACE_smpi_computing_out(rank); - int root_traced = smpi_group_rank(smpi_comm_group(comm), root); + int root_traced = smpi_group_index(smpi_comm_group(comm), root); TRACE_smpi_collective_in(rank, root_traced, __FUNCTION__); #endif if (comm == MPI_COMM_NULL) { @@ -1578,7 +1904,19 @@ 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); + + char* sendtmpbuf = (char*) sendbuf; + if( sendbuf == MPI_IN_PLACE ) { + sendtmpbuf = (char *)xbt_malloc(count*smpi_datatype_get_extent(datatype)); + smpi_datatype_copy(recvbuf, count, datatype,sendtmpbuf, count, datatype); + } + + mpi_coll_reduce_fun(sendtmpbuf, recvbuf, count, datatype, op, root, comm); + + if( sendbuf == MPI_IN_PLACE ) { + xbt_free(sendtmpbuf); + } + retval = MPI_SUCCESS; } #ifdef HAVE_TRACING @@ -1589,6 +1927,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) { @@ -1596,7 +1949,7 @@ int PMPI_Allreduce(void *sendbuf, void *recvbuf, int count, smpi_bench_end(); #ifdef HAVE_TRACING - int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1; + int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1; TRACE_smpi_computing_out(rank); TRACE_smpi_collective_in(rank, -1, __FUNCTION__); #endif @@ -1607,8 +1960,21 @@ 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); + + char* sendtmpbuf = (char*) sendbuf; + if( sendbuf == MPI_IN_PLACE ) { + sendtmpbuf = (char *)xbt_malloc(count*smpi_datatype_get_extent(datatype)); + smpi_datatype_copy(recvbuf, count, datatype,sendtmpbuf, count, datatype); + } + + mpi_coll_allreduce_fun(sendtmpbuf, recvbuf, count, datatype, op, comm); + + if( sendbuf == MPI_IN_PLACE ) { + xbt_free(sendtmpbuf); + } + retval = MPI_SUCCESS; + } #ifdef HAVE_TRACING TRACE_smpi_collective_out(rank, -1, __FUNCTION__); @@ -1625,7 +1991,7 @@ int PMPI_Scan(void *sendbuf, void *recvbuf, int count, smpi_bench_end(); #ifdef HAVE_TRACING - int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1; + int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1; TRACE_smpi_computing_out(rank); TRACE_smpi_collective_in(rank, -1, __FUNCTION__); #endif @@ -1650,12 +2016,10 @@ 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 rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1; - + 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 @@ -1668,19 +2032,48 @@ int PMPI_Reduce_scatter(void *sendbuf, void *recvbuf, int *recvcounts, } else if (recvcounts == NULL) { 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; + void* sendtmpbuf=sendbuf; + if(sendbuf==MPI_IN_PLACE){ + sendtmpbuf=recvbuf; } - 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); + + mpi_coll_reduce_scatter_fun(sendtmpbuf, 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 + 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 (recvcount < 0) { + retval = MPI_ERR_ARG; + } else { + int count=smpi_comm_size(comm); + int* recvcounts=(int*)xbt_malloc(count); + for (i=0; i 12) { - retval = - smpi_coll_tuned_alltoall_bruck(sendbuf, sendcount, sendtype, - recvbuf, recvcount, recvtype, - comm); - } else if (sendsize < 3000) { - retval = - smpi_coll_tuned_alltoall_basic_linear(sendbuf, sendcount, - sendtype, recvbuf, - recvcount, recvtype, comm); - } else { - retval = - smpi_coll_tuned_alltoall_pairwise(sendbuf, sendcount, sendtype, - recvbuf, recvcount, recvtype, - comm); - } + retval = mpi_coll_alltoall_fun(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm); } #ifdef HAVE_TRACING TRACE_smpi_collective_out(rank, -1, __FUNCTION__); @@ -1744,7 +2120,7 @@ int PMPI_Alltoallv(void *sendbuf, int *sendcounts, int *senddisps, smpi_bench_end(); #ifdef HAVE_TRACING - int rank = comm != MPI_COMM_NULL ? smpi_comm_rank(comm) : -1; + int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1; TRACE_smpi_computing_out(rank); TRACE_smpi_collective_in(rank, -1, __FUNCTION__); #endif @@ -1758,7 +2134,7 @@ int PMPI_Alltoallv(void *sendbuf, int *sendcounts, int *senddisps, retval = MPI_ERR_ARG; } else { retval = - smpi_coll_basic_alltoallv(sendbuf, sendcounts, senddisps, sendtype, + mpi_coll_alltoallv_fun(sendbuf, sendcounts, senddisps, sendtype, recvbuf, recvcounts, recvdisps, recvtype, comm); } @@ -1777,7 +2153,9 @@ int PMPI_Get_processor_name(char *name, int *resultlen) smpi_bench_end(); strncpy(name, SIMIX_host_get_name(SIMIX_host_self()), - MPI_MAX_PROCESSOR_NAME - 1); + strlen(SIMIX_host_get_name(SIMIX_host_self())) < MPI_MAX_PROCESSOR_NAME - 1 ? + strlen(SIMIX_host_get_name(SIMIX_host_self())) +1 : + MPI_MAX_PROCESSOR_NAME - 1 ); *resultlen = strlen(name) > MPI_MAX_PROCESSOR_NAME ? MPI_MAX_PROCESSOR_NAME : strlen(name); @@ -1816,10 +2194,10 @@ int PMPI_Type_contiguous(int count, MPI_Datatype old_type, MPI_Datatype* new_typ smpi_bench_end(); if (old_type == MPI_DATATYPE_NULL) { retval = MPI_ERR_TYPE; - } else if (count<=0){ + } else if (count<0){ retval = MPI_ERR_COUNT; } else { - retval = smpi_datatype_contiguous(count, old_type, new_type); + retval = smpi_datatype_contiguous(count, old_type, new_type, 0); } smpi_bench_begin(); return retval; @@ -1846,7 +2224,7 @@ int PMPI_Type_vector(int count, int blocklen, int stride, MPI_Datatype old_type, smpi_bench_end(); if (old_type == MPI_DATATYPE_NULL) { retval = MPI_ERR_TYPE; - } else if (count<=0 || blocklen<=0){ + } else if (count<0 || blocklen<0){ retval = MPI_ERR_COUNT; } else { retval = smpi_datatype_vector(count, blocklen, stride, old_type, new_type); @@ -1861,7 +2239,7 @@ int PMPI_Type_hvector(int count, int blocklen, MPI_Aint stride, MPI_Datatype old smpi_bench_end(); if (old_type == MPI_DATATYPE_NULL) { retval = MPI_ERR_TYPE; - } else if (count<=0 || blocklen<=0){ + } else if (count<0 || blocklen<0){ retval = MPI_ERR_COUNT; } else { retval = smpi_datatype_hvector(count, blocklen, stride, old_type, new_type); @@ -1870,6 +2248,9 @@ int PMPI_Type_hvector(int count, int blocklen, MPI_Aint stride, MPI_Datatype old return retval; } +int PMPI_Type_create_hvector(int count, int blocklen, MPI_Aint stride, MPI_Datatype old_type, MPI_Datatype* new_type) { + return MPI_Type_hvector(count, blocklen, stride, old_type, new_type); +} int PMPI_Type_indexed(int count, int* blocklens, int* indices, MPI_Datatype old_type, MPI_Datatype* new_type) { int retval; @@ -1877,25 +2258,62 @@ int PMPI_Type_indexed(int count, int* blocklens, int* indices, MPI_Datatype old_ smpi_bench_end(); if (old_type == MPI_DATATYPE_NULL) { retval = MPI_ERR_TYPE; - } else if (count<=0){ + } else if (count<0){ + retval = MPI_ERR_COUNT; + } else { + retval = smpi_datatype_indexed(count, blocklens, indices, old_type, new_type); + } + smpi_bench_begin(); + return retval; +} + +int PMPI_Type_create_indexed_block(int count, int blocklength, int* indices, MPI_Datatype old_type, MPI_Datatype* new_type) { + int retval,i; + + smpi_bench_end(); + if (old_type == MPI_DATATYPE_NULL) { + retval = MPI_ERR_TYPE; + } else if (count<0){ retval = MPI_ERR_COUNT; } else { + int* blocklens=(int*)xbt_malloc(blocklength*count); + for (i=0; i