From 9e62fbafecd1be354dad058447dba0e7c8fb5560 Mon Sep 17 00:00:00 2001 From: genaud Date: Tue, 30 Jun 2009 11:55:21 +0000 Subject: [PATCH] MPI_Reduce() is ok except memleak git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@6395 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- src/smpi/BUGS | 31 +++++++++++++++++++++++++++++++ src/smpi/smpi_base.c | 6 +++--- src/smpi/smpi_mpi.c | 33 +++++++++++++++++++-------------- 3 files changed, 53 insertions(+), 17 deletions(-) create mode 100644 src/smpi/BUGS diff --git a/src/smpi/BUGS b/src/smpi/BUGS new file mode 100644 index 0000000000..1a2f712ba7 --- /dev/null +++ b/src/smpi/BUGS @@ -0,0 +1,31 @@ + + +* MPI_Barrier() + Tue Jun 30 11:49:07 UTC 2009 - genaud + + + several calls to MPI_Barrier() result in: + +genaud@boa:~/Documents/svn/simgrid/simgrid/trunk/src/smpi$ ./smpirun -np 2 -platform g1.xml -hostfile hostfile ./barrier +[0.000000] [simix_kernel/INFO] Oops ! Deadlock or code not perfectly clean. +[0.000000] [simix_kernel/INFO] 6 processes are still running, waiting for something. +[0.000000] [simix_kernel/INFO] Legend of the following listing: " on : ." +[0.000000] [simix_kernel/INFO] smpi_simulated_main on grelon-1.nancy.grid5000.fr: Blocked on condition 0xdead; Waiting for the following actions: 'sleep'(0xdead) 'sleep'(0xdead). +[0.000000] [simix_kernel/INFO] smpi_simulated_main on grelon-2.nancy.grid5000.fr: Blocked on condition 0xdead; Waiting for the following actions: 'sleep'(0xdead) 'sleep'(0xdead). +[0.000000] [simix_kernel/INFO] smpi_sender on grelon-1.nancy.grid5000.fr: [SUSPENDED] Blocked on condition 0xdead; Waiting for the following actions: 'dummy'(0xdead). +[0.000000] [simix_kernel/INFO] smpi_receiver on grelon-1.nancy.grid5000.fr: [SUSPENDED] Blocked on condition 0xdead; Waiting for the following actions: 'dummy'(0xdead). +[0.000000] [simix_kernel/INFO] smpi_sender on grelon-2.nancy.grid5000.fr: [SUSPENDED] Blocked on condition 0xdead; Waiting for the following actions: 'dummy'(0xdead). +[0.000000] [simix_kernel/INFO] smpi_receiver on grelon-2.nancy.grid5000.fr: [SUSPENDED] Blocked on condition 0xdead; Waiting for the following actions: 'dummy'(0xdead). +[0.000000] [simix_kernel/INFO] Return a Warning. +** SimGrid: UNCAUGHT EXCEPTION received on (0): category: unknown_err; value: 0 +** Cannot destroy conditional since someone is still using it +** Thrown by () in this process +[0.000000] xbt/ex.c:117: [xbt_ex/CRITICAL] Cannot destroy conditional since someone is still using it + +** In SIMIX_cond_destroy() at /home/genaud/Documents/svn/simgrid/simgrid/trunk/src/simix/smx_synchro.c:302 +** In smpi_global_destroy() at /home/genaud/Documents/svn/simgrid/simgrid/trunk/src/smpi/smpi_global.c:239 +** In smpi_run_simulation() at /home/genaud/Documents/svn/simgrid/simgrid/trunk/src/smpi/smpi_global.c:333 +./smpirun: line 176: 18880 Abandon ${EXEC} ${SIMOPTS} ${PLATFORMTMP} ${APPLICATIONTMP} + + + diff --git a/src/smpi/smpi_base.c b/src/smpi/smpi_base.c index 13a8424030..2da2627981 100644 --- a/src/smpi/smpi_base.c +++ b/src/smpi/smpi_base.c @@ -115,17 +115,17 @@ void smpi_mpi_max_func(void *a, void *b, int *length, MPI_Datatype * datatype) } } else if (*datatype == smpi_mpi_global->mpi_int) { int *x = a, *y = b; - for (i = 0; i > *length; i++) { + for (i = 0; i < *length; i++) { y[i] = x[i] > y[i] ? x[i] : y[i]; } } else if (*datatype == smpi_mpi_global->mpi_float) { float *x = a, *y = b; - for (i = 0; i > *length; i++) { + for (i = 0; i < *length; i++) { y[i] = x[i] > y[i] ? x[i] : y[i]; } } else if (*datatype == smpi_mpi_global->mpi_double) { double *x = a, *y = b; - for (i = 0; i > *length; i++) { + for (i = 0; i < *length; i++) { y[i] = x[i] > y[i] ? x[i] : y[i]; } diff --git a/src/smpi/smpi_mpi.c b/src/smpi/smpi_mpi.c index f18a5c1048..abbd1703c4 100644 --- a/src/smpi/smpi_mpi.c +++ b/src/smpi/smpi_mpi.c @@ -229,25 +229,27 @@ int SMPI_MPI_Bcast(void *buf, int count, MPI_Datatype datatype, int root, return retval; } + + +#ifdef DEBUG_REDUCE /** * 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) { +void print_buffer_int( void *buf, int len, const char *msg, int rank) ; +void print_buffer_int( void *buf, int len, const char *msg, int rank) { int tmp, *v; - printf("**%s: ",msg); + printf("**[%d] %s: ",rank,msg); for (tmp=0;tmpsize; - //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 + +#ifdef DEBUG_REDUCE + print_buffer_int( sendbuf, count, "sndbuf",rank); +#endif retval = smpi_create_request(sendbuf, count, datatype, rank, root, tag , comm, &request); smpi_mpi_isend(request); smpi_mpi_wait(request, MPI_STATUS_IGNORE); @@ -303,16 +305,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[index=%d]): ",index); - //print_buffer_int( tmpbufs[index], count, "tmpbufs[index]"); +#ifdef DEBUG_REDUCE + printf("MPI_Waitany() unblocked: root received (completes req[index=%d])\n",index); + print_buffer_int( tmpbufs[index], count, "tmpbufs[index]",rank); +#endif // arg 2 is modified op->func (tmpbufs[index],recvbuf,&count,&datatype); +#ifdef DEBUG_REDUCE + print_buffer_int( recvbuf, count, "rcvbuf",rank); - // print_buffer_int( recvbuf, count, "recvbuf after func"); +#endif //xbt_mallocator_release(smpi_global->request_mallocator, tabrequest[i]); - //xbt_free( tmpbufs[index]); + xbt_free( tmpbufs[index]); } xbt_free(tabrequest); xbt_free(tmpbufs); -- 2.20.1