X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/bd9bee9dcbceb25fdb5a293b91abbd5476db7ad2..54ce50db3eb883dfc77d00b9e885e786d7a6d381:/src/smpi/smpi_mpi.c diff --git a/src/smpi/smpi_mpi.c b/src/smpi/smpi_mpi.c index 6713ba5e7f..ca94c57c66 100644 --- a/src/smpi/smpi_mpi.c +++ b/src/smpi/smpi_mpi.c @@ -181,11 +181,20 @@ int SMPI_MPI_Send(void *buf, int count, MPI_Datatype datatype, int dst, return retval; } +/** + * MPI_Wait and friends + **/ int SMPI_MPI_Wait(MPI_Request * request, MPI_Status * status) { return smpi_mpi_wait(*request, status); } +int SMPI_MPI_Waitall(int count, MPI_Request requests[], MPI_Status status[]) { + return smpi_mpi_waitall(count, requests,status); +} +int SMPI_MPI_Waitany(int count, MPI_Request requests[], int *index, MPI_Status status[]) { + return smpi_mpi_waitany(count, requests, index,status); +} /** * MPI_Bcast **/ @@ -220,10 +229,27 @@ int SMPI_MPI_Bcast(void *buf, int count, MPI_Datatype datatype, int root, return retval; } + + +#ifdef DEBUG_REDUCE /** - * MPI_Reduce + * debugging helper function **/ +static void print_buffer_int( void *buf, int len, const char *msg, int rank) { + int tmp, *v; + printf("**[%d] %s: ",rank,msg); + for (tmp=0;tmpsize; - tabrequest = xbt_malloc((size)*sizeof(smpi_mpi_request_t)); + if (rank != root) { // if i am not ROOT, simply send my buffer to root + +#ifdef DEBUG_REDUCE + print_buffer_int( sendbuf, count, xbt_strdup("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); + xbt_mallocator_release(smpi_global->request_mallocator, request); - 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, &(tabrequest[rank])); - smpi_mpi_isend(tabrequest[rank]); - smpi_mpi_wait(tabrequest[rank], MPI_STATUS_IGNORE); - //printf("DEBUG: rank %d sent my sendbuf to root (rank %d)\n",rank,root); } else { - // i am the root: wait for all buffers by creating requests + // i am the ROOT: wait for all buffers by creating one request by sender + int src; + tabrequest = xbt_malloc((size-1)*sizeof(smpi_mpi_request_t)); + + 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; i++) { - if ( rank != i ) { // except for me - // reminder: for smpi_create_request() the src is always the process sending. - retval = smpi_create_request(recvbuf, count, datatype, MPI_ANY_SOURCE, root, - 0, comm, &(tabrequest[i])); - if (NULL != tabrequest[i] && MPI_SUCCESS == retval) { - if (MPI_SUCCESS == retval) { - smpi_mpi_irecv(tabrequest[i]); - } + for (i=0; isize; i++) { - if ( rank != i ) { // except for me - smpi_mpi_wait(tabrequest[i], MPI_STATUS_IGNORE); - - // FIXME: the core part is here. To be written ... - - fprintf(stderr,"[smpi] %s:%d : MPI_Reduce *Not yet implemented*.\n",__FILE__,__LINE__); - } + for (i=0; ifunc (tmpbufs[index],recvbuf,&count,&datatype); +#ifdef DEBUG_REDUCE + print_buffer_int( recvbuf, count, xbt_strdup("rcvbuf"),rank); + +#endif + //xbt_mallocator_release(smpi_global->request_mallocator, tabrequest[i]); + xbt_free( tmpbufs[index]); } - + xbt_free(tabrequest); + xbt_free(tmpbufs); } - for (i=0; isize; i++) - xbt_mallocator_release(smpi_global->request_mallocator, tabrequest[i]); smpi_bench_begin(); @@ -287,8 +334,8 @@ int SMPI_MPI_Reduce( void *sendbuf, void *recvbuf, int count, MPI_Datatype datat int smpi_compare_rankkeys(const void *a, const void *b); int smpi_compare_rankkeys(const void *a, const void *b) { - int *x = (int *) a; - int *y = (int *) b; + int *x = (int *) a; + int *y = (int *) b; if (x[1] < y[1]) return -1;