added test code for the one sided comm operations with callback
authorNilesh Choudhury <nchoudh2@uiuc.edu>
Tue, 13 Jun 2006 17:21:58 +0000 (17:21 +0000)
committerNilesh Choudhury <nchoudh2@uiuc.edu>
Tue, 13 Jun 2006 17:21:58 +0000 (17:21 +0000)
examples/charm++/onesided/Makefile
examples/charm++/onesided/onesided.C
examples/charm++/onesided/onesided.ci
examples/charm++/onesided/onesided.h

index 5a5009e09667a8adcf0be2edc073d0918bc8b902..efe4c444e2298409750b22867f3da289c04cbde8 100644 (file)
@@ -8,8 +8,10 @@ onesided.o : onesided.C onesided.h onesided.ci
        $(CHARMC) -c onesided.C
 
 test: pgm
-       ./charmrun onesidedtest 0 +p2
-       ./charmrun onesidedtest 1 +p2
+       ./charmrun onesidedtest 0 0 +p2
+       ./charmrun onesidedtest 1 0 +p2
+       ./charmrun onesidedtest 0 1 +p2
+       ./charmrun onesidedtest 1 1 +p2
 
 clean:
        rm -f conv-host onesidedtest *.def.h *.decl.h *.o *~ charmrun
index b2c11b1f3a807893a9eabf9a350640dbea3a5a4b..1384f14afdcee5d43d007176a7620ac95dc3a8e2 100644 (file)
@@ -9,7 +9,11 @@ Main::Main(CkArgMsg* m)
   CProxy_commtest arr = CProxy_commtest::ckNew(2);
   mainProxy = thisProxy;
 
-  arr[0].startRMA(atoi(m->argv[1]));
+  if(m->argc!=3) {
+    CkPrintf("USAGE: pgm <typeOfRmaOp> <with/wo Callback>\n");
+    CkExit();
+  }
+  arr[0].startRMA(atoi(m->argv[1]), atoi(m->argv[2]));
   delete m;
 }
 
@@ -29,22 +33,26 @@ commtest::commtest()
   srcChar = (idx==0)?'1':'2';
   destChar = (idx==0)?'2':'1';
   operation = 0;
+  callb = 0;
   CkPrintf("[%d]Object created on %d\n",idx,idx);
+  CpvAccess(_cmvar) = this;
 }
 
-void commtest::startRMA(int op) {
+void commtest::startRMA(int op, int cb) {
   operation = op;
+  callb = cb;
   srcAddr = (char*)malloc(size*sizeof(char));
   //srcAddr = (char*)CmiDMAAlloc(size);
   initializeMem(srcAddr,size,srcChar);
   //CkPrintf("[%d]Trying to register memory %p\n",idx,srcAddr);
   CmiRegisterMemory((void*)srcAddr,size);
-  thisProxy[dest].remoteRMA(size,operation);
+  thisProxy[dest].remoteRMA(size,operation,cb);
 }
 
-void commtest::remoteRMA(int len,int op) {
+void commtest::remoteRMA(int len,int op, int cb) {
   size = len;
   operation = 1 - op;
+  callb = cb;
   destAddr = (char*)malloc(size*sizeof(char));
   //destAddr = (char*)CmiDMAAlloc(size);
   initializeMem(destAddr,size,srcChar);
@@ -61,13 +69,27 @@ void commtest::recvAddr(charMsg *cm)
   //now that we have all info, could do either a get or put
   if(operation==0) {
     CkPrintf("[%d]Trying to do a remote put %p to %p\n",idx,srcAddr,destAddr);
-    pend = CmiPut(idx, dest, (void*)srcAddr, (void*)destAddr, size);
+    if(callb==0) {
+      pend = CmiPut(idx, dest, (void*)srcAddr, (void*)destAddr, size);
+    }
+    else {
+      void *tmp;
+      CmiPutCb(idx, dest, (void*)srcAddr, (void*)destAddr, size, doneOp, tmp);
+    }
   }
   else {
     CkPrintf("[%d]Trying to do a remote get %p to %p\n",idx,srcAddr,destAddr);
-    pend = CmiGet(idx, dest, (void*)srcAddr, (void*)destAddr, size);
+    if(callb==0) {
+      pend = CmiGet(idx, dest, (void*)srcAddr, (void*)destAddr, size);
+    }
+    else {
+      void *tmp;
+      CmiGetCb(idx, dest, (void*)srcAddr, (void*)destAddr, size, doneOp, tmp);
+    }
+  }
+  if(callb==0) {
+    testDone();
   }
-  testDone();
   delete cm;
 }
 
@@ -93,7 +115,7 @@ void commtest::verifyCorrectRMA(char c) {
     //thisProxy[dest].testDone();
   }
   else {
-    CkPrintf("[%d]DMA operation %d correctly finished!!\n",idx,operation);
+    CkPrintf("[%d]RMA operation %d correctly finished!!\n",idx,operation);
   }
   mainProxy.done();
 }
@@ -117,6 +139,7 @@ void commtest::testDone(void) {
   int done = CmiWaitTest(pend);
   CkPrintf("[%d]Test if done %p, %d!!\n",idx,pend,*((int*)pend));
   if(done==1) {
+    void *tmp;
     testForCorrectness();
   }
 }
@@ -147,5 +170,9 @@ void commtest::testForCorrectness(void) {
   }
 }
 
+void doneOp(void *tmp) {
+  ((commtest*)(CpvAccess(_cmvar)))->testForCorrectness();
+}
+
 #include "onesided.def.h"
 
index 2c4497b95c33c4647b4195686ec3374b537520ad..1466afa0816ba3b102347480f7e38d9a585d84f6 100644 (file)
@@ -11,8 +11,8 @@ mainmodule onesided {
   
   array  [1D] commtest {
     entry commtest(void);
-    entry void startRMA(int op);
-    entry void remoteRMA(int len, int op);
+    entry void startRMA(int op, int cb);
+    entry void remoteRMA(int len, int op, int cb);
     entry void recvAddr(charMsg *cm);
     entry void verifyCorrectRMA(char c);
     entry void doJnkWork(void);
index 69af464f2bc52730eb2ecf535090cb114f354186..f82598403f01ce0735ec01fd6566684392c475a0 100644 (file)
@@ -1,5 +1,10 @@
 #include "onesided.decl.h"
 
+
+void doneOp(void *tmp);
+
+CpvDeclare(void *, _cmvar);
+
 class charMsg : public CMessage_charMsg {
  public:
   char *addr;
@@ -19,12 +24,13 @@ class commtest : public CBase_commtest {
   unsigned int size, dest;
   char srcChar, destChar;
   int operation; //get or put (current operation)
+  int callb;
   void *pend;
  public:
   commtest(CkMigrateMessage *m) {}
   commtest(void);
-  void startRMA(int op);
-  void remoteRMA(int len, int op);
+  void startRMA(int op, int cb);
+  void remoteRMA(int len, int op, int cb);
   void recvAddr(charMsg *cm);
   void verifyCorrectRMA(char c);
   void doJnkWork(void);
@@ -33,4 +39,3 @@ class commtest : public CBase_commtest {
   void testForCompletion(void);
   void testForCorrectness(void);
 };
-