Update the test program for entry method templates
authorRamprasad Venkataraman <ramv@illinois.edu>
Mon, 2 Apr 2012 17:09:57 +0000 (12:09 -0500)
committerPhil Miller <mille121@illinois.edu>
Thu, 5 Apr 2012 21:17:55 +0000 (16:17 -0500)
tests/charm++/method_templates/mylib.ci
tests/charm++/method_templates/mylib.h
tests/charm++/method_templates/pgm.C
tests/charm++/method_templates/utils.h [new file with mode: 0644]

index 88fecf489ea1dba3312a93dc00507cb137ddd823..b0d164e3c14df5edec5a4ea7f0f415b4a90019fb 100644 (file)
@@ -1,9 +1,9 @@
 module mylib {
   readonly int moduleRo;
     array [1D] libArray {
-        entry libArray();
+        entry libArray(int _dataSize);
         template <typename T>
-        entry [reductiontarget] void doSomething(T t);
+        entry void doSomething(T t);
     };
 };
 
index bfce78f189c70f4c2b554bd6460d2ac1abf412d7..1276dfcf2a0381629a5bef42286c19b9a2e90827 100644 (file)
@@ -9,17 +9,24 @@ extern int moduleRo;
 class libArray: public CBase_libArray
 {
     public:
-        libArray() {}
+        libArray(int _arrSize): arrSize(_arrSize), myData(NULL)
+        {
+            myData = new int[arrSize];
+            for (int i = 0; i < arrSize; i++)
+                myData[i] = thisIndex * arrSize + i;
+        }
+
         libArray(CkMigrateMessage *msg) {}
 
-        // Allows client to visit and operate on library-owned data
-        // @note: Clients should supply type that provides void operator() (int) and an ostream inserter
+        // @note: Clients should supply type T that provides:
+        // void operator() (int *begin, int*end)
+        // ostream& operator<< (ostream& out, const T& obj)
+        /// Allows client to visit and operate on library-owned data
         template <typename T>
         void doSomething(T t)
         {
             // Apply client specified operation to my chunk of data
-            for (int i = thisIndex*10; i< (thisIndex+1)*10; i++)
-                t(i);
+            t(myData, myData + arrSize);
             // Do something with the result
             std::ostringstream out;
             out << "\nlibArray[" << thisIndex << "] " << t;
@@ -27,6 +34,10 @@ class libArray: public CBase_libArray
             // Notify completion
             contribute();
         }
+
+    private:
+        int arrSize;
+        int *myData;
 };
 
 #endif // MYLIB_H
index bec2ea7b7a161eac902366b52d552cb409444616..b330ae8c300a1391c2edbd3a469bbac924fdb57d 100644 (file)
@@ -3,42 +3,11 @@
 #define CK_TEMPLATES_ONLY
 #include "mylib.def.h"
 #undef CK_TEMPLATES_ONLY
+
+#include "utils.h"
 #include <iostream>
 #include <functional>
-
-// Utility functors
-template <typename cmp>
-class count {
-    private:
-        int threshold, num;
-        cmp c;
-    public:
-        count(const int _t=0): threshold(_t), num(0) {}
-        inline void operator() (int i) { if (c(i, threshold)) num++; }
-        void pup(PUP::er &p) { p | threshold; p | num; }
-        friend std::ostream& operator<< (std::ostream& out, const count& obj) {
-            out << "threshold = "<< obj.threshold << "; "
-                << "num = " << obj.num;
-            return out;
-        }
-};
-
-
-class avg {
-    private:
-        int sum, num;
-    public:
-        avg(): sum(0), num(0) {}
-        inline void operator() (int i) { sum += i; num++; }
-        void pup(PUP::er &p) { p | sum; p | num; }
-        friend std::ostream& operator<< (std::ostream& out, const avg& obj) {
-            out << "num = " << obj.num << "; "
-                << "sum = " << obj.sum << "; "
-                << "avg = " << ( obj.num ? (double)obj.sum/obj.num : obj.sum );
-            return out;
-        }
-};
-
+#include <iterator>
 
 // Temporary initproc to register the instantiated EPs
 void register_instantiations()
@@ -54,22 +23,23 @@ void register_instantiations()
 class pgm : public CBase_pgm
 {
     public:
-        pgm(CkArgMsg *m): nElements(CkNumPes()), nDone(0)
+        pgm(CkArgMsg *m): nElements(2 * CkNumPes()), nDone(0)
         {
-            arrProxy = CProxy_libArray::ckNew(nElements);
+            // Create the library chare array and configure a reduction client
+            arrProxy = CProxy_libArray::ckNew(1000, nElements);
             arrProxy.ckSetReductionClient( new CkCallback(CkIndex_pgm::endTest(), thisProxy) );
             thisProxy.startTest();
             delete m;
         }
         
         void startTest() {
-            //count< std::less<int> > cnt(5);
+            // Run the tests
             arrProxy.doSomething( count< std::less<int> >(5) );
             arrProxy.doSomething(avg());
         }
 
         void endTest() {
-            if (++nDone == 2)
+            if (++nDone == 1)
                 CkExit();
         }
 
diff --git a/tests/charm++/method_templates/utils.h b/tests/charm++/method_templates/utils.h
new file mode 100644 (file)
index 0000000..3bc3d6b
--- /dev/null
@@ -0,0 +1,56 @@
+#ifndef UTILS_H
+#define UTILS_H
+
+// A pup-friendly functor identical to return value of std::bind2nd(cmp(), threshold)
+template <typename cmp>
+class count {
+    private:
+        int threshold, num;
+        cmp c;
+    public:
+        //
+        count(const int _t=0): threshold(_t), num(0) {}
+        // Operate on an input element
+        inline void operator() (int* first, int *last)
+        {
+            for (int *ptr = first; ptr != last; ptr++)
+                if (c(*ptr, threshold)) num++;
+        }
+        // Serialize the internals
+        void pup(PUP::er &p) { p | threshold; p | num; }
+        // Spit results to ostream
+        friend std::ostream& operator<< (std::ostream& out, const count& obj) {
+            out << "threshold = "<< obj.threshold << "; "
+                << "num = " << obj.num;
+            return out;
+        }
+};
+
+
+// Functor that computes the sum and avg of a sequence of integers
+class avg {
+    private:
+        int sum, num;
+    public:
+        avg(): sum(0), num(0) {}
+        // Operate on an input element
+        inline void operator() (int* first, int *last)
+        {
+            num += std::distance(first, last);
+            for (int *ptr = first; ptr != last; ptr++)
+                sum += *ptr;
+        }
+        // Serialize the internals
+        void pup(PUP::er &p) { p | sum; p | num; }
+        // Spit results to ostream
+        friend std::ostream& operator<< (std::ostream& out, const avg& obj) {
+            out << "num = " << obj.num << "; "
+                << "sum = " << obj.sum << "; "
+                << "avg = " << ( obj.num ? (double)obj.sum/obj.num : obj.sum );
+            return out;
+        }
+};
+
+
+
+#endif // UTILS_H