Zcpy Bcast Sender-side API: Add examples for each registration mode
[charm.git] / examples / charm++ / zerocopy / entry_method_bcast_api / unreg / 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     counter = 0;
35     mainProxy = thisProxy;
36
37     // Create a chare array
38     CProxy_zcArray arrProxy = CProxy_zcArray::ckNew(size);
39
40     // Create a group
41     CProxy_zcGroup grpProxy = CProxy_zcGroup::ckNew();
42
43     // Create a nodegroup
44     CProxy_zcNodegroup ngrpProxy = CProxy_zcNodegroup::ckNew();
45
46     // allocate a large array
47     int bufferSize = 2000000;
48     int *buffer = new int[bufferSize];
49     assignValues(buffer, bufferSize);
50
51     // create a callback method
52     int idx_zerocopySent = CkIndex_Main::zerocopySent(NULL);
53     CkCallback cb = CkCallback(idx_zerocopySent, thisProxy);
54
55     CkCallback doneCb = CkCallback(CkReductionTarget(Main, done), thisProxy);
56
57     // invoking bcast on chare array
58     arrProxy.recvLargeArray(CkSendBuffer(buffer, cb, CK_BUFFER_UNREG), bufferSize, doneCb);
59
60     // invoking bcast on group
61     grpProxy.recvLargeArray(CkSendBuffer(buffer, cb, CK_BUFFER_UNREG), bufferSize, doneCb);
62
63     // invoking bcast on nodegroup
64     ngrpProxy.recvLargeArray(CkSendBuffer(buffer, cb, CK_BUFFER_UNREG), bufferSize, doneCb);
65   }
66
67   void zerocopySent(CkDataMsg *m) {
68     CkPrintf("[%d][%d][%d] Source callback invoked\n", CkMyPe(), CkMyNode(), CmiMyRank());
69     done();
70   }
71
72   void done() {
73     // Wait for 3 reductions to complete: Chare Array, Group, Nodegroup and
74     // 3 more calls from zerocopySent callback method on completion of sending the buffer
75     if(++counter == 6) {
76       CkPrintf("[%d][%d][%d] All operations completed\n", CkMyPe(), CkMyNode(), CmiMyRank());
77       CkExit();
78     }
79   }
80 };
81
82 class zcArray : public CBase_zcArray {
83   public:
84   zcArray() {}
85
86   void recvLargeArray(int *ptr1, int n1, CkCallback doneCb) {
87     DEBUG(CkPrintf("[%d][%d] APP Chare array element received large array %p\n", thisIndex, CkMyPe(), ptr1);)
88     checkArrValues(ptr1, n1);
89
90     contribute(doneCb);
91   }
92 };
93
94 class zcGroup : public CBase_zcGroup {
95   public:
96   zcGroup() {}
97
98   void recvLargeArray(int *ptr1, int n1, CkCallback doneCb) {
99     DEBUG(CkPrintf("[%d][%d] APP Group element received large array %p\n", thisIndex, CkMyPe(), ptr1);)
100     checkArrValues(ptr1, n1);
101
102     contribute(doneCb);
103   }
104 };
105
106 class zcNodegroup : public CBase_zcNodegroup {
107   public:
108   zcNodegroup() {}
109
110   void recvLargeArray(int *ptr1, int n1, CkCallback doneCb) {
111     DEBUG(CkPrintf("[%d][%d] APP Nodegroup element received large array %p\n", thisIndex, CkMyPe(), ptr1);)
112     checkArrValues(ptr1, n1);
113
114     contribute(doneCb);
115   }
116 };
117
118 #include "simpleBcast.def.h"