Make ZC EM API pingpong benchmarks accept user params and add a warmup phase 99/4899/8
authorNitin Bhat <nbhat4@illinois.edu>
Wed, 16 Jan 2019 18:02:17 +0000 (13:02 -0500)
committerEvan Ramos <evan@hpccharm.com>
Wed, 10 Apr 2019 17:02:56 +0000 (12:02 -0500)
Change-Id: I161dfb4b112ceb4b7d70cff6818b963974262f72

examples/charm++/zerocopy/entry_method_api/prereg/pingpong/Makefile
examples/charm++/zerocopy/entry_method_api/prereg/pingpong/pingpong.C
examples/charm++/zerocopy/entry_method_api/prereg/pingpong/pingpong.ci
examples/charm++/zerocopy/entry_method_api/reg/pingpong/Makefile
examples/charm++/zerocopy/entry_method_api/reg/pingpong/pingpong.C
examples/charm++/zerocopy/entry_method_api/reg/pingpong/pingpong.ci
examples/charm++/zerocopy/entry_method_api/unreg/pingpong/Makefile
examples/charm++/zerocopy/entry_method_api/unreg/pingpong/pingpong.C
examples/charm++/zerocopy/entry_method_api/unreg/pingpong/pingpong.ci

index 99ad14f49d3beb89a58adde6c14cf2af40c23027..75ec3e603013d4dbb2d12b73ad1fad3b92283f66 100644 (file)
@@ -16,10 +16,12 @@ pingpong.o: pingpong.C cifiles
        $(CHARMC) -c pingpong.C
 
 test: all
-       @echo "Intra-processor Pingpong.."
-       $(call run, ./pgm +p1 )
-       @echo "Inter-processor Pingpong.."
-       $(call run, ./pgm +p2 )
+       $(call run, +p1 ./pgm 1024 8192 2 1)
+       $(call run, +p2 ./pgm 1024 8192 2 1)
+
+test-bench: all
+       $(call run, ./pgm +p1)
+       $(call run, ./pgm +p2)
 
 clean:
        rm -f *.decl.h *.def.h conv-host *.o pgm charmrun cifiles
index 6e528d25dfe19e5a309ac3b7e96b1e84de812534..9485b5a0d050d42515eb492b49f25c0b85387034 100644 (file)
@@ -1,11 +1,7 @@
 #include "pingpong.decl.h"
 
-#define BIG_ITER 10
-#define SMALL_ITER 100
-
-#define MAX_PAYLOAD 1 << 12
-
 CProxy_main mainProxy;
+int minSize, maxSize, smallIter, bigIter;
 
 #define P1 0
 #define P2 1%CkNumPes()
@@ -14,6 +10,7 @@ class main : public CBase_main
 {
   CProxy_Ping1 arr1;
   int size;
+  bool warmUp;
 public:
   main(CkMigrateMessage *m) {}
   main(CkArgMsg *m)
@@ -21,21 +18,37 @@ public:
     if(CkNumPes()>2) {
       CkAbort("Run this program on 1 or 2 processors only.\n");
     }
+    if(m->argc == 5) {
+      minSize = atoi(m->argv[1])/2; // Start with a smaller size to run a warm up phase
+      maxSize = atoi(m->argv[2]);
+      smallIter = atoi(m->argv[3]);
+      bigIter = atoi(m->argv[4]);
+    } else if(m->argc == 1) {
+      // use defaults
+      minSize = 512; // Start with a smaller size to run a warm up phase before starting message size at 1024 bytes
+      maxSize = 1 << 25;
+      smallIter = 1000;
+      bigIter = 100;
+    } else {
+      CkPrintf("Usage: ./pingpong <min size> <max size> <small message iter> <big message iter>\n");
+      CkExit(1);
+    }
     delete m;
-    size = 1024;
+    size = minSize;
     mainProxy = thisProxy;
+    warmUp = true;
     CkPrintf("Size (bytes) \t\tIterations\t\tRegular API (one-way us)\tZero Copy API (one-way us)\n");
     arr1 = CProxy_Ping1::ckNew(2);
     CkStartQD(CkCallback(CkIndex_main::maindone(), mainProxy));
   };
 
   void maindone(void){
-    if(size < MAX_PAYLOAD){
-      arr1[0].start(size);
+    if(size <= maxSize) {
+      arr1[0].start(size, warmUp);
+      warmUp = false;
       size = size << 1;
-    }
-    else if(size == MAX_PAYLOAD){
-      arr1[0].freeBuffer();
+    } else {
+        arr1[0].freeBuffer();
     }
   };
 };
@@ -52,20 +65,20 @@ class Ping1 : public CBase_Ping1
 public:
   Ping1()
   {
-    nocopyMsg = (char *)CkRdmaAlloc(sizeof(char) * MAX_PAYLOAD);
+    nocopyMsg = (char *)CkRdmaAlloc(sizeof(char) * maxSize);
     niter = 0;
   }
   Ping1(CkMigrateMessage *m) {}
 
-  void start(int size)
+  void start(int size, bool warmUp)
   {
     niter = 0;
     if(size >= 1 << 20)
-      iterations = SMALL_ITER;
+      iterations = bigIter;
     else
-      iterations = BIG_ITER;
+      iterations = smallIter;
     start_time = CkWallTimer();
-    thisProxy[1].recv(nocopyMsg, size);
+    thisProxy[1].recv(nocopyMsg, size, warmUp);
   }
 
   void freeBuffer(){
@@ -78,7 +91,7 @@ public:
     }
   }
 
-  void recv(char* msg, int size)
+  void recv(char* msg, int size, bool warmUp)
   {
     if(thisIndex==0) {
       niter++;
@@ -87,16 +100,16 @@ public:
         reg_time = 1.0e6*(end_time-start_time)/iterations;
         niter = 0;
         start_time = CkWallTimer();
-        thisProxy[1].recv_zerocopy(CkSendBuffer(nocopyMsg, CK_BUFFER_PREREG), size);
+        thisProxy[1].recv_zerocopy(CkSendBuffer(nocopyMsg, CK_BUFFER_PREREG), size, warmUp);
       } else {
-        thisProxy[1].recv(nocopyMsg, size);
+        thisProxy[1].recv(nocopyMsg, size, warmUp);
       }
     } else {
-      thisProxy[0].recv(nocopyMsg, size);
+      thisProxy[0].recv(nocopyMsg, size, warmUp);
     }
   }
 
-  void recv_zerocopy(char* msg, int size)
+  void recv_zerocopy(char* msg, int size, bool warmUp)
   {
     if(thisIndex==0) {
       niter++;
@@ -110,10 +123,10 @@ public:
         niter=0;
         mainProxy.maindone();
       } else {
-        thisProxy[1].recv_zerocopy(CkSendBuffer(nocopyMsg, CK_BUFFER_PREREG), size);
+        thisProxy[1].recv_zerocopy(CkSendBuffer(nocopyMsg, CK_BUFFER_PREREG), size, warmUp);
       }
     } else {
-      thisProxy[0].recv_zerocopy(CkSendBuffer(nocopyMsg, CK_BUFFER_PREREG), size);
+      thisProxy[0].recv_zerocopy(CkSendBuffer(nocopyMsg, CK_BUFFER_PREREG), size, warmUp);
     }
   }
 };
index caec1802835c6ba444a3f3eb793a31888c2a3ef8..1a1a5894a2beaadc65f767fb1dbafbb9e6e2bac9 100644 (file)
@@ -1,14 +1,20 @@
 mainmodule pingpong {
+
   readonly CProxy_main mainProxy;
+  readonly int minSize;
+  readonly int maxSize;
+  readonly int smallIter;
+  readonly int bigIter;
+
   mainchare main {
     entry main(CkArgMsg *m);
     entry void maindone(void);
   };
   array [1D] Ping1 {
     entry Ping1();
-    entry void start(int size);
+    entry void start(int size, bool warmUp);
     entry void freeBuffer();
-    entry void recv(char msg[size], int size);
-    entry void recv_zerocopy(nocopy char msg[size], int size);
+    entry void recv(char msg[size], int size, bool warmUp);
+    entry void recv_zerocopy(nocopy char msg[size], int size, bool warmUp);
   };
 };
index 99ad14f49d3beb89a58adde6c14cf2af40c23027..75ec3e603013d4dbb2d12b73ad1fad3b92283f66 100644 (file)
@@ -16,10 +16,12 @@ pingpong.o: pingpong.C cifiles
        $(CHARMC) -c pingpong.C
 
 test: all
-       @echo "Intra-processor Pingpong.."
-       $(call run, ./pgm +p1 )
-       @echo "Inter-processor Pingpong.."
-       $(call run, ./pgm +p2 )
+       $(call run, +p1 ./pgm 1024 8192 2 1)
+       $(call run, +p2 ./pgm 1024 8192 2 1)
+
+test-bench: all
+       $(call run, ./pgm +p1)
+       $(call run, ./pgm +p2)
 
 clean:
        rm -f *.decl.h *.def.h conv-host *.o pgm charmrun cifiles
index b90e06536e8570b5cf75e8036a9d00eea317648b..59b65ba5c7c669593be8aa3467d3bd4045038ea9 100644 (file)
@@ -1,11 +1,7 @@
 #include "pingpong.decl.h"
 
-#define BIG_ITER 10
-#define SMALL_ITER 100
-
-#define MAX_PAYLOAD 1 << 12
-
 CProxy_main mainProxy;
+int minSize, maxSize, smallIter, bigIter;
 
 #define P1 0
 #define P2 1%CkNumPes()
@@ -14,6 +10,7 @@ class main : public CBase_main
 {
   CProxy_Ping1 arr1;
   int size;
+  bool warmUp;
 public:
   main(CkMigrateMessage *m) {}
   main(CkArgMsg *m)
@@ -21,21 +18,37 @@ public:
     if(CkNumPes()>2) {
       CkAbort("Run this program on 1 or 2 processors only.\n");
     }
+    if(m->argc == 5) {
+      minSize = atoi(m->argv[1])/2; // Start with a smaller size to run a warm up phase
+      maxSize = atoi(m->argv[2]);
+      smallIter = atoi(m->argv[3]);
+      bigIter = atoi(m->argv[4]);
+    } else if(m->argc == 1) {
+      // use defaults
+      minSize = 512; // Start with a smaller size to run a warm up phase before starting message size at 1024 bytes
+      maxSize = 1 << 25;
+      smallIter = 1000;
+      bigIter = 100;
+    } else {
+      CkPrintf("Usage: ./pingpong <min size> <max size> <small message iter> <big message iter>\n");
+      CkExit(1);
+    }
     delete m;
-    size = 1024;
+    size = minSize;
     mainProxy = thisProxy;
+    warmUp = true;
     CkPrintf("Size (bytes) \t\tIterations\t\tRegular API (one-way us)\tZero Copy API (one-way us)\n");
     arr1 = CProxy_Ping1::ckNew(2);
     CkStartQD(CkCallback(CkIndex_main::maindone(), mainProxy));
   };
 
   void maindone(void){
-    if(size < MAX_PAYLOAD){
-      arr1[0].start(size);
+    if(size <= maxSize) {
+      arr1[0].start(size, warmUp);
+      warmUp = false;
       size = size << 1;
-    }
-    else if(size == MAX_PAYLOAD){
-      arr1[0].freeBuffer();
+    } else {
+        arr1[0].freeBuffer();
     }
   };
 };
@@ -52,20 +65,20 @@ class Ping1 : public CBase_Ping1
 public:
   Ping1()
   {
-    nocopyMsg = new char[MAX_PAYLOAD];
+    nocopyMsg = new char[maxSize];
     niter = 0;
   }
   Ping1(CkMigrateMessage *m) {}
 
-  void start(int size)
+  void start(int size, bool warmUp)
   {
     niter = 0;
     if(size >= 1 << 20)
-      iterations = SMALL_ITER;
+      iterations = bigIter;
     else
-      iterations = BIG_ITER;
+      iterations = smallIter;
     start_time = CkWallTimer();
-    thisProxy[1].recv(nocopyMsg, size);
+    thisProxy[1].recv(nocopyMsg, size, warmUp);
   }
 
   void freeBuffer(){
@@ -78,7 +91,7 @@ public:
     }
   }
 
-  void recv(char* msg, int size)
+  void recv(char* msg, int size, bool warmUp)
   {
     if(thisIndex==0) {
       niter++;
@@ -87,33 +100,35 @@ public:
         reg_time = 1.0e6*(end_time-start_time)/iterations;
         niter = 0;
         start_time = CkWallTimer();
-        thisProxy[1].recv_zerocopy(CkSendBuffer(nocopyMsg), size);
+        thisProxy[1].recv_zerocopy(CkSendBuffer(nocopyMsg), size, warmUp);
       } else {
-        thisProxy[1].recv(nocopyMsg, size);
+        thisProxy[1].recv(nocopyMsg, size, warmUp);
       }
     } else {
-      thisProxy[0].recv(nocopyMsg, size);
+      thisProxy[0].recv(nocopyMsg, size, warmUp);
     }
   }
 
-  void recv_zerocopy(char* msg, int size)
+  void recv_zerocopy(char* msg, int size, bool warmUp)
   {
     if(thisIndex==0) {
       niter++;
       if(niter==iterations) {
         end_time = CkWallTimer();
         zerocpy_time = 1.0e6*(end_time-start_time)/iterations;
-        if(size < 1 << 24)
-          CkPrintf("%d\t\t\t%d\t\t\t%lf\t\t\t%lf\n", size, iterations, reg_time/2, zerocpy_time/2);
-        else //using different print format for larger numbers for aligned output
-          CkPrintf("%d\t\t%d\t\t\t%lf\t\t\t%lf\n", size, iterations, reg_time/2, zerocpy_time/2);
+        if(warmUp == false) {
+          if(size < 1 << 24)
+            CkPrintf("%d\t\t\t%d\t\t\t%lf\t\t\t%lf\n", size, iterations, reg_time/2, zerocpy_time/2);
+          else //using different print format for larger numbers for aligned output
+            CkPrintf("%d\t\t%d\t\t\t%lf\t\t\t%lf\n", size, iterations, reg_time/2, zerocpy_time/2);
+        }
         niter=0;
         mainProxy.maindone();
       } else {
-        thisProxy[1].recv_zerocopy(CkSendBuffer(nocopyMsg), size);
+        thisProxy[1].recv_zerocopy(CkSendBuffer(nocopyMsg), size, warmUp);
       }
     } else {
-      thisProxy[0].recv_zerocopy(CkSendBuffer(nocopyMsg), size);
+      thisProxy[0].recv_zerocopy(CkSendBuffer(nocopyMsg), size, warmUp);
     }
   }
 };
index caec1802835c6ba444a3f3eb793a31888c2a3ef8..1a1a5894a2beaadc65f767fb1dbafbb9e6e2bac9 100644 (file)
@@ -1,14 +1,20 @@
 mainmodule pingpong {
+
   readonly CProxy_main mainProxy;
+  readonly int minSize;
+  readonly int maxSize;
+  readonly int smallIter;
+  readonly int bigIter;
+
   mainchare main {
     entry main(CkArgMsg *m);
     entry void maindone(void);
   };
   array [1D] Ping1 {
     entry Ping1();
-    entry void start(int size);
+    entry void start(int size, bool warmUp);
     entry void freeBuffer();
-    entry void recv(char msg[size], int size);
-    entry void recv_zerocopy(nocopy char msg[size], int size);
+    entry void recv(char msg[size], int size, bool warmUp);
+    entry void recv_zerocopy(nocopy char msg[size], int size, bool warmUp);
   };
 };
index 99ad14f49d3beb89a58adde6c14cf2af40c23027..75ec3e603013d4dbb2d12b73ad1fad3b92283f66 100644 (file)
@@ -16,10 +16,12 @@ pingpong.o: pingpong.C cifiles
        $(CHARMC) -c pingpong.C
 
 test: all
-       @echo "Intra-processor Pingpong.."
-       $(call run, ./pgm +p1 )
-       @echo "Inter-processor Pingpong.."
-       $(call run, ./pgm +p2 )
+       $(call run, +p1 ./pgm 1024 8192 2 1)
+       $(call run, +p2 ./pgm 1024 8192 2 1)
+
+test-bench: all
+       $(call run, ./pgm +p1)
+       $(call run, ./pgm +p2)
 
 clean:
        rm -f *.decl.h *.def.h conv-host *.o pgm charmrun cifiles
index 14c2b41e7dfb1a9f02b2ce8222bcbd0f653de4db..024960cc57245b537ddc61586ed2f85cf43581c4 100644 (file)
@@ -1,11 +1,7 @@
 #include "pingpong.decl.h"
 
-#define BIG_ITER 10
-#define SMALL_ITER 100
-
-#define MAX_PAYLOAD 1 << 12
-
 CProxy_main mainProxy;
+int minSize, maxSize, smallIter, bigIter;
 
 #define P1 0
 #define P2 1%CkNumPes()
@@ -14,6 +10,7 @@ class main : public CBase_main
 {
   CProxy_Ping1 arr1;
   int size;
+  bool warmUp;
 public:
   main(CkMigrateMessage *m) {}
   main(CkArgMsg *m)
@@ -21,21 +18,37 @@ public:
     if(CkNumPes()>2) {
       CkAbort("Run this program on 1 or 2 processors only.\n");
     }
+    if(m->argc == 5) {
+      minSize = atoi(m->argv[1])/2; // Start with a smaller size to run a warm up phase
+      maxSize = atoi(m->argv[2]);
+      smallIter = atoi(m->argv[3]);
+      bigIter = atoi(m->argv[4]);
+    } else if(m->argc == 1) {
+      // use defaults
+      minSize = 512; // Start with a smaller size to run a warm up phase before starting message size at 1024 bytes
+      maxSize = 1 << 25;
+      smallIter = 1000;
+      bigIter = 100;
+    } else {
+      CkPrintf("Usage: ./pingpong <min size> <max size> <small message iter> <big message iter>\n");
+      CkExit(1);
+    }
     delete m;
-    size = 1024;
+    size = minSize;
     mainProxy = thisProxy;
+    warmUp = true;
     CkPrintf("Size (bytes) \t\tIterations\t\tRegular API (one-way us)\tZero Copy API (one-way us)\n");
     arr1 = CProxy_Ping1::ckNew(2);
     CkStartQD(CkCallback(CkIndex_main::maindone(), mainProxy));
   };
 
   void maindone(void){
-    if(size < MAX_PAYLOAD){
-      arr1[0].start(size);
+    if(size <= maxSize) {
+      arr1[0].start(size, warmUp);
+      warmUp = false;
       size = size << 1;
-    }
-    else if(size == MAX_PAYLOAD){
-      arr1[0].freeBuffer();
+    } else {
+        arr1[0].freeBuffer();
     }
   };
 };
@@ -52,20 +65,20 @@ class Ping1 : public CBase_Ping1
 public:
   Ping1()
   {
-    nocopyMsg = new char[MAX_PAYLOAD];
+    nocopyMsg = new char[maxSize];
     niter = 0;
   }
   Ping1(CkMigrateMessage *m) {}
 
-  void start(int size)
+  void start(int size, bool warmUp)
   {
     niter = 0;
     if(size >= 1 << 20)
-      iterations = SMALL_ITER;
+      iterations = bigIter;
     else
-      iterations = BIG_ITER;
+      iterations = smallIter;
     start_time = CkWallTimer();
-    thisProxy[1].recv(nocopyMsg, size);
+    thisProxy[1].recv(nocopyMsg, size, warmUp);
   }
 
   void freeBuffer(){
@@ -78,7 +91,7 @@ public:
     }
   }
 
-  void recv(char* msg, int size)
+  void recv(char* msg, int size, bool warmUp)
   {
     if(thisIndex==0) {
       niter++;
@@ -87,33 +100,35 @@ public:
         reg_time = 1.0e6*(end_time-start_time)/iterations;
         niter = 0;
         start_time = CkWallTimer();
-        thisProxy[1].recv_zerocopy(CkSendBuffer(nocopyMsg, CK_BUFFER_UNREG), size);
+        thisProxy[1].recv_zerocopy(CkSendBuffer(nocopyMsg, CK_BUFFER_UNREG), size, warmUp);
       } else {
-        thisProxy[1].recv(nocopyMsg, size);
+        thisProxy[1].recv(nocopyMsg, size, warmUp);
       }
     } else {
-      thisProxy[0].recv(nocopyMsg, size);
+      thisProxy[0].recv(nocopyMsg, size, warmUp);
     }
   }
 
-  void recv_zerocopy(char* msg, int size)
+  void recv_zerocopy(char* msg, int size, bool warmUp)
   {
     if(thisIndex==0) {
       niter++;
       if(niter==iterations) {
         end_time = CkWallTimer();
         zerocpy_time = 1.0e6*(end_time-start_time)/iterations;
-        if(size < 1 << 24)
-          CkPrintf("%d\t\t\t%d\t\t\t%lf\t\t\t%lf\n", size, iterations, reg_time/2, zerocpy_time/2);
-        else //using different print format for larger numbers for aligned output
-          CkPrintf("%d\t\t%d\t\t\t%lf\t\t\t%lf\n", size, iterations, reg_time/2, zerocpy_time/2);
+        if(warmUp == false) {
+          if(size < 1 << 24)
+            CkPrintf("%d\t\t\t%d\t\t\t%lf\t\t\t%lf\n", size, iterations, reg_time/2, zerocpy_time/2);
+          else //using different print format for larger numbers for aligned output
+            CkPrintf("%d\t\t%d\t\t\t%lf\t\t\t%lf\n", size, iterations, reg_time/2, zerocpy_time/2);
+        }
         niter=0;
         mainProxy.maindone();
       } else {
-        thisProxy[1].recv_zerocopy(CkSendBuffer(nocopyMsg, CK_BUFFER_UNREG), size);
+        thisProxy[1].recv_zerocopy(CkSendBuffer(nocopyMsg, CK_BUFFER_UNREG), size, warmUp);
       }
     } else {
-      thisProxy[0].recv_zerocopy(CkSendBuffer(nocopyMsg, CK_BUFFER_UNREG), size);
+      thisProxy[0].recv_zerocopy(CkSendBuffer(nocopyMsg, CK_BUFFER_UNREG), size, warmUp);
     }
   }
 };
index caec1802835c6ba444a3f3eb793a31888c2a3ef8..69684521ad9621778b5c0d117b255d58608ba71b 100644 (file)
@@ -1,14 +1,21 @@
 mainmodule pingpong {
+
   readonly CProxy_main mainProxy;
+  readonly int minSize;
+  readonly int maxSize;
+  readonly int smallIter;
+  readonly int bigIter;
+
   mainchare main {
     entry main(CkArgMsg *m);
     entry void maindone(void);
   };
+
   array [1D] Ping1 {
     entry Ping1();
-    entry void start(int size);
+    entry void start(int size, bool warmUp);
     entry void freeBuffer();
-    entry void recv(char msg[size], int size);
-    entry void recv_zerocopy(nocopy char msg[size], int size);
+    entry void recv(char msg[size], int size, bool warmUp);
+    entry void recv_zerocopy(nocopy char msg[size], int size, bool warmUp);
   };
 };