From: Augustin Degomme Date: Tue, 2 Oct 2012 11:06:54 +0000 (+0200) Subject: provide Test and Wait functions with a better MPI_STATUS_IGNORE and MPI_REQUEST_NULL... X-Git-Tag: v3_8~146^2~5^2~1 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/50b1967c67a75b08e146f976c08223d9245dc5f5 provide Test and Wait functions with a better MPI_STATUS_IGNORE and MPI_REQUEST_NULL handling, as well as returning correct empty statuses when needed Also add MPI_Testsome support --- diff --git a/include/smpi/smpi.h b/include/smpi/smpi.h index b22270346f..1e768df20c 100644 --- a/include/smpi/smpi.h +++ b/include/smpi/smpi.h @@ -309,7 +309,10 @@ MPI_CALL(XBT_PUBLIC(int), MPI_Waitsome, (int incount, MPI_Request requests[], int *outcount, int *indices, MPI_Status status[])); - +MPI_CALL(XBT_PUBLIC(int), MPI_Testsome, + (int incount, MPI_Request requests[], + int *outcount, int *indices, + MPI_Status status[])); MPI_CALL(XBT_PUBLIC(int), MPI_Bcast, (void *buf, int count, MPI_Datatype datatype, int root, MPI_Comm comm)); @@ -411,7 +414,6 @@ MPI_CALL(XBT_PUBLIC(int), MPI_Errhandler_set, (MPI_Comm comm, MPI_Errhandler err MPI_CALL(XBT_PUBLIC(int), MPI_Cancel, (MPI_Request* request)); MPI_CALL(XBT_PUBLIC(int), MPI_Buffer_attach, (void* buffer, int size)); MPI_CALL(XBT_PUBLIC(int), MPI_Buffer_detach, (void* buffer, int* size)); -MPI_CALL(XBT_PUBLIC(int), MPI_Testsome, (int incount, MPI_Request* requests, int* outcount, int* indices, MPI_Status* statuses)); MPI_CALL(XBT_PUBLIC(int), MPI_Comm_test_inter, (MPI_Comm comm, int* flag)); MPI_CALL(XBT_PUBLIC(int), MPI_Comm_get_attr, (MPI_Comm comm, int comm_keyval, void *attribute_val, int *flag)); MPI_CALL(XBT_PUBLIC(int), MPI_Unpack, (void* inbuf, int insize, int* position, void* outbuf, int outcount, MPI_Datatype type, MPI_Comm comm)); diff --git a/src/smpi/private.h b/src/smpi/private.h index 6a82c65532..f8cb662ebe 100644 --- a/src/smpi/private.h +++ b/src/smpi/private.h @@ -149,6 +149,8 @@ void 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[]); +int smpi_mpi_testsome(int incount, MPI_Request requests[], int *indices, + MPI_Status status[]); void smpi_mpi_bcast(void *buf, int count, MPI_Datatype datatype, int root, MPI_Comm comm); void smpi_mpi_barrier(MPI_Comm comm); diff --git a/src/smpi/smpi_base.c b/src/smpi/smpi_base.c index b967f687bd..30aee553e6 100644 --- a/src/smpi/smpi_base.c +++ b/src/smpi/smpi_base.c @@ -58,6 +58,15 @@ static MPI_Request build_request(void *buf, int count, return request; } + +static void smpi_empty_status(MPI_Status * status) { + if(status != MPI_STATUS_IGNORE) { + status->MPI_SOURCE=MPI_ANY_SOURCE; + status->MPI_TAG=MPI_ANY_TAG; + status->count=0; + } +} + void smpi_action_trace_run(char *path) { char *name; @@ -132,8 +141,7 @@ void smpi_mpi_start(MPI_Request request) request->action = simcall_comm_irecv(mailbox, request->buf, &request->size, &match_recv, request); } else { print_request("New send", request); - - if (request->size < xbt_cfg_get_int(_surf_cfg_set, "smpi/async_small_thres")) { // eager mode => detached send (FIXME: this limit should be configurable) + if (request->size < xbt_cfg_get_int(_surf_cfg_set, "smpi/async_small_thres")) { // eager mode mailbox = smpi_process_remote_mailbox_small( smpi_group_index(smpi_comm_group(request->comm), request->dst)); }else{ @@ -296,12 +304,15 @@ static void finish_wait(MPI_Request * request, MPI_Status * status) int smpi_mpi_test(MPI_Request * request, MPI_Status * status) { int flag; + //assume that request is not MPI_REQUEST_NULL (filtered in PMPI_Test or smpi_mpi_testall before) if ((*request)->action == NULL) flag = 1; else flag = simcall_comm_test((*request)->action); if(flag) { finish_wait(request, status); + }else{ + smpi_empty_status(status); } return flag; } @@ -320,7 +331,7 @@ int smpi_mpi_testany(int count, MPI_Request requests[], int *index, map = xbt_new(int, count); size = 0; for(i = 0; i < count; i++) { - if(requests[i]->action) { + if((requests[i]!=MPI_REQUEST_NULL) && requests[i]->action) { xbt_dynar_push(comms, &requests[i]->action); map[size] = i; size++; @@ -328,16 +339,21 @@ int smpi_mpi_testany(int count, MPI_Request requests[], int *index, } if(size > 0) { i = simcall_comm_testany(comms); - // FIXME: MPI_UNDEFINED or does SIMIX have a return code? - if(i != MPI_UNDEFINED) { + // not MPI_UNDEFINED, as this is a simix return code + if(i != -1) { *index = map[i]; - smpi_mpi_wait(&requests[*index], status); + finish_wait(&requests[*index], status); flag = 1; } + }else{ + //all requests are null or inactive, return true + flag=1; + smpi_empty_status(status); } xbt_free(map); xbt_dynar_free(&comms); } + return flag; } @@ -345,13 +361,22 @@ int smpi_mpi_testany(int count, MPI_Request requests[], int *index, int smpi_mpi_testall(int count, MPI_Request requests[], MPI_Status status[]) { + MPI_Status stat; + MPI_Status *pstat = status == MPI_STATUSES_IGNORE ? MPI_STATUS_IGNORE : &stat; int flag=1; int i; - for(i=0; i 0) { i = simcall_comm_waitany(comms); - // FIXME: MPI_UNDEFINED or does SIMIX have a return code? - if (i != MPI_UNDEFINED) { + // not MPI_UNDEFINED, as this is a simix return code + if (i != -1) { index = map[i]; finish_wait(&requests[index], status); - } } xbt_free(map); xbt_dynar_free(&comms); } + + if (index==MPI_UNDEFINED) + smpi_empty_status(status); + return index; } @@ -456,7 +485,7 @@ void smpi_mpi_waitall(int count, MPI_Request requests[], { int index, c; MPI_Status stat; - MPI_Status *pstat = status == MPI_STATUS_IGNORE ? MPI_STATUS_IGNORE : &stat; + MPI_Status *pstat = status == MPI_STATUSES_IGNORE ? MPI_STATUS_IGNORE : &stat; for(c = 0; c < count; c++) { if(MC_IS_ENABLED) { @@ -468,7 +497,7 @@ void smpi_mpi_waitall(int count, MPI_Request requests[], break; } } - if(status != MPI_STATUS_IGNORE) { + if(status != MPI_STATUSES_IGNORE) { memcpy(&status[index], pstat, sizeof(*pstat)); } } @@ -478,17 +507,51 @@ int smpi_mpi_waitsome(int incount, MPI_Request requests[], int *indices, MPI_Status status[]) { int i, count, index; + MPI_Status stat; + MPI_Status *pstat = status == MPI_STATUSES_IGNORE ? MPI_STATUS_IGNORE : &stat; count = 0; for(i = 0; i < incount; i++) { - if(smpi_mpi_testany(incount, requests, &index, status)) { - indices[count] = index; - count++; - } + if(smpi_mpi_testany(incount, requests, &index, pstat)) { + if(index!=MPI_UNDEFINED){ + indices[count] = index; + count++; + if(status != MPI_STATUSES_IGNORE) { + memcpy(&status[index], pstat, sizeof(*pstat)); + } + }else{ + return MPI_UNDEFINED; + } + } } return count; } +int smpi_mpi_testsome(int incount, MPI_Request requests[], int *indices, + MPI_Status status[]) +{ + int i, count, count_dead; + MPI_Status stat; + MPI_Status *pstat = status == MPI_STATUSES_IGNORE ? MPI_STATUS_IGNORE : &stat; + + count = 0; + for(i = 0; i < incount; i++) { + if((requests[i] != MPI_REQUEST_NULL)) { + if(smpi_mpi_test(&requests[i], pstat)) { + indices[count] = i; + count++; + if(status != MPI_STATUSES_IGNORE) { + memcpy(&status[i], pstat, sizeof(*pstat)); + } + } + }else{ + count_dead++; + } + } + if(count_dead==incount)return MPI_UNDEFINED; + else return count; +} + void smpi_mpi_bcast(void *buf, int count, MPI_Datatype datatype, int root, MPI_Comm comm) { diff --git a/src/smpi/smpi_pmpi.c b/src/smpi/smpi_pmpi.c index 2650e19272..64f0161b41 100644 --- a/src/smpi/smpi_pmpi.c +++ b/src/smpi/smpi_pmpi.c @@ -1077,6 +1077,7 @@ int PMPI_Test(MPI_Request * request, int *flag, MPI_Status * status) 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); @@ -1323,6 +1324,23 @@ 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; @@ -2025,10 +2043,6 @@ int PMPI_Buffer_detach(void* buffer, int* size) { return not_yet_implemented(); } -int PMPI_Testsome(int incount, MPI_Request* requests, int* outcount, int* indices, MPI_Status* statuses) { - return not_yet_implemented(); -} - int PMPI_Comm_test_inter(MPI_Comm comm, int* flag) { return not_yet_implemented(); }