Zcpy Bcast Sender-side API: Add a ping_all benchmark 00/4900/9
authorNitin Bhat <nbhat4@illinois.edu>
Wed, 16 Jan 2019 16:55:19 +0000 (11:55 -0500)
committerEvan Ramos <evan@hpccharm.com>
Wed, 10 Apr 2019 18:05:32 +0000 (13:05 -0500)
Change-Id: I66d9fe9a4326adc013cfa38340e7aae5d43102fe

examples/charm++/zerocopy/entry_method_bcast_api/reg/Makefile
examples/charm++/zerocopy/entry_method_bcast_api/reg/ping_all/Makefile [new file with mode: 0644]
examples/charm++/zerocopy/entry_method_bcast_api/reg/ping_all/ping_all.C [new file with mode: 0644]
examples/charm++/zerocopy/entry_method_bcast_api/reg/ping_all/ping_all.ci [new file with mode: 0644]

index f0471d3451bcdc405a2a8f0747a22833bde8a819..619e79602212d05fb68b73aebec35c5b8b11e368 100644 (file)
@@ -1,5 +1,6 @@
 DIRS = \
   simpleBcast \
+  ping_all \
 
 TESTDIRS = $(DIRS)
 
diff --git a/examples/charm++/zerocopy/entry_method_bcast_api/reg/ping_all/Makefile b/examples/charm++/zerocopy/entry_method_bcast_api/reg/ping_all/Makefile
new file mode 100644 (file)
index 0000000..942d528
--- /dev/null
@@ -0,0 +1,20 @@
+-include ../../../../../common.mk
+CHARMC=../../../../../../bin/charmc $(OPTS)
+
+all: ping_all
+
+ping_all:  ping_all.o
+       $(CHARMC) ping_all.o -o ping_all -language charm++ -module CommonLBs
+
+cifiles: ping_all.ci
+       $(CHARMC) -c ping_all.ci
+       touch cifiles
+
+ping_all.o : ping_all.C cifiles
+       $(CHARMC) -c ping_all.C
+
+test: all
+       $(call run, +p4 ./ping_all)
+
+clean:
+       rm -f *.def.h *.decl.h *.o *~ *.exe cifiles charmrun ping_all
diff --git a/examples/charm++/zerocopy/entry_method_bcast_api/reg/ping_all/ping_all.C b/examples/charm++/zerocopy/entry_method_bcast_api/reg/ping_all/ping_all.C
new file mode 100644 (file)
index 0000000..21e81c5
--- /dev/null
@@ -0,0 +1,156 @@
+#include <string.h> // for strlen, and strcmp
+#include <charm++.h>
+
+#include "ping_all.decl.h"
+
+CProxy_main mainProxy;
+int iterations;
+size_t minSize, maxSize, smallIter, bigIter;
+
+#define DEBUG(x) //x
+
+class main : public CBase_main
+{
+  int niter, counter;
+  char *buffer;
+  CProxy_LargeDataNodeGroup ngid;
+  double start_time, end_time, reg_time, zcpy_time;
+  CkCallback cb;
+  size_t size;
+  bool warmUp;
+
+public:
+  main(CkMigrateMessage *m) {}
+  main(CkArgMsg* m)
+  {
+    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 << 13;
+      smallIter = 10;
+      bigIter = 100;
+    } else {
+      CkPrintf("Usage: ./ping_all <min size> <max size> <small message iter> <big message iter>\n");
+      CkExit(1);
+    }
+    delete m;
+    // Initialize
+    size = minSize;
+    niter = 0;
+    counter = 0;
+    mainProxy = thisProxy;
+    warmUp = true;
+    iterations = smallIter;
+
+    // Allocate a buffer to send
+    buffer = new char[maxSize];
+
+    // Create a nodegroup
+    ngid = CProxy_LargeDataNodeGroup::ckNew();
+
+    // Create a callback method to pass in the Zerocopy Bcast API call
+    int idx_zerocopySent = CkIndex_main::zerocopySent(NULL);
+    cb = CkCallback(idx_zerocopySent, thisProxy);
+
+    CkPrintf("Size (bytes) \t\tIterations\t\tRegular Bcast API (one-way us)\tZero Copy Bcast Send API (one-way us)\t\n");
+    CkStartQD(CkCallback(CkIndex_main::start(), mainProxy));
+  }
+
+  void start() {
+    if(size < minSize) {
+      // warmUp phase
+      start_time = CkWallTimer();
+      ngid.recv(buffer, size, niter, warmUp, iterations);
+    } else if(size <= maxSize) {
+      // regular experiment phase
+      start_time = CkWallTimer();
+      ngid.recv(buffer, size, niter, warmUp, iterations);
+    } else {
+      // completion phase
+      done();
+    }
+  }
+
+  // Invoked on main after a reduction by all the nodegroup elements
+  void regular_bcast_done() {
+    niter++; // An iteration of the Regular Bcast API is complete
+    if(niter == iterations) {
+      end_time = CkWallTimer();
+      reg_time = 1.0e6*(end_time - start_time)/iterations;
+      niter = 0;
+      start_time = CkWallTimer();
+      ngid.recv_zerocopy(CkSendBuffer(buffer, cb), size, niter, warmUp, iterations);
+    } else {
+      ngid.recv(buffer, size, niter, warmUp, iterations);
+    }
+  }
+
+  void zerocopySent(CkDataMsg *msg) {
+    zc_bcast_done();
+  }
+
+  void zc_bcast_done() {
+    counter++;
+    if(counter == 2) {
+      counter = 0;
+      niter++; // An iteration of the Zerocopy Bcast API is complete
+      if(niter == iterations) {
+        end_time = CkWallTimer();
+        zcpy_time = 1.0e6*(end_time - start_time)/iterations;
+        niter = 0;
+        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, zcpy_time);
+            else
+              CkPrintf("%d\t\t%d\t\t\t%lf\t\t\t%lf\n", size, iterations, reg_time, zcpy_time);
+        }
+        size = size << 1;
+        if(warmUp)
+          done();
+        else
+          mainProxy.start();
+      } else {
+        ngid.recv_zerocopy(CkSendBuffer(buffer, cb), size, niter, warmUp, iterations);
+      }
+    }
+  }
+
+  void done() {
+    if(warmUp) {
+      // warmUp phase complete
+      warmUp = false;
+      mainProxy.start();
+    } else {
+      // experiment complete
+      CkExit();
+    }
+  }
+};
+
+
+class LargeDataNodeGroup : public CBase_LargeDataNodeGroup
+{
+  CkCallback regCb, zcCb;
+
+public:
+  LargeDataNodeGroup() {
+    regCb = CkCallback(CkReductionTarget(main, regular_bcast_done), mainProxy);
+    zcCb = CkCallback(CkReductionTarget(main, zc_bcast_done), mainProxy);
+  }
+
+  void recv(char *msg, size_t size, int iter, bool warmUp, int iterations) {
+    contribute(regCb); // Nodegroup reduction to signal completion to the main chare
+  }
+
+  void recv_zerocopy(char *msg, size_t size, int iter, bool warmUp, int iterations) {
+    contribute(zcCb);
+  }
+};
+
+
+#include "ping_all.def.h"
diff --git a/examples/charm++/zerocopy/entry_method_bcast_api/reg/ping_all/ping_all.ci b/examples/charm++/zerocopy/entry_method_bcast_api/reg/ping_all/ping_all.ci
new file mode 100644 (file)
index 0000000..de4b6cf
--- /dev/null
@@ -0,0 +1,26 @@
+mainmodule ping_all
+{
+  readonly CProxy_main mainProxy;
+  readonly size_t maxSize;
+
+  mainchare main
+  {
+    entry main(CkArgMsg *);
+    entry void start();
+    entry [reductiontarget] void regular_bcast_done();
+    entry void zerocopySent(CkDataMsg *msg);
+    entry [reductiontarget] void zc_bcast_done();
+    entry void done();
+  }
+
+  nodegroup LargeDataNodeGroup
+  {
+    entry LargeDataNodeGroup();
+
+    // regular message send api
+    entry [exclusive] void recv(char msg[size], size_t size, int iter, bool warmUp, int iterations);
+
+    // charm++ zero copy message send api for parameters marked "nocopy"
+    entry [exclusive] void recv_zerocopy(nocopy char msg[size], size_t size, int iter, bool warmUp, int iterations);
+  }
+}