Test code for Put/Get, and IGet
authorYan Shi <yanshi@uiuc.edu>
Fri, 7 Apr 2006 05:33:27 +0000 (05:33 +0000)
committerYan Shi <yanshi@uiuc.edu>
Fri, 7 Apr 2006 05:33:27 +0000 (05:33 +0000)
examples/ampi/onesided/GetPutTest.C [new file with mode: 0644]
examples/ampi/onesided/IGetTest.C [new file with mode: 0644]
examples/ampi/onesided/Makefile [new file with mode: 0644]

diff --git a/examples/ampi/onesided/GetPutTest.C b/examples/ampi/onesided/GetPutTest.C
new file mode 100644 (file)
index 0000000..465b056
--- /dev/null
@@ -0,0 +1,96 @@
+/***********************************************
+          MPI / AMPI test program for OneSided Put/Get
+          Prints bandwidth and latency for a specific message size
+          Yan Shi 04/05/2006
+**************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <mpi.h>
+
+int main(int argc, char **argv)
+{
+  int my_id,next_id;            /* process id */
+  int p;                /* number of processes */
+  char* message_s, *message_r;  /* storage for the message */
+  int i, j, max_msgs, msg_size;
+  MPI_Status status;    /* return status for receive */
+  double elapsed_time_sec;
+  double bandwidth;
+  double startTime = 0;
+  MPI_Win win; 
+
+  MPI_Init( &argc, &argv );
+
+  MPI_Comm_rank( MPI_COMM_WORLD, &my_id );
+  MPI_Comm_size( MPI_COMM_WORLD, &p );
+
+  if ((sscanf (argv[1], "%d", &max_msgs) < 1) ||
+      (sscanf (argv[2], "%d", &msg_size) < 1)) {
+    fprintf (stderr, "need msg count and msg size as params\n");
+    goto EXIT;
+  }
+  fprintf(stdout, "Msg size %d,  loop %d\n", msg_size, max_msgs);
+  //allocate data   
+  message_s = (char*)malloc (msg_size);
+  message_r = (char*)malloc (msg_size);
+
+  //init data for verifying purpose
+  message_s[0] = 'a';
+
+  //create window
+  MPI_Win_create(message_s, msg_size, 1, 0, MPI_COMM_WORLD, &win);
+
+  //timing
+  MPI_Barrier(MPI_COMM_WORLD);
+  startTime = MPI_Wtime();
+
+  next_id = my_id+1>=p ? 0 : my_id+1;
+  // combined local transpose with global all-to-all
+  for(i=0; i<max_msgs; i++){
+      MPI_Get(message_r, msg_size, MPI_CHAR, next_id, 0, msg_size, MPI_CHAR, win);
+//      fprintf(stdout, "[%d] get %c\n", my_id, message_r[0]);
+  }
+  MPI_Win_fence(0, win);
+  fprintf(stdout, "[%d] get %c\n", my_id, message_r[0]);
+
+  MPI_Barrier(MPI_COMM_WORLD);
+  elapsed_time_sec = MPI_Wtime() - startTime;
+  fprintf(stdout, "Get Performance:\n");
+  fprintf(stdout, "Totaltime: %8.3f s\n",elapsed_time_sec);
+  elapsed_time_sec /= max_msgs; //time for each message
+  bandwidth = msg_size / elapsed_time_sec; //bandwidth
+
+  fprintf (stdout, "%5d %7d\t ", max_msgs, msg_size);
+  fprintf (stdout,"%8.3f us,\t %8.3f MB/sec\n",
+           elapsed_time_sec * 1e6, bandwidth / 1e6);
+
+  message_r[0] = 'b';
+  startTime = MPI_Wtime();
+  for(i=0; i<max_msgs; i++){
+      MPI_Put(message_r, msg_size, MPI_CHAR, next_id, 0, msg_size, MPI_CHAR, win);
+  }
+  MPI_Win_fence(0, win);
+  fprintf(stdout, "[%d] get %c\n", my_id, message_s[0]);
+
+  MPI_Barrier(MPI_COMM_WORLD);
+  elapsed_time_sec = MPI_Wtime() - startTime;
+  fprintf(stdout, "Put Performance:\n");
+  fprintf(stdout, "Totaltime: %8.3f s\n",elapsed_time_sec);
+  elapsed_time_sec /= max_msgs; //time for each message
+  bandwidth = msg_size / elapsed_time_sec; //bandwidth
+
+  fprintf (stdout, "%5d %7d\t ", max_msgs, msg_size);
+  fprintf (stdout,"%8.3f us,\t %8.3f MB/sec\n",
+           elapsed_time_sec * 1e6, bandwidth / 1e6);
+
+  //deallocate data and stuff
+  MPI_Win_free(&win);
+  free(message_s);
+  free(message_r);
+
+ EXIT:
+  MPI_Finalize();
+  return 0;
+}
+
diff --git a/examples/ampi/onesided/IGetTest.C b/examples/ampi/onesided/IGetTest.C
new file mode 100644 (file)
index 0000000..010f7d5
--- /dev/null
@@ -0,0 +1,78 @@
+/***********************************************
+          MPI / AMPI test program for OneSided Put/Get
+          Prints bandwidth and latency for a specific message size
+          Yan Shi 04/05/2006
+**************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <mpi.h>
+
+int main(int argc, char **argv)
+{
+  int my_id,next_id;            /* process id */
+  int p;                /* number of processes */
+  char* message_s, *message_r;  /* storage for the message */
+  int i, j, max_msgs, msg_size;
+  MPI_Status status;    /* return status for receive */
+  double elapsed_time_sec;
+  double bandwidth;
+  double startTime = 0;
+  MPI_Win win; 
+  MPI_Request req;
+
+  MPI_Init( &argc, &argv );
+
+  MPI_Comm_rank( MPI_COMM_WORLD, &my_id );
+  MPI_Comm_size( MPI_COMM_WORLD, &p );
+
+  if ((sscanf (argv[1], "%d", &max_msgs) < 1) ||
+      (sscanf (argv[2], "%d", &msg_size) < 1)) {
+    fprintf (stderr, "need msg count and msg size as params\n");
+    goto EXIT;
+  }
+  fprintf(stdout, "Msg size %d,  loop %d\n", msg_size, max_msgs);
+  //allocate data   
+  message_s = (char*)malloc (msg_size);
+
+  //init data for verifying purpose
+  message_s[0] = 'a';
+
+  //create window
+  MPI_Win_create(message_s, msg_size, 1, 0, MPI_COMM_WORLD, &win);
+
+  //timing
+  MPI_Barrier(MPI_COMM_WORLD);
+  startTime = MPI_Wtime();
+
+  next_id = my_id+1>=p ? 0 : my_id+1;
+  // combined local transpose with global all-to-all
+  for(i=0; i<max_msgs; i++){
+      MPI_IGet(0, msg_size, MPI_CHAR, next_id, 0, msg_size, MPI_CHAR, win, &req);
+      MPI_IGet_Wait(&req, &status, win);       
+      message_r = (char*)MPI_IGet_Data(status); //MPI_IGet_Data(status);
+      fprintf(stdout, "[%d] get %c\n", my_id, message_r[0]);
+      MPI_IGet_Free(&req, &status, win);
+  }
+  MPI_Win_fence(0, win);
+
+  MPI_Barrier(MPI_COMM_WORLD);
+  elapsed_time_sec = MPI_Wtime() - startTime;
+  fprintf(stdout, "Get Performance:\n");
+  fprintf(stdout, "Totaltime: %8.3f s\n",elapsed_time_sec);
+  elapsed_time_sec /= max_msgs; //time for each message
+  bandwidth = msg_size / elapsed_time_sec; //bandwidth
+
+  fprintf (stdout, "%5d %7d\t ", max_msgs, msg_size);
+  fprintf (stdout,"%8.3f us,\t %8.3f MB/sec\n",
+           elapsed_time_sec * 1e6, bandwidth / 1e6);
+
+  //deallocate data and stuff
+  MPI_Win_free(&win);
+  free(message_s);
+
+ EXIT:
+  MPI_Finalize();
+  return 0;
+}
+
diff --git a/examples/ampi/onesided/Makefile b/examples/ampi/onesided/Makefile
new file mode 100644 (file)
index 0000000..afe1020
--- /dev/null
@@ -0,0 +1,18 @@
+OPTS=-O3 
+CHARMC=../../../bin/charmc -language ampi $(OPTS)
+MPICC=mpicc $(OPTS)
+
+all : GetPutTest IGetTest
+
+GetPutTest: GetPutTest.C
+       $(CHARMC) GetPutTest.C -language ampi  -o GetPutTest
+#      $(MPICC) GetPutTest.C -o GetPutTest-mpi
+IGetTest: IGetTest.C
+       $(CHARMC) IGetTest.C -language ampi  -o IGetTest
+
+test: all
+       ./charmrun +p2 ./pgm 100000 16 +vp2
+
+clean:
+       rm -rf charmrun conv-host moduleinit* *.o GetPutTest IGetTest GetPutTest-mpi *~ *.sts core
+