X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/6760cb07d6b57be16928d95339d71e57c4e24f36..ad12e936954df10a0395da3b161e820e07e97f52:/src/smpi/smpi_base.c diff --git a/src/smpi/smpi_base.c b/src/smpi/smpi_base.c index da3f3898b9..ed9620b716 100644 --- a/src/smpi/smpi_base.c +++ b/src/smpi/smpi_base.c @@ -19,9 +19,6 @@ XBT_LOG_EXTERNAL_CATEGORY(smpi_receiver); XBT_LOG_EXTERNAL_CATEGORY(smpi_sender); XBT_LOG_EXTERNAL_CATEGORY(smpi_util); -#define EAGER_LIMIT 65536 -#define RDV_TAG (-10) - void smpi_process_init(int* argc, char*** argv) { int index; smpi_process_data_t data; @@ -61,23 +58,10 @@ static MPI_Request build_request(void* buf, int count, MPI_Datatype datatype, in request->complete = 0; request->match = MPI_REQUEST_NULL; request->flags = flags; - if(request->size <= EAGER_LIMIT) { - request->ack = MPI_REQUEST_NULL; - } else { - request->ack = xbt_new(s_smpi_mpi_request_t, 1); - request->ack->buf = NULL; - request->ack->size = 0; - request->ack->src = dst; - request->ack->dst = src; - request->ack->tag = RDV_TAG; - request->ack->comm = comm; - request->ack->rdv = NULL; - request->ack->pair = NULL; - request->ack->complete = 0; - request->ack->match = MPI_REQUEST_NULL; - request->ack->flags = NON_PERSISTENT | ((request->flags & RECV) == RECV ? SEND : RECV); - smpi_mpi_start(request->ack); - } +#ifdef HAVE_TRACING + request->send = 0; + request->recv = 0; +#endif return request; } @@ -96,10 +80,6 @@ MPI_Request smpi_mpi_recv_init(void* buf, int count, MPI_Datatype datatype, int void smpi_mpi_start(MPI_Request request) { xbt_assert0(request->complete == 0, "Cannot start a non-finished communication"); - if(request->size > EAGER_LIMIT) { - print_request("RDV ack", request->ack); - smpi_mpi_wait(&request->ack, MPI_STATUS_IGNORE); - } if((request->flags & RECV) == RECV) { smpi_process_post_recv(request); print_request("New recv", request); @@ -193,6 +173,9 @@ static void finish_wait(MPI_Request* request, MPI_Status* status) { } if(((*request)->flags & NON_PERSISTENT) == NON_PERSISTENT) { smpi_mpi_request_free(request); + } else { + (*request)->rdv = NULL; + (*request)->pair = NULL; } } @@ -200,8 +183,7 @@ int smpi_mpi_test(MPI_Request* request, MPI_Status* status) { int flag = (*request)->complete; if(flag) { - SIMIX_communication_destroy((*request)->pair); - finish_wait(request, status); + smpi_mpi_wait(request, status); } return flag; } @@ -213,8 +195,7 @@ int smpi_mpi_testany(int count, MPI_Request requests[], int* index, MPI_Status* flag = 0; for(i = 0; i < count; i++) { if(requests[i] != MPI_REQUEST_NULL && requests[i]->complete) { - SIMIX_communication_destroy(requests[i]->pair); - finish_wait(&requests[i], status); + smpi_mpi_wait(&requests[i], status); *index = i; flag = 1; break; @@ -225,12 +206,7 @@ int smpi_mpi_testany(int count, MPI_Request requests[], int* index, MPI_Status* void smpi_mpi_wait(MPI_Request* request, MPI_Status* status) { print_request("wait", *request); - // data is null if receiver waits before sender enters the rdv - if((*request)->complete) { - SIMIX_communication_destroy((*request)->pair); - } else { - SIMIX_network_wait((*request)->pair, -1.0); - } + SIMIX_network_wait((*request)->pair, -1.0); finish_wait(request, status); } @@ -245,7 +221,7 @@ int smpi_mpi_waitany(int count, MPI_Request requests[], MPI_Status* status) { for(i = 0; i < count; i++) { if(requests[i] != MPI_REQUEST_NULL && requests[i]->complete) { index = i; - SIMIX_communication_destroy(requests[index]->pair); // always succeeds (but cleans the simix layer) + smpi_mpi_wait(&requests[index], status); break; } } @@ -266,13 +242,11 @@ int smpi_mpi_waitany(int count, MPI_Request requests[], MPI_Status* status) { if(size > 0) { index = SIMIX_network_waitany(comms); index = map[index]; + finish_wait(&requests[index], status); } xbt_free(map); xbt_dynar_free(&comms); } - if(index != MPI_UNDEFINED) { - finish_wait(&requests[index], status); - } } return index; } @@ -303,8 +277,7 @@ int smpi_mpi_waitsome(int incount, MPI_Request requests[], int* indices, MPI_Sta count = 0; for(i = 0; i < incount; i++) { if(requests[i] != MPI_REQUEST_NULL && requests[i]->complete) { - SIMIX_communication_destroy(requests[i]->pair); - finish_wait(&requests[i], status != MPI_STATUS_IGNORE ? &status[i] : MPI_STATUS_IGNORE); + smpi_mpi_wait(&requests[i], status != MPI_STATUS_IGNORE ? &status[i] : MPI_STATUS_IGNORE); indices[count] = i; count++; }