From: Augustin Degomme Date: Tue, 23 Oct 2012 16:04:48 +0000 (+0200) Subject: have waitall output an error if an issue is encountered in any comm, and avoid loopin... X-Git-Tag: v3_9_rc1~91^2~213 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/f78100b1ef0d7c877598541cc6a0d653387f9975 have waitall output an error if an issue is encountered in any comm, and avoid looping in some smpi functions (experimental, to test) --- diff --git a/src/smpi/private.h b/src/smpi/private.h index 74b35689e7..770d816858 100644 --- a/src/smpi/private.h +++ b/src/smpi/private.h @@ -177,7 +177,7 @@ int smpi_mpi_get_count(MPI_Status * status, MPI_Datatype datatype); void smpi_mpi_wait(MPI_Request * request, MPI_Status * status); int smpi_mpi_waitany(int count, MPI_Request requests[], MPI_Status * status); -void smpi_mpi_waitall(int count, MPI_Request requests[], +int smpi_mpi_waitall(int count, MPI_Request requests[], MPI_Status status[]); int smpi_mpi_waitsome(int incount, MPI_Request requests[], int *indices, MPI_Status status[]); diff --git a/src/smpi/smpi_base.c b/src/smpi/smpi_base.c index b3c0351d90..29b8eb7645 100644 --- a/src/smpi/smpi_base.c +++ b/src/smpi/smpi_base.c @@ -306,6 +306,7 @@ static void finish_wait(MPI_Request * request, MPI_Status * status) { MPI_Request req = *request; // if we have a sender, we should use its data, and not the data from the receive + //FIXME : mail fail if req->action has already been freed, the pointer being invalid if((req->action)&& (req->src==MPI_ANY_SOURCE || req->tag== MPI_ANY_TAG)) req = (MPI_Request)SIMIX_comm_get_src_data((*request)->action); @@ -313,7 +314,10 @@ static void finish_wait(MPI_Request * request, MPI_Status * status) if(status != MPI_STATUS_IGNORE) { status->MPI_SOURCE = req->src; status->MPI_TAG = req->tag; + //if((*request)->action && ((MPI_Request)SIMIX_comm_get_src_data((*request)->action))->size == (*request)->size) status->MPI_ERROR = MPI_SUCCESS; + //else status->MPI_ERROR = MPI_ERR_TRUNCATE; + // this handles the case were size in receive differs from size in send // FIXME: really this should just contain the count of receive-type blocks, // right? status->count = req->size; @@ -457,8 +461,10 @@ void smpi_mpi_iprobe(int source, int tag, MPI_Comm comm, int* flag, MPI_Status* if(status != MPI_STATUS_IGNORE) { status->MPI_SOURCE = req->src; status->MPI_TAG = req->tag; - status->MPI_ERROR = MPI_SUCCESS; - status->count = req->size; + if(req->size == request->size) + status->MPI_ERROR = MPI_SUCCESS; + else status->MPI_ERROR = MPI_ERR_TRUNCATE; + status->count = request->size; } } else *flag = 0; @@ -518,12 +524,13 @@ int smpi_mpi_waitany(int count, MPI_Request requests[], return index; } -void smpi_mpi_waitall(int count, MPI_Request requests[], +int smpi_mpi_waitall(int count, MPI_Request requests[], MPI_Status status[]) { int index, c; MPI_Status stat; MPI_Status *pstat = status == MPI_STATUSES_IGNORE ? MPI_STATUS_IGNORE : &stat; + int retvalue=MPI_SUCCESS; //tag invalid requests in the set for(c = 0; c < count; c++) { if(requests[c]==MPI_REQUEST_NULL || requests[c]->dst == MPI_PROC_NULL ){ @@ -548,10 +555,12 @@ void smpi_mpi_waitall(int count, MPI_Request requests[], } if(status != MPI_STATUSES_IGNORE) { memcpy(&status[index], pstat, sizeof(*pstat)); + if(status[index].MPI_ERROR==MPI_ERR_TRUNCATE)retvalue=MPI_ERR_IN_STATUS; } } } + return retvalue; } int smpi_mpi_waitsome(int incount, MPI_Request requests[], int *indices, diff --git a/src/smpi/smpi_pmpi.c b/src/smpi/smpi_pmpi.c index 0db0452ed9..a83b0bd9ba 100644 --- a/src/smpi/smpi_pmpi.c +++ b/src/smpi/smpi_pmpi.c @@ -523,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); @@ -622,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 .. } } } @@ -1150,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; } @@ -1404,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; @@ -1423,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, @@ -1914,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);