1 #include "simple_direct.decl.h"
5 class main : public CBase_main
10 main(CkMigrateMessage *m) {}
14 CkPrintf("Run this program on 1 or 2 processors only.\n");
18 CkPrintf("Usage: ./simple_direct <array size>\n");
21 int size = atoi(m->argv[1]);
22 mainProxy = thisProxy;
24 arr1 = CProxy_Ping1::ckNew(size, 2);
32 CkPrintf("[%d][%d] Result validated! \n", CkMyPe(), CkMyNode());
39 void compareArray(T *&aArr, T *&bArr, int size){
40 for(int i=0; i<size; i++)
41 assert(aArr[i] == bArr[i]);
45 void assignValues(T *&arr, int size){
46 // Allocation through CkRdmaAlloc
47 arr = (T *)CkRdmaAlloc(size * sizeof(T));
48 for(int i=0; i<size; i++)
49 arr[i] = rand() % 100 + 1;
52 void assignCharValues(char *&arr, int size){
53 // Allocation through CkRdmaAlloc
54 arr = (char *)CkRdmaAlloc(size * sizeof(char));
55 for(int i=0; i<size; i++)
56 arr[i] = (char)(rand() % 125 + 1);
59 class Ping1 : public CBase_Ping1
63 double *dArr1, *dArr2;
65 int otherIndex, recvCbCounter, sendCbCounter;
66 CkCallback sendCb, recvCb;
67 CkNcpyBuffer otherDest1, otherDest2, otherDest3;
74 // original arrays that contains data
75 assignValues(iArr1, size);
76 assignValues(dArr1, size);
77 assignCharValues(cArr1, size);
79 sendCb = CkCallback(CkIndex_Ping1::senderCallback(NULL), thisProxy[thisIndex]);
80 recvCb = CkCallback(CkIndex_Ping1::receiverCallback(NULL), thisProxy[thisIndex]);
82 otherIndex = (thisIndex + 1) % 2;
86 Ping1(CkMigrateMessage *m) {}
88 // Executed on Index 0
91 CkAssert(thisIndex == 0);
92 CkNcpyBuffer mySrc1(iArr1, size*sizeof(int), sendCb, CK_BUFFER_PREREG);
93 CkNcpyBuffer mySrc2(dArr1, size*sizeof(double), sendCb, CK_BUFFER_PREREG);
94 CkNcpyBuffer mySrc3(cArr1, size*sizeof(char), sendCb, CK_BUFFER_PREREG);
96 iArr2 = (int *)CkRdmaAlloc(size*sizeof(int));
97 dArr2 = (double *)CkRdmaAlloc(size*sizeof(double));
98 cArr2 = (char *)CkRdmaAlloc(size*sizeof(char));
100 CkNcpyBuffer myDest1(iArr2, size*sizeof(int), recvCb, CK_BUFFER_PREREG);
101 CkNcpyBuffer myDest2(dArr2, size*sizeof(double), recvCb, CK_BUFFER_PREREG);
102 CkNcpyBuffer myDest3(cArr2, size*sizeof(char), recvCb, CK_BUFFER_PREREG);
104 thisProxy[otherIndex].recvNcpyInfo(mySrc1, mySrc2, mySrc3, myDest1, myDest2, myDest3);
107 void senderCallback(CkDataMsg *m){
110 // Cast m->data as (CkNcpyBuffer *)
111 CkNcpyBuffer *src = (CkNcpyBuffer *)(m->data);
112 src->deregisterMem(); // in PREREG mode, actual de-registration is not performed
113 // the above API call is only for demonstration and testing
115 if(sendCbCounter == 3) {
120 mainProxy.maindone();
125 void receiverCallback(CkDataMsg *m){
128 // Cast m->data as (CkNcpyBuffer *)
129 CkNcpyBuffer *dest = (CkNcpyBuffer *)(m->data);
130 dest->deregisterMem(); // in PREREG mode, actual de-registration is not performed
131 // the above API call is only for demonstration and testing
133 if(recvCbCounter == 3) {
136 CkPrintf("[%d][%d][%d] Get call completed\n", thisIndex, CkMyPe(), CkMyNode());
138 // Create a nocopy sources for me to Put from into destinations received
139 CkNcpyBuffer mySrc1(iArr1, sizeof(int)*size, sendCb, CK_BUFFER_PREREG);
140 CkNcpyBuffer mySrc2(dArr1, sizeof(double)*size, sendCb, CK_BUFFER_PREREG);
141 CkNcpyBuffer mySrc3(cArr1, sizeof(char)*size, sendCb, CK_BUFFER_PREREG);
143 // Index 1 Putting to 0
144 mySrc1.put(otherDest1);
145 mySrc2.put(otherDest2);
146 mySrc3.put(otherDest3);
149 CkPrintf("[%d][%d][%d] Put call completed\n", thisIndex, CkMyPe(), CkMyNode());
151 compareArray(iArr1, iArr2, size);
152 compareArray(dArr1, dArr2, size);
153 compareArray(cArr1, cArr2, size);
155 // All arrays can be deleted at this point. But they are not as the program is exiting.
156 mainProxy.maindone();
161 // Executed on Index 1
162 void recvNcpyInfo(CkNcpyBuffer src1, CkNcpyBuffer src2, CkNcpyBuffer src3, CkNcpyBuffer dest1, CkNcpyBuffer dest2, CkNcpyBuffer dest3)
164 CkAssert(thisIndex == 1);
169 // Create nocopy destinations for me to Get from sources received
170 CkNcpyBuffer myDest1(iArr1, size*sizeof(int), recvCb, CK_BUFFER_PREREG);
171 CkNcpyBuffer myDest2(dArr1, size*sizeof(double), recvCb, CK_BUFFER_PREREG);
172 CkNcpyBuffer myDest3(cArr1, size*sizeof(char), recvCb, CK_BUFFER_PREREG);
174 // Index 1 Getting from 0
181 #include "simple_direct.def.h"