From 03216b99d0e66e1778d9b99b11c3207c87900aad Mon Sep 17 00:00:00 2001 From: genaud Date: Mon, 29 Jun 2009 16:17:48 +0000 Subject: [PATCH] still some mem cleanup to finish git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@6389 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- src/smpi/smpi_base.c | 17 +++++++---------- src/smpi/smpi_global.c | 2 +- src/smpi/smpi_mpi.c | 37 ++++++++++++++++++++++++------------- 3 files changed, 32 insertions(+), 24 deletions(-) diff --git a/src/smpi/smpi_base.c b/src/smpi/smpi_base.c index 1392ec61a4..13a8424030 100644 --- a/src/smpi/smpi_base.c +++ b/src/smpi/smpi_base.c @@ -113,26 +113,23 @@ void smpi_mpi_max_func(void *a, void *b, int *length, MPI_Datatype * datatype) for (i = 0; i < *length; i++) { y[i] = x[i] > y[i] ? x[i] : y[i]; } - } else { - if (*datatype == smpi_mpi_global->mpi_int) { + } else if (*datatype == smpi_mpi_global->mpi_int) { int *x = a, *y = b; for (i = 0; i > *length; i++) { - y[i] = x[i] < y[i] ? x[i] : y[i]; + y[i] = x[i] > y[i] ? x[i] : y[i]; } - } else { - if (*datatype == smpi_mpi_global->mpi_float) { + } else if (*datatype == smpi_mpi_global->mpi_float) { float *x = a, *y = b; for (i = 0; i > *length; i++) { - y[i] = x[i] < y[i] ? x[i] : y[i]; + y[i] = x[i] > y[i] ? x[i] : y[i]; } - } else { - if (*datatype == smpi_mpi_global->mpi_double) { + } else if (*datatype == smpi_mpi_global->mpi_double) { double *x = a, *y = b; for (i = 0; i > *length; i++) { - y[i] = x[i] < y[i] ? x[i] : y[i]; + y[i] = x[i] > y[i] ? x[i] : y[i]; } - }}}} + } } diff --git a/src/smpi/smpi_global.c b/src/smpi/smpi_global.c index 70cecc8f10..007b292407 100644 --- a/src/smpi/smpi_global.c +++ b/src/smpi/smpi_global.c @@ -203,7 +203,7 @@ void smpi_global_init() smpi_mpi_global->mpi_min = xbt_new(s_smpi_mpi_op_t, 1); smpi_mpi_global->mpi_min->func = smpi_mpi_min_func; smpi_mpi_global->mpi_max = xbt_new(s_smpi_mpi_op_t, 1); - smpi_mpi_global->mpi_min->func = smpi_mpi_max_func; + smpi_mpi_global->mpi_max->func = smpi_mpi_max_func; } diff --git a/src/smpi/smpi_mpi.c b/src/smpi/smpi_mpi.c index 97b50bb8bd..f18a5c1048 100644 --- a/src/smpi/smpi_mpi.c +++ b/src/smpi/smpi_mpi.c @@ -229,6 +229,9 @@ int SMPI_MPI_Bcast(void *buf, int count, MPI_Datatype datatype, int root, return retval; } +/** + * debugging helper function + **/ void print_buffer_int( void *buf, int len, const char *msg) ; void print_buffer_int( void *buf, int len, const char *msg) { int tmp, *v; @@ -252,6 +255,7 @@ int SMPI_MPI_Reduce( void *sendbuf, void *recvbuf, int count, MPI_Datatype datat int rank; int size; int i; + int tag=0; smpi_mpi_request_t *tabrequest; smpi_mpi_request_t request; @@ -261,11 +265,11 @@ int SMPI_MPI_Reduce( void *sendbuf, void *recvbuf, int count, MPI_Datatype datat rank = smpi_mpi_comm_rank(comm); size = comm->size; - printf("-->rank %d. Entering ....\n",rank); - print_buffer_int( sendbuf, count, "sendbuf"); + //printf("-->rank %d. Entering ....\n",rank); + //print_buffer_int( sendbuf, count, "sendbuf"); if (rank != root) { // if i am not ROOT, simply send my buffer to root - retval = smpi_create_request(sendbuf, count, datatype, rank, root, 0, comm, &request); + retval = smpi_create_request(sendbuf, count, datatype, rank, root, tag , comm, &request); smpi_mpi_isend(request); smpi_mpi_wait(request, MPI_STATUS_IGNORE); xbt_mallocator_release(smpi_global->request_mallocator, request); @@ -274,15 +278,20 @@ int SMPI_MPI_Reduce( void *sendbuf, void *recvbuf, int count, MPI_Datatype datat // i am the ROOT: wait for all buffers by creating one request by sender tabrequest = xbt_malloc((size-1)*sizeof(smpi_mpi_request_t)); - void *tmprecvbuf = xbt_malloc(count*datatype->size); // to store intermediate receptions + void **tmpbufs = xbt_malloc((size-1)*sizeof(void *)); + for (i=0; isize); + } memcpy(recvbuf,sendbuf,count*datatype->size*sizeof(char)); // initiliaze recv buf with my own snd buf // i can not use: 'request->forward = size-1;' (which would progagate size-1 receive reqs) // since we should op values as soon as one receiving request matches. for (i=0; isize-1; i++) { // reminder: for smpi_create_request() the src is always the process sending. - retval = smpi_create_request(tmprecvbuf, count, datatype, MPI_ANY_SOURCE, root, - 0, comm, &(tabrequest[i])); + retval = smpi_create_request(tmpbufs[i], count, datatype, + MPI_ANY_SOURCE, root, + tag, comm, &(tabrequest[i])); if (NULL != tabrequest[i] && MPI_SUCCESS == retval) { if (MPI_SUCCESS == retval) { smpi_mpi_irecv(tabrequest[i]); @@ -294,17 +303,19 @@ int SMPI_MPI_Reduce( void *sendbuf, void *recvbuf, int count, MPI_Datatype datat int index = MPI_UNDEFINED; smpi_mpi_waitany(comm->size-1, tabrequest, &index, MPI_STATUS_IGNORE); - print_buffer_int( recvbuf, count, "rcvbuf"); - printf("MPI_Waitany() unblocked: root received (completes req[%d]): ",index); - print_buffer_int( tmprecvbuf, count, "tmprecvbuf"); + //print_buffer_int( recvbuf, count, "rcvbuf"); + //printf("MPI_Waitany() unblocked: root received (completes req[index=%d]): ",index); + //print_buffer_int( tmpbufs[index], count, "tmpbufs[index]"); // arg 2 is modified - op->func (tmprecvbuf,recvbuf,&count,&datatype); - print_buffer_int( recvbuf, count, "recvbuf after func"); - //fprintf(stderr,"[smpi] %s:%d : MPI_Reduce *Not yet implemented*.\n",__FILE__,__LINE__); - xbt_mallocator_release(smpi_global->request_mallocator, tabrequest[i]); + op->func (tmpbufs[index],recvbuf,&count,&datatype); + + // print_buffer_int( recvbuf, count, "recvbuf after func"); + //xbt_mallocator_release(smpi_global->request_mallocator, tabrequest[i]); + //xbt_free( tmpbufs[index]); } xbt_free(tabrequest); + xbt_free(tmpbufs); } smpi_bench_begin(); -- 2.20.1