# <simgrid>/tools/tesh/README.tesh
# - List the tesh file in the TESTS variable so that it gets tested on make check
-noinst_PROGRAMS = allreduce bcast bcbench compute compute2 compute3 first second mvmul ring_c split scatter reduce sendrecv
+noinst_PROGRAMS = allreduce bcast bcbench compute compute2 compute3 first pingpong second sendrecv mvmul ring_c split scatter reduce
+
allreduce: allreduce.c
$(top_builddir)/src/smpi/smpicc $^ -o $@
bcast: bcast.c
$(top_builddir)/src/smpi/smpicc $^ -o $@
first: mvmul.c
$(top_builddir)/src/smpi/smpicc $^ -o $@
+pingpong: pingpong.c
+ $(top_builddir)/src/smpi/smpicc $^ -o $@
second: second.c
$(top_builddir)/src/smpi/smpicc $^ -o $@
scatter: scatter.c
$(top_builddir)/src/smpi/smpicc $^ -o $@
ring_c: ring_c.c
$(top_builddir)/src/smpi/smpicc $^ -o $@
+sendrecv: sendrecv.c
+ $(top_builddir)/src/smpi/smpicc $^ -o $@
split: split.c
$(top_builddir)/src/smpi/smpicc $^ -o $@
mvmul: mvmul.c
#include "mpi.h"
#include <stdio.h>
-
-int main(int argc, char *argv[])
-{
-#define TAG_RCV 998
+
+int test(int myid, int numprocs) {
+// The tags should match on the sender and receiver side.
+// The distinction between sendtag and recvtag is mainly
+// useful to make some other Recv or Send calls match the sendrecv.
+#define TAG_RCV 999
#define TAG_SND 999
- int myid, numprocs, left, right;
- int buffer[10], buffer2[10];
+
+
+#define BUFLEN 10
+ int left, right;
+ int buffer[BUFLEN], buffer2[BUFLEN];
+ int i;
MPI_Request request;
MPI_Status status;
-
- MPI_Init(&argc,&argv);
- MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
- MPI_Comm_rank(MPI_COMM_WORLD, &myid);
-
+
+ for (i=0;i<BUFLEN;i++) {
+ buffer[i]=myid;
+ }
+
right = (myid + 1) % numprocs;
left = myid - 1;
if (left < 0)
left = numprocs - 1;
-
+
+ /* performs a right-to-left shift of vectors */
MPI_Sendrecv(buffer, 10, MPI_INT, left, TAG_SND, buffer2, 10, MPI_INT, right, TAG_RCV, MPI_COMM_WORLD, &status);
+ for (i=0;i<BUFLEN;i++) {
+ if (buffer2[i]!=((myid+1)%numprocs)) {
+ fprintf(stderr,"[%d] error: should have values %d, has %d\n",myid,myid-1,buffer[i]);
+ return(0);
+ }
+ }
+ return(1);
+}
+
+int main(int argc, char *argv[])
+{
+
+ int myid, numprocs;
+
+ MPI_Init(&argc,&argv);
+ MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
+ MPI_Comm_rank(MPI_COMM_WORLD, &myid);
+
+
+ if (0==myid)
+ printf("\n *** MPI_Sendrecv test ***\n\n");
+
+ if ( test(myid,numprocs)) {
+ fprintf(stderr,"[%d] ok.\n",myid);
+ }
+ else {
+ fprintf(stderr,"[%d] failed.\n",myid);
+ }
+
+
MPI_Finalize();
return 0;
}
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);
+ //printf("[%d] isend request src=%d -> dst=%d (retval=%d)\n",rank,rank,dest,retval);
smpi_mpi_isend(srequest);
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);
+ //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);
+ //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);
+ //printf("[%d] irecv request src=%d -> dst=%d tag=%d COMPLETED (retval=%d)\n",rank,source,rank,recvtag,retval);
return(retval);
}