From: genaud Date: Thu, 9 Jul 2009 20:36:21 +0000 (+0000) Subject: - MPI_Scatter() /* untested */ X-Git-Tag: SVN~1181 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/3a6ab425e9bac068b1f95bf690400f63f5290093?hp=f39fbe7b55f83e16713c1669a09dc55f85731e8e - MPI_Scatter() /* untested */ - associated tests git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@6466 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- diff --git a/examples/smpi/allreduce.c b/examples/smpi/allreduce.c new file mode 100644 index 0000000000..f8ecf7b607 --- /dev/null +++ b/examples/smpi/allreduce.c @@ -0,0 +1,79 @@ +#include +#include + +/** + * MESSAGE PASSING INTERFACE TEST CASE SUITE + * + * Copyright IBM Corp. 1995 + * + * IBM Corp. hereby grants a non-exclusive license to use, copy, modify, and + *distribute this software for any purpose and without fee provided that the + *above copyright notice and the following paragraphs appear in all copies. + + * IBM Corp. makes no representation that the test cases comprising this + * suite are correct or are an accurate representation of any standard. + + * In no event shall IBM be liable to any party for direct, indirect, special + * incidental, or consequential damage arising out of the use of this software + * even if IBM Corp. has been advised of the possibility of such damage. + + * IBM CORP. SPECIFICALLY DISCLAIMS ANY WARRANTIES INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS AND IBM + * CORP. HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, + * ENHANCEMENTS, OR MODIFICATIONS. + * *************************************************************************** + **/ +int ibm_test(int rank, int size) +{ + int success = 1; +#define MAXLEN 10000 + + int root, i, j, k; + int out[MAXLEN]; + int in[MAXLEN]; + + for (j = 1; j <= MAXLEN; j *= 10) { + for (i = 0; i < j; i++) + out[i] = i; + + MPI_Allreduce(out, in, j, MPI_INT, MPI_SUM, MPI_COMM_WORLD); + MPI_Barrier(MPI_COMM_WORLD); + + if (rank == root) { + for (k = 0; k < j; k++) { + if (in[k] != k * size) { + printf("bad answer (%d) at index %d of %d (should be %d)", in[k], k, + j, k * size); + success = 0; + break; + } + } + } + } + return (success); +} + + + + +int main(int argc, char **argv) +{ + int size, rank; + + + MPI_Init(&argc, &argv); + MPI_Comm_size(MPI_COMM_WORLD, &size); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + + + if (0 == rank) + printf("** IBM Test Result: ... \n"); + if (!ibm_test(rank, size)) + printf("\t[%d] failed.\n", rank); + else + printf("\t[%d] ok.\n", rank); + + MPI_Finalize(); + return 0; +} diff --git a/examples/smpi/scatter.c b/examples/smpi/scatter.c new file mode 100644 index 0000000000..9647aee838 --- /dev/null +++ b/examples/smpi/scatter.c @@ -0,0 +1,106 @@ +/** + * MESSAGE PASSING INTERFACE TEST CASE SUITE + * + * Copyright IBM Corp. 1995 + * + * IBM Corp. hereby grants a non-exclusive license to use, copy, modify, and + *distribute this software for any purpose and without fee provided that the + *above copyright notice and the following paragraphs appear in all copies. + + * IBM Corp. makes no representation that the test cases comprising this + * suite are correct or are an accurate representation of any standard. + + * In no event shall IBM be liable to any party for direct, indirect, special + * incidental, or consequential damage arising out of the use of this software + * even if IBM Corp. has been advised of the possibility of such damage. + + * IBM CORP. SPECIFICALLY DISCLAIMS ANY WARRANTIES INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS AND IBM + * CORP. HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, + * ENHANCEMENTS, OR MODIFICATIONS. + * *************************************************************************** + **/ +#include +#include + +int ibm_test(int rank, int size) { + +#define MAXLEN 10000 + + int success = 1; + int root,i,j,k; + int out[MAXLEN*64]; + int in[MAXLEN]; + + + for(j=1,root=0;j<=MAXLEN;j*=10,root=(root+1)%size) { + if(rank == root) + for(i=0;isize-1) * sizeof(smpi_mpi_request_t)); + if (rank == root) { + // i am the root: distribute my sendbuf + for (i=0; i < comm->size; i++) { + cbuf = sendbuf; + cbuf += i*sendcount*datatype->size; + if ( i!=root ) { // send to processes ... + + retval = smpi_create_request((void *)cbuf, 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 *)cbuf, recvcount*recvtype->size*sizeof(char)); + } + } + for(i=0; irequest_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; +} + + +