msgQ test: Now also reports performance of STL-based variant of msg Q
[charm.git] / tests / charm++ / queue / pgm.C
index ac6e5e422c0d1da35d387eab44b3a3177ca5a8a4..9ac2168aecc57cd5f6ecd1a050acdf8fbdab1edf 100644 (file)
@@ -1,12 +1,14 @@
 #include <iostream>
 #include <cstdlib>
 #include <cstdio>
+#include <vector>
 
 using std::cerr;
 using std::endl;
 using std::sprintf;
 
 #include "queueing.h"
+#include "msgq.h"
 #include "main.decl.h"
 
 #define CmiFree free
@@ -174,6 +176,81 @@ bool test_general_ififo()
   return result;
 }
 
+double timePerOp_general_ififo(int qBaseSize = 256)
+{
+  Queue q = CqsCreate();
+  int qBatchSize = 1<<4;
+  int numIters   = 1<<16;
+
+  std::vector<char> msgs(qBaseSize + qBatchSize);
+  std::vector<unsigned int> prios(qBaseSize + qBatchSize);
+
+  for (int i = 0; i < qBaseSize + qBatchSize; i++)
+      prios[i] = std::rand();
+
+  for (int i = 0; i < qBaseSize; i++)
+      CqsEnqueueGeneral(q, (void*)&msgs[i], CQS_QUEUEING_IFIFO, 8*sizeof(int), &prios[i]);
+
+  double startTime = CmiWallTimer();
+  for (int i = 0; i < numIters; i++)
+  {
+      for (int j = qBaseSize; j < qBaseSize+qBatchSize; j++)
+        CqsEnqueueGeneral(q, (void*)&msgs[j], CQS_QUEUEING_IFIFO, 8*sizeof(int), &prios[j]);
+      void *m;
+      for (int j = qBaseSize; j < qBaseSize+qBatchSize; j++)
+        CqsDequeue(q, &m);
+  }
+
+  CqsDelete(q);
+  return 1000000 * (CmiWallTimer() - startTime) / (numIters * qBatchSize * 2);
+}
+
+
+double timePerOp_stlQ(int qBaseSize = 256)
+{
+  msgQ<int> q;
+  int qBatchSize = 1<<4;
+  int numIters   = 1<<16;
+
+  std::vector<char> msgs(qBaseSize + qBatchSize);
+  std::vector<unsigned int> prios(qBaseSize + qBatchSize);
+
+  for (int i = 0; i < qBaseSize + qBatchSize; i++)
+      prios[i] = std::rand();
+
+  for (int i = 0; i < qBaseSize; i++)
+      q.enq((msg_t*)&msgs[i], prios[i]);
+
+  double startTime = CmiWallTimer();
+  for (int i = 0; i < numIters; i++)
+  {
+      for (int j = qBaseSize; j < qBaseSize+qBatchSize; j++)
+          q.enq((msg_t*)&msgs[j], prios[j]);
+      void *m;
+      for (int j = qBaseSize; j < qBaseSize+qBatchSize; j++)
+        q.deq();
+  }
+
+  return 1000000 * (CmiWallTimer() - startTime) / (numIters * qBatchSize * 2);
+}
+
+
+bool perftest_general_ififo()
+{
+  CkPrintf("Reporting time per enqueue / dequeue operation for charm's underlying mixed priority queue\n");
+  CkPrintf("\n  Q length     time/op(us)\n");
+  for (int i = 16; i <= 2048; i *= 2)
+    CkPrintf("%10d %15f\n", i, timePerOp_general_ififo(i));
+
+  printf("Reporting time per enqueue / dequeue operation for an STL version of the same Q functionality\n");
+  printf("\n  Q length     time/op(us)\n");
+  for (int i = 16; i <= 2048; i *= 2)
+    printf("%10d %15f\n", i, timePerOp_stlQ(i));
+
+  return true;
+}
+
+
 #if 0
 // Template for new harness-driven tests
 bool test_foo()
@@ -202,6 +279,7 @@ struct main : public CBase_main
     RUN_TEST(test_enumerate);
     RUN_TEST(test_general_fifo);
     RUN_TEST(test_general_ififo);
+    RUN_TEST(perftest_general_ififo);
 
     if (fail) {
       sprintf(message, "%d/%d tests failed\n", fail, tests);