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