Merge branch 'charm' of charmgit:charm into charm
[charm.git] / examples / charm++ / onesided / onesided.C
1 #include <unistd.h>
2 #include "onesided.h"
3
4 CProxy_Main mainProxy;
5
6 Main::Main(CkArgMsg* m)
7 {
8   int numProcs = 2;
9   CProxy_commtest arr = CProxy_commtest::ckNew(2);
10   mainProxy = thisProxy;
11
12   if(m->argc!=3) {
13     CkPrintf("USAGE: pgm <typeOfRmaOp> <with/wo Callback>\n");
14     CkExit();
15   }
16   arr[0].startRMA(atoi(m->argv[1]), atoi(m->argv[2]));
17   delete m;
18 }
19
20 void Main::done(void)
21 {
22   CkExit();
23 }
24
25
26 commtest::commtest()
27 {
28   idx = CkMyPe();
29   dest = (idx==0)?1:0;
30   srcAddr = NULL;
31   destAddr = NULL;
32   size = 50;
33   srcChar = (idx==0)?'1':'2';
34   destChar = (idx==0)?'2':'1';
35   operation = 0;
36   callb = 0;
37   CkPrintf("[%d]Object created on %d\n",idx,idx);
38   CpvAccess(_cmvar) = this;
39 }
40
41 void commtest::startRMA(int op, int cb) {
42   operation = op;
43   callb = cb;
44   srcAddr = (char*)malloc(size*sizeof(char));
45   //srcAddr = (char*)CmiDMAAlloc(size);
46   initializeMem(srcAddr,size,srcChar);
47   //CkPrintf("[%d]Trying to register memory %p\n",idx,srcAddr);
48   CmiRegisterMemory((void*)srcAddr,size);
49   thisProxy[dest].remoteRMA(size,operation,cb);
50 }
51
52 void commtest::remoteRMA(int len,int op, int cb) {
53   size = len;
54   operation = 1 - op;
55   callb = cb;
56   destAddr = (char*)malloc(size*sizeof(char));
57   //destAddr = (char*)CmiDMAAlloc(size);
58   initializeMem(destAddr,size,srcChar);
59   //CkPrintf("[%d]Trying to register memory %p\n",idx,destAddr);
60   CmiRegisterMemory((void*)destAddr,size);
61   charMsg *cm = new charMsg();
62   cm->addr = destAddr;
63   thisProxy[dest].recvAddr(cm);
64 }
65
66 void commtest::recvAddr(charMsg *cm)
67 {
68   destAddr = cm->addr;
69   //now that we have all info, could do either a get or put
70   if(operation==0) {
71     CkPrintf("[%d]Trying to do a remote put %p to %p\n",idx,srcAddr,destAddr);
72     if(callb==0) {
73       pend = CmiPut(idx, dest, (void*)srcAddr, (void*)destAddr, size);
74     }
75     else {
76       void *tmp;
77       CmiPutCb(idx, dest, (void*)srcAddr, (void*)destAddr, size, doneOp, tmp);
78     }
79   }
80   else {
81     CkPrintf("[%d]Trying to do a remote get %p to %p\n",idx,srcAddr,destAddr);
82     if(callb==0) {
83       pend = CmiGet(idx, dest, (void*)srcAddr, (void*)destAddr, size);
84     }
85     else {
86       void *tmp;
87       CmiGetCb(idx, dest, (void*)srcAddr, (void*)destAddr, size, doneOp, tmp);
88     }
89   }
90   if(callb==0) {
91     testDone();
92   }
93   delete cm;
94 }
95
96 void commtest::verifyCorrectRMA(char c) {
97   char *tmp;
98   if(idx==0) {
99     tmp = srcAddr;
100   }
101   else {
102     tmp = destAddr;
103   }
104   CkPrintf("[%d]Verifying correct RMA\n",idx);
105   bool flag = true;
106   for(int i=0; i<size; i++) {
107     if(*tmp != c) {
108       CkPrintf("[%d]Error: address: %p, expectedValue: %c actualValue: %c\n",idx,tmp,c,*tmp);
109       flag = false;
110       break;
111     }
112     tmp++;
113   }
114   if(!flag) {
115     //thisProxy[dest].testDone();
116   }
117   else {
118     CkPrintf("[%d]RMA operation %d correctly finished!!\n",idx,operation);
119   }
120   mainProxy.done();
121 }
122
123 void commtest::doJnkWork(void) {
124   const double left=0.1, right=0.2;
125   register double v1=0.1,v2=0.3,v3=1.0;
126   int i;
127   int iter = 30000000;
128   for (i=0;i<iter;i++) {
129     v1=(v2+v3)*0.5;
130     v2=(v3+v1)*0.5;
131     v3=(v1+v2)*0.5;
132   }
133   CkPrintf("[%d]Did jnk work\n",idx);
134   thisProxy[dest].testDone();
135 }
136
137 void commtest::testDone(void) {
138   testForCompletion();
139   int done = CmiWaitTest(pend);
140   CkPrintf("[%d]Test if done %p, %d!!\n",idx,pend,*((int*)pend));
141   if(done==1) {
142     void *tmp;
143     testForCorrectness();
144   }
145 }
146
147 void commtest::initializeMem(char *addr, int len, char c) {
148   for(int i=0; i<len; i++) {
149     *addr = c;
150     addr++;
151   }
152 }
153
154 void commtest::testForCompletion(void) {
155   int done = CmiWaitTest(pend);
156   if(done!=1) {
157     CkPrintf("[%d]Do jnk work\n",idx);
158     thisProxy[dest].doJnkWork();
159     done = CmiWaitTest(pend);
160   }
161 }
162
163 void commtest::testForCorrectness(void) {
164   CkPrintf("[%d]Just finished RMA operation %d\n",idx,operation);
165   if(operation==0) { //put operation
166     thisProxy[dest].verifyCorrectRMA(srcChar);
167   }
168   else {
169     verifyCorrectRMA(destChar);
170   }
171 }
172
173 void doneOp(void *tmp) {
174   ((commtest*)(CpvAccess(_cmvar)))->testForCorrectness();
175 }
176
177 #include "onesided.def.h"
178