From 051bd71525a329eea5c81d0588ccc76fdcd459f0 Mon Sep 17 00:00:00 2001 From: pini Date: Sat, 13 Mar 2010 16:24:00 +0000 Subject: [PATCH 1/1] Keep SMPI data in the SMPI layer git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@7245 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- src/smpi/private.h | 1 + src/smpi/smpi_base.c | 16 +++++++++------- src/smpi/smpi_global.c | 2 ++ 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/smpi/private.h b/src/smpi/private.h index 07e645a089..5357d445e4 100644 --- a/src/smpi/private.h +++ b/src/smpi/private.h @@ -18,6 +18,7 @@ typedef struct s_smpi_mpi_request { smx_rdv_t rdv; smx_comm_t pair; int complete; + MPI_Request data; } s_smpi_mpi_request_t; void smpi_process_init(int* argc, char*** argv); diff --git a/src/smpi/smpi_base.c b/src/smpi/smpi_base.c index 01439350a0..b442f0dbfd 100644 --- a/src/smpi/smpi_base.c +++ b/src/smpi/smpi_base.c @@ -48,8 +48,9 @@ MPI_Request smpi_mpi_isend(void* buf, int count, MPI_Datatype datatype, int dst, request->tag = tag; request->size = smpi_datatype_size(datatype) * count; request->complete = 0; + request->data = request; smpi_process_post_send(comm, request); - request->pair = SIMIX_network_isend(request->rdv, request->size, -1.0, buf, request->size, request); + request->pair = SIMIX_network_isend(request->rdv, request->size, -1.0, buf, request->size, NULL); return request; } @@ -63,6 +64,7 @@ MPI_Request smpi_mpi_irecv(void* buf, int count, MPI_Datatype datatype, int src, request->tag = tag; request->size = smpi_datatype_size(datatype) * count; request->complete = 0; + request->data = MPI_REQUEST_NULL; smpi_process_post_recv(request); request->pair = SIMIX_network_irecv(request->rdv, buf, &request->size); return request; @@ -96,7 +98,7 @@ void smpi_mpi_sendrecv(void* sendbuf, int sendcount, MPI_Datatype sendtype, int } static void finish_wait(MPI_Request* request, MPI_Status* status) { - MPI_Request data = (MPI_Request)SIMIX_communication_get_data((*request)->pair); + MPI_Request data = (*request)->data; xbt_assert0(data != MPI_REQUEST_NULL, "Erroneous situation"); if(status != MPI_STATUS_IGNORE) { @@ -126,7 +128,7 @@ static void finish_wait(MPI_Request* request, MPI_Status* status) { } int smpi_mpi_test(MPI_Request* request, MPI_Status* status) { - MPI_Request data = (MPI_Request)SIMIX_communication_get_data((*request)->pair); + MPI_Request data = (*request)->data; int flag = data && data->complete == 1; if(flag) { @@ -144,7 +146,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) { - data = (MPI_Request)SIMIX_communication_get_data(requests[i]->pair); + data = requests[i]->data; if(data != MPI_REQUEST_NULL && data->complete == 1) { SIMIX_communication_destroy(requests[i]->pair); finish_wait(&requests[i], status); @@ -158,7 +160,7 @@ int smpi_mpi_testany(int count, MPI_Request requests[], int* index, MPI_Status* } void smpi_mpi_wait(MPI_Request* request, MPI_Status* status) { - MPI_Request data = (MPI_Request)SIMIX_communication_get_data((*request)->pair); + MPI_Request data = (*request)->data; DEBUG6("wait for request %p (%p: %p) [src = %d, dst = %d, tag = %d]", *request, (*request)->pair, data, (*request)->src, (*request)->dst, (*request)->tag); @@ -182,7 +184,7 @@ int smpi_mpi_waitany(int count, MPI_Request requests[], MPI_Status* status) { // First check for already completed requests for(i = 0; i < count; i++) { if(requests[i] != MPI_REQUEST_NULL) { - data = (MPI_Request)SIMIX_communication_get_data(requests[i]->pair); + data = requests[i]->data; if(data != MPI_REQUEST_NULL && data->complete == 1) { index = i; SIMIX_communication_destroy(requests[index]->pair); // always succeeds (but cleans the simix layer) @@ -245,7 +247,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) { - data = (MPI_Request)SIMIX_communication_get_data(requests[i]->pair); + data = requests[i]->data; if(data != MPI_REQUEST_NULL && data->complete == 1) { SIMIX_communication_destroy(requests[i]->pair); finish_wait(&requests[i], status != MPI_STATUS_IGNORE ? &status[i] : MPI_STATUS_IGNORE); diff --git a/src/smpi/smpi_global.c b/src/smpi/smpi_global.c index cf49cf98e6..2193fdc3bb 100644 --- a/src/smpi/smpi_global.c +++ b/src/smpi/smpi_global.c @@ -75,6 +75,7 @@ void smpi_process_post_send(MPI_Comm comm, MPI_Request request) { /* Materialize the *_ANY_* fields from corresponding irecv request */ req->src = request->src; req->tag = request->tag; + req->data = request->data; request->rdv = req->rdv; return; } else { @@ -103,6 +104,7 @@ void smpi_process_post_recv(MPI_Request request) { /* Materialize the *_ANY_* fields from the irecv request */ request->src = req->src; request->tag = req->tag; + request->data = req->data; request->rdv = req->rdv; return; } else { -- 2.20.1