X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/8ef8c31eb854d7dfc9b74deb757c42e682058145..6d4434a0ebdb34758d95faec8b47088a3f760df2:/src/smpi/smpi_pmpi.c diff --git a/src/smpi/smpi_pmpi.c b/src/smpi/smpi_pmpi.c index e3abcd24e4..f10a36f6a0 100644 --- a/src/smpi/smpi_pmpi.c +++ b/src/smpi/smpi_pmpi.c @@ -271,6 +271,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; @@ -522,8 +523,9 @@ int PMPI_Group_excl(MPI_Group group, int n, int *ranks, MPI_Group * newgroup) if (i >= n) { index = smpi_group_index(group, rank); smpi_group_set_mapping(*newgroup, index, rank); - rank++; + } + rank++; } } smpi_group_use(*newgroup); @@ -621,6 +623,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 .. } } } @@ -914,7 +917,7 @@ int PMPI_Irecv(void *buf, int count, MPI_Datatype datatype, int src, } else if (src == MPI_PROC_NULL) { *request = MPI_REQUEST_NULL; retval = MPI_SUCCESS; - } else if (src >= smpi_group_size(smpi_comm_group(comm)) || src <0){ + } 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; @@ -1008,7 +1011,7 @@ int PMPI_Recv(void *buf, int count, MPI_Datatype datatype, int src, int tag, smpi_empty_status(status); status->MPI_SOURCE = MPI_PROC_NULL; retval = MPI_SUCCESS; - }else if(src >= smpi_group_size(smpi_comm_group(comm)) || src <0){ + } 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; @@ -1105,7 +1108,8 @@ int PMPI_Sendrecv(void *sendbuf, int sendcount, MPI_Datatype sendtype, 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 >= smpi_group_size(smpi_comm_group(comm)) || src <0){ + }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; } else if (sendcount < 0 || recvcount<0) { retval = MPI_ERR_COUNT; @@ -1148,16 +1152,16 @@ int PMPI_Sendrecv_replace(void *buf, int count, MPI_Datatype datatype, MPI_Comm comm, MPI_Status * status) { //TODO: suboptimal implementation - void *recvbuf; - int retval, size; + // void *recvbuf; + int retval; - size = smpi_datatype_size(datatype) * count; - recvbuf = xbt_new(char, size); +// size = smpi_datatype_size(datatype) * count; +// recvbuf = xbt_new(char, size); retval = - MPI_Sendrecv(buf, count, datatype, dst, sendtag, recvbuf, count, + MPI_Sendrecv(buf, count, datatype, dst, sendtag, buf, count, datatype, src, recvtag, comm, status); - memcpy(buf, recvbuf, size * sizeof(char)); - xbt_free(recvbuf); +/*memcpy(buf, recvbuf, size * sizeof(char)); + xbt_free(recvbuf);*/ return retval; } @@ -1402,7 +1406,7 @@ int PMPI_Waitall(int count, MPI_Request requests[], MPI_Status status[]) 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; @@ -1421,7 +1425,7 @@ int PMPI_Waitall(int count, MPI_Request requests[], MPI_Status status[]) 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, @@ -1912,7 +1916,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); @@ -1951,7 +1957,7 @@ 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); @@ -1981,7 +1987,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); @@ -1996,7 +2002,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); @@ -2012,7 +2018,7 @@ 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); @@ -2027,7 +2033,7 @@ int PMPI_Type_hindexed(int count, int* blocklens, MPI_Aint* indices, MPI_Datatyp 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_hindexed(count, blocklens, indices, old_type, new_type); @@ -2041,7 +2047,7 @@ int PMPI_Type_struct(int count, int* blocklens, MPI_Aint* indices, MPI_Datatype* int retval; smpi_bench_end(); - if (count<=0){ + if (count<0){ retval = MPI_ERR_COUNT; } else { retval = smpi_datatype_struct(count, blocklens, indices, old_types, new_type); @@ -2049,6 +2055,11 @@ int PMPI_Type_struct(int count, int* blocklens, MPI_Aint* indices, MPI_Datatype* smpi_bench_begin(); return retval;} +int PMPI_Error_class(int errorcode, int* errorclass) { + // assume smpi uses only standard mpi error codes + *errorclass=errorcode; + return MPI_SUCCESS; +} /* The following calls are not yet implemented and will fail at runtime. */ /* Once implemented, please move them above this notice. */ @@ -2122,10 +2133,6 @@ int PMPI_Topo_test(MPI_Comm comm, int* top_type) { return not_yet_implemented(); } -int PMPI_Error_class(int errorcode, int* errorclass) { - return not_yet_implemented(); -} - int PMPI_Errhandler_create(MPI_Handler_function* function, MPI_Errhandler* errhandler) { return not_yet_implemented(); }