--- /dev/null
+/****************************************************************************
+
+ 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();
+}
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[]);
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)
{
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);
- //printf("[%d] isend request src=%d -> dst=%d (retval=%d)\n",rank,rank,dest,retval);
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);
- //printf("[%d] irecv request src=%d -> dst=%d (retval=%d)\n",rank,source,rank,retval);
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(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
#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)
/**
* 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)