-/**
- * MPI_Scatter user entry point
- **/
-int SMPI_MPI_Scatter(void *sendbuf, int sendcount, MPI_Datatype datatype,
- void *recvbuf, int recvcount, MPI_Datatype recvtype,
- int root, MPI_Comm comm)
-{
- int retval = MPI_SUCCESS;
- int i;
- int cnt=0;
- int rank;
- int tag=0;
- char *cptr; // to manipulate the void * buffers
- smpi_mpi_request_t *requests;
- smpi_mpi_request_t request;
- smpi_mpi_status_t status;
-
-
- smpi_bench_end();
-
- rank = smpi_mpi_comm_rank(comm);
-
- requests = xbt_malloc((comm->size-1) * sizeof(smpi_mpi_request_t));
- if (rank == root) {
- // i am the root: distribute my sendbuf
- //print_buffer_int(sendbuf, comm->size, xbt_strdup("rcvbuf"), rank);
- cptr = sendbuf;
- for (i=0; i < comm->size; i++) {
- if ( i!=root ) { // send to processes ...
-
- retval = smpi_create_request((void *)cptr, sendcount,
- datatype, root, i, tag, comm, &(requests[cnt]));
- if (NULL != requests[cnt] && MPI_SUCCESS == retval) {
- if (MPI_SUCCESS == retval) {
- smpi_mpi_isend(requests[cnt]);
- }
- }
- cnt++;
- }
- else { // ... except if it's me.
- memcpy(recvbuf, (void *)cptr, recvcount*recvtype->size*sizeof(char));
- }
- cptr += sendcount*datatype->size;
- }
- for(i=0; i<cnt; i++) { // wait for send to complete
- /* FIXME: waitall() should be slightly better */
- smpi_mpi_wait(requests[i], &status);
- xbt_mallocator_release(smpi_global->request_mallocator, requests[i]);
-
- }
- }
- else { // i am a non-root process: wait data from the root
- retval = smpi_create_request(recvbuf,recvcount,
- recvtype, root, rank, tag, comm, &request);
- if (NULL != request && MPI_SUCCESS == retval) {
- if (MPI_SUCCESS == retval) {
- smpi_mpi_irecv(request);
- }
- }
- smpi_mpi_wait(request, &status);
- xbt_mallocator_release(smpi_global->request_mallocator, request);
- }
- xbt_free(requests);
-
- smpi_bench_begin();
-
- return retval;
-}
-
-
-/**
- * MPI_Alltoall user entry point
- *
- * Uses the logic of OpenMPI (upto 1.2.7 or greater) for the optimizations
- * ompi/mca/coll/tuned/coll_tuned_module.c
- **/
-int SMPI_MPI_Alltoall(void *sendbuf, int sendcount, MPI_Datatype datatype,
- void *recvbuf, int recvcount, MPI_Datatype recvtype,
- MPI_Comm comm)
-{
- int retval = MPI_SUCCESS;
- int block_dsize;
- int rank;