Zcpy Bcast Sender-side API: Add examples for each registration mode
[charm.git] / examples / charm++ / zerocopy / entry_method_bcast_api / reg / simpleBcast / simpleBcast.C
1 #include "simpleBcast.decl.h"
2
3 #define DEBUG(x) //x
4
5 CProxy_Main mainProxy;
6
7 template<class T>
8 void assignValues(T *&arr, int size){
9   for(int i=0; i<size; i++)
10      arr[i] = i;
11 }
12
13 template<class T>
14 void checkArrValues(T *&arr, int size){
15   for(int i=0; i<size; i++)
16      CkAssert(arr[i] == i);
17 }
18
19 class Main : public CBase_Main{
20   int size;
21   int counter;
22   public:
23   Main(CkArgMsg *m) {
24     // Create an array of size received in arguments
25     if(m->argc > 2) {
26       // print error message
27       CkAbort("Usage: ./simpleBcast <array-size>");
28     } else if(m->argc == 2 ) {
29       size = atoi(m->argv[1]);
30     } else {
31       size = CkNumPes() * 10; // default with 10 chare array elements per pe
32     }
33
34     delete m;
35
36     counter = 0;
37     mainProxy = thisProxy;
38
39     // Create a chare array
40     CProxy_zcArray arrProxy = CProxy_zcArray::ckNew(size);
41
42     // Create a group
43     CProxy_zcGroup grpProxy = CProxy_zcGroup::ckNew();
44
45     // Create a nodegroup
46     CProxy_zcNodegroup ngrpProxy = CProxy_zcNodegroup::ckNew();
47
48     // allocate a large array
49     int bufferSize = 2000000;
50     int *buffer = new int[bufferSize];
51     assignValues(buffer, bufferSize);
52
53     // create a callback method
54     int idx_zerocopySent = CkIndex_Main::zerocopySent(NULL);
55     CkCallback cb = CkCallback(idx_zerocopySent, thisProxy);
56
57     CkCallback doneCb = CkCallback(CkReductionTarget(Main, done), thisProxy);
58
59     // invoking bcast on chare array
60     arrProxy.recvLargeArray(CkSendBuffer(buffer, cb), bufferSize, doneCb);
61
62     // invoking bcast on group
63     grpProxy.recvLargeArray(CkSendBuffer(buffer, cb), bufferSize, doneCb);
64
65     // invoking bcast on nodegroup
66     ngrpProxy.recvLargeArray(CkSendBuffer(buffer, cb), bufferSize, doneCb);
67   }
68
69   void zerocopySent(CkDataMsg *m) {
70     CkPrintf("[%d][%d][%d] Source callback invoked\n", CkMyPe(), CkMyNode(), CmiMyRank());
71     done();
72     delete m;
73   }
74
75   void done() {
76     // Wait for 3 reductions to complete: Chare Array, Group, Nodegroup and
77     // 3 more calls from zerocopySent callback method on completion of sending the buffer
78     if(++counter == 6) {
79       CkPrintf("[%d][%d][%d] All operations completed\n", CkMyPe(), CkMyNode(), CmiMyRank());
80       CkExit();
81     }
82   }
83 };
84
85 class zcArray : public CBase_zcArray {
86   public:
87   zcArray() {}
88
89   void recvLargeArray(int *ptr1, int n1, CkCallback doneCb) {
90     DEBUG(CkPrintf("[%d][%d] APP Chare array element received large array %p\n", thisIndex, CkMyPe(), ptr1);)
91     checkArrValues(ptr1, n1);
92
93     contribute(doneCb);
94   }
95 };
96
97 class zcGroup : public CBase_zcGroup {
98   public:
99   zcGroup() {}
100
101   void recvLargeArray(int *ptr1, int n1, CkCallback doneCb) {
102     DEBUG(CkPrintf("[%d][%d] APP Group element received large array %p\n", thisIndex, CkMyPe(), ptr1);)
103     checkArrValues(ptr1, n1);
104
105     contribute(doneCb);
106   }
107 };
108
109 class zcNodegroup : public CBase_zcNodegroup {
110   public:
111   zcNodegroup() {}
112
113   void recvLargeArray(int *ptr1, int n1, CkCallback doneCb) {
114     DEBUG(CkPrintf("[%d][%d] APP Nodegroup element received large array %p\n", thisIndex, CkMyPe(), ptr1);)
115     checkArrValues(ptr1, n1);
116
117     contribute(doneCb);
118   }
119 };
120
121 #include "simpleBcast.def.h"