Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
* MPI_Sendrecv user+internal levels
authorgenaud <genaud@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Thu, 16 Jul 2009 15:25:18 +0000 (15:25 +0000)
committergenaud <genaud@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Thu, 16 Jul 2009 15:25:18 +0000 (15:25 +0000)
* added another test for alltoall

git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@6515 48e7efb5-ca39-0410-a469-dd3cf9ba447f

ChangeLog
examples/smpi/alltoall2.c [new file with mode: 0644]
src/smpi/private.h
src/smpi/smpi_mpi.c

index 863403d..013329c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -2,7 +2,7 @@ SimGrid (3.3.2-svn) unstable; urgency=low
 
  SMPI:
   * Implement some more MPI primitives: 
 
  SMPI:
   * Implement some more MPI primitives: 
-    MPI_Waitany, MPI_Waitall, MPI_Reduce, MPI_Allreduce
+    MPI_Waitany, MPI_Waitall, MPI_Reduce, MPI_Allreduce, MPI_Sendrecv
   * Add support for optimized collectives (Bcast is now binomial by default)
   * Port smpirun and smpicc to OS X
 
   * Add support for optimized collectives (Bcast is now binomial by default)
   * Port smpirun and smpicc to OS X
 
diff --git a/examples/smpi/alltoall2.c b/examples/smpi/alltoall2.c
new file mode 100644 (file)
index 0000000..ae47160
--- /dev/null
@@ -0,0 +1,68 @@
+/****************************************************************************
+
+ 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.
+
+****************************************************************************
+
+ These test cases reflect an interpretation of the MPI Standard.  They are
+ are, in most cases, unit tests of specific MPI behaviors.  If a user of any
+ test case from this set believes that the MPI Standard requires behavior
+ different than that implied by the test case we would appreciate feedback.
+
+ Comments may be sent to:
+    Richard Treumann
+    treumann@kgn.ibm.com
+
+****************************************************************************
+*/
+#include "mpi.h"
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+
+
+#define MAXLEN 10000
+void main()
+{
+   int out[1000000],in[1000000],i,j,k;
+   int myself,tasks;
+   MPI_Init(0,0);
+   MPI_Comm_rank(MPI_COMM_WORLD,&myself);
+   MPI_Comm_size(MPI_COMM_WORLD,&tasks);
+   for(j=1;j<=MAXLEN;j*=10)  {
+      for(i=0;i<j*tasks;i++)  out[i] = myself;
+      MPI_Alltoall(out,j,MPI_INT,in,j,MPI_INT,MPI_COMM_WORLD);
+      for(i=0;i<tasks;i++)  {
+         for(k=0;k<j;k++) {
+            if(in[k+i*j] != i) {  printf("bad answer (%d) at index %d of %d (should be %d)\n",in[k+i*j],k+i*j,j*tasks,i); break; }
+         }
+      }
+   }
+   MPI_Barrier(MPI_COMM_WORLD);
+   if(myself==0)  printf("TEST COMPLETE\n");
+   MPI_Finalize();
+}
index 1482c3c..e01c624 100644 (file)
@@ -130,6 +130,9 @@ int smpi_mpi_barrier(smpi_mpi_communicator_t comm);
 int smpi_mpi_isend(smpi_mpi_request_t request);
 int smpi_mpi_irecv(smpi_mpi_request_t request);
 int smpi_mpi_reduce(void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, int root, MPI_Comm comm);
 int smpi_mpi_isend(smpi_mpi_request_t request);
 int smpi_mpi_irecv(smpi_mpi_request_t request);
 int smpi_mpi_reduce(void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, int root, MPI_Comm comm);
+int smpi_mpi_sendrecv(void *sendbuf, int sendcount, MPI_Datatype sendtype, int dest, int sendtag, 
+                           void *recvbuf, int recvcount, MPI_Datatype recvtype, int source, int recvtag,
+                         MPI_Comm comm, MPI_Status *status);
 int smpi_mpi_wait(smpi_mpi_request_t request, smpi_mpi_status_t * status);
 int smpi_mpi_waitall(int count, smpi_mpi_request_t requests[], smpi_mpi_status_t status[]);
 int smpi_mpi_waitany(int count, smpi_mpi_request_t requests[], int *index, smpi_mpi_status_t status[]);
 int smpi_mpi_wait(smpi_mpi_request_t request, smpi_mpi_status_t * status);
 int smpi_mpi_waitall(int count, smpi_mpi_request_t requests[], smpi_mpi_status_t status[]);
 int smpi_mpi_waitany(int count, smpi_mpi_request_t requests[], int *index, smpi_mpi_status_t status[]);
index 1e1f6c9..c1f5253 100644 (file)
@@ -191,10 +191,11 @@ int SMPI_MPI_Send(void *buf, int count, MPI_Datatype datatype, int dst,
   return retval;
 }
 
   return retval;
 }
 
+
 /**
 /**
- * MPI_Sendrecv
+ * MPI_Sendrecv internal level 
  **/
  **/
-int SMPI_MPI_Sendrecv(void *sendbuf, int sendcount, MPI_Datatype sendtype, int dest, int sendtag, 
+int smpi_mpi_sendrecv(void *sendbuf, int sendcount, MPI_Datatype sendtype, int dest, int sendtag, 
                    void *recvbuf, int recvcount, MPI_Datatype recvtype, int source, int recvtag,
                    MPI_Comm comm, MPI_Status *status)
 {
                    void *recvbuf, int recvcount, MPI_Datatype recvtype, int source, int recvtag,
                    MPI_Comm comm, MPI_Status *status)
 {
@@ -206,36 +207,43 @@ smpi_mpi_request_t rrequest;
          rank = smpi_mpi_comm_rank(comm);
 
          /* send */
          rank = smpi_mpi_comm_rank(comm);
 
          /* send */
-         /* -------------*/
-           retval = smpi_create_request(sendbuf, sendcount, sendtype, 
+         retval = smpi_create_request(sendbuf, sendcount, sendtype, 
                                rank,dest,sendtag, 
                                comm, &srequest);
                                rank,dest,sendtag, 
                                comm, &srequest);
-         //printf("[%d] isend request src=%d -> dst=%d (retval=%d)\n",rank,rank,dest,retval);
          smpi_mpi_isend(srequest);
         
          smpi_mpi_isend(srequest);
         
-         
-         //retval = MPI_Isend( sendbuf, sendcount, sendtype, dest, sendtag, MPI_COMM_WORLD, &srequest);
-
-
          /* recv */
          retval = smpi_create_request(recvbuf, recvcount, recvtype, 
                                source, rank,recvtag, 
                                comm, &rrequest);
          /* recv */
          retval = smpi_create_request(recvbuf, recvcount, recvtype, 
                                source, rank,recvtag, 
                                comm, &rrequest);
-         //printf("[%d] irecv request src=%d -> dst=%d (retval=%d)\n",rank,source,rank,retval);
          smpi_mpi_irecv(rrequest);
 
          smpi_mpi_irecv(rrequest);
 
-         //retval = MPI_Irecv( recvbuf, recvcount, recvtype, source, recvtag, MPI_COMM_WORLD, &rrequest);
-
-
          smpi_mpi_wait(srequest, MPI_STATUS_IGNORE);
          //printf("[%d] isend request src=%d dst=%d tag=%d COMPLETED (retval=%d) \n",rank,rank,dest,sendtag,retval);
          smpi_mpi_wait(srequest, MPI_STATUS_IGNORE);
          //printf("[%d] isend request src=%d dst=%d tag=%d COMPLETED (retval=%d) \n",rank,rank,dest,sendtag,retval);
-
          smpi_mpi_wait(rrequest, MPI_STATUS_IGNORE);
          //printf("[%d] irecv request src=%d -> dst=%d tag=%d COMPLETED (retval=%d)\n",rank,source,rank,recvtag,retval);
 
          return(retval);
 }
          smpi_mpi_wait(rrequest, MPI_STATUS_IGNORE);
          //printf("[%d] irecv request src=%d -> dst=%d tag=%d COMPLETED (retval=%d)\n",rank,source,rank,recvtag,retval);
 
          return(retval);
 }
+/**
+ * MPI_Sendrecv user entry point
+ **/
+int SMPI_MPI_Sendrecv(void *sendbuf, int sendcount, MPI_Datatype sendtype, int dest, int sendtag, 
+                   void *recvbuf, int recvcount, MPI_Datatype recvtype, int source, int recvtag,
+                   MPI_Comm comm, MPI_Status *status)
+{
+int retval = MPI_SUCCESS;
+
+  smpi_bench_end();
+  smpi_mpi_sendrecv( sendbuf, sendcount, sendtype, dest, sendtag, 
+                        recvbuf, recvcount, recvtype, source, recvtag,
+                        comm, status);
+  smpi_bench_begin();
 
 
+  return retval;
+
+       
+}
 
 /**
  * MPI_Wait and friends
 
 /**
  * MPI_Wait and friends
@@ -349,7 +357,7 @@ static void print_buffer_double(void *buf, int len, char *msg, int rank)
 
 #endif
 /**
 
 #endif
 /**
- * MPI_Reduce
+ * MPI_Reduce internal level 
  **/
 int smpi_mpi_reduce(void *sendbuf, void *recvbuf, int count,
                 MPI_Datatype datatype, MPI_Op op, int root, MPI_Comm comm)
  **/
 int smpi_mpi_reduce(void *sendbuf, void *recvbuf, int count,
                 MPI_Datatype datatype, MPI_Op op, int root, MPI_Comm comm)
@@ -476,9 +484,6 @@ int root=0;  // arbitrary choice
 /**
  * MPI_Scatter user entry point
  **/
 /**
  * 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 SMPI_MPI_Scatter(void *sendbuf, int sendcount, MPI_Datatype datatype, 
                         void *recvbuf, int recvcount, MPI_Datatype recvtype,
                           int root, MPI_Comm comm)
 int SMPI_MPI_Scatter(void *sendbuf, int sendcount, MPI_Datatype datatype, 
                         void *recvbuf, int recvcount, MPI_Datatype recvtype,
                           int root, MPI_Comm comm)