Zerocopy Direct API: Do not change UNREG to REG mode after registration 32/4532/3
authorNitin Bhat <nbhat4@illinois.edu>
Tue, 28 Aug 2018 22:17:33 +0000 (17:17 -0500)
committerNitin Bhat <nbhat4@illinois.edu>
Wed, 29 Aug 2018 18:58:39 +0000 (13:58 -0500)
With the introduction of a new boolean variable inside CkNcpyBuffer,
called isRegistered, the registration management can be controlled without
the change in the user specified mode. With this change, the RTS internally
uses the value of isRegistered to avoid unnecessary registration and
de-registration. The user specified mode remains unchanged.

This fix also updates the example programs to test de-registration using the
CkNcpyBuffer received in the callback method. The examples are also updated
to not store the CkNcpyBuffer objects, wherever applicable, as data members
in the class as they are now received as a part of the CkDataMsg in the
CkCallback.

Change-Id: I896c7002284b7aab447ad5e3bd41cf709814d218

26 files changed:
doc/charm++/zerocopyapi.tex
examples/charm++/zerocopy/direct_api/prereg/get_put_pingpong/get_put_pingpong.C
examples/charm++/zerocopy/direct_api/prereg/get_put_pingpong/get_put_pingpong.ci
examples/charm++/zerocopy/direct_api/prereg/pingpong/pingpong.C
examples/charm++/zerocopy/direct_api/prereg/simple_get/simple_get.C
examples/charm++/zerocopy/direct_api/prereg/simple_get/simple_get.ci
examples/charm++/zerocopy/direct_api/prereg/simple_put/simple_put.C
examples/charm++/zerocopy/direct_api/prereg/simple_put/simple_put.ci
examples/charm++/zerocopy/direct_api/reg/get_put_pingpong/get_put_pingpong.C
examples/charm++/zerocopy/direct_api/reg/get_put_pingpong/get_put_pingpong.ci
examples/charm++/zerocopy/direct_api/reg/simple_get/simple_get.C
examples/charm++/zerocopy/direct_api/reg/simple_get/simple_get.ci
examples/charm++/zerocopy/direct_api/reg/simple_put/simple_put.C
examples/charm++/zerocopy/direct_api/reg/simple_put/simple_put.ci
examples/charm++/zerocopy/direct_api/unreg/get_put_pingpong/get_put_pingpong.C
examples/charm++/zerocopy/direct_api/unreg/get_put_pingpong/get_put_pingpong.ci
examples/charm++/zerocopy/direct_api/unreg/simple_get/simple_get.C
examples/charm++/zerocopy/direct_api/unreg/simple_put/simple_put.C
examples/charm++/zerocopy/direct_api/unreg/simple_put/simple_put.ci
src/arch/gni/machine-onesided.c
src/arch/ofi/machine-onesided.c
src/arch/verbs/machine-ibverbs.C
src/arch/verbs/machine-onesided.c
src/arch/verbs/machine-onesided.h
src/ck-core/ckrdma.C
src/ck-core/ckrdma.h

index 1cdb98bb36a53a0e7ccd30183e6dec62bc3719ff..b960ef83dc94fd53dc8ad1a944e496d4a41ba278 100644 (file)
@@ -224,9 +224,7 @@ Note that the \kw{CkNcpyBuffer} objects can be
 either statically declared or be dynamically allocated.
 Additionally, the objects are also reusable across iteration boundaries i.e.
 after sending the \kw{CkNcpyBuffer} object, the remote PE can use
-the same object to perform \kw{get} or \kw{put}. However, it is
-important to note that in order to access them, it is required
-to store them in a local variable or as a data member of the class. This pattern
+the same object to perform \kw{get} or \kw{put}. This pattern
 of using the same objects across iterations is demonstrated in
 \examplerefdir{zerocopy/direct\_api/reg/pingpong}.
 
@@ -259,8 +257,7 @@ since the \kw{get} internally performs a memcpy, registration is avoided for non
 transfers. On the other hand, if the target buffer resides on a remote PE on a different
 logical node, the \kw{get} is implemented through an RDMA call requiring registration.
 In such a case, there is a small message sent by the RTS to register and perform
-the RDMA operation. Upon registration, the runtime modifies the state of \kw{CkNcpyBuffer}
-object to {\tt CK\_BUFFER\_REG} from {\tt CK\_BUFFER\_UNREG}. This mode is demonstrated in
+the RDMA operation. This mode is demonstrated in
 \examplerefdir{zerocopy/direct\_api/unreg}
 
 \paragraph{{\tt CK\_BUFFER\_PREREG}}:
index 42119bfd0a8dc0fb7ba43bf24707eb18781f561f..cb61341f714104020e8f9353ff87bf1059dffc86 100644 (file)
@@ -64,8 +64,6 @@ class Ping1 : public CBase_Ping1
   int size;
   int otherIndex, recvCbCounter, sendCbCounter;
   CkCallback sendCb, recvCb;
-  CkNcpyBuffer myDest1, myDest2, myDest3;
-  CkNcpyBuffer mySrc1, mySrc2, mySrc3;
   CkNcpyBuffer otherDest1, otherDest2, otherDest3;
 
 public:
@@ -78,8 +76,8 @@ public:
     assignValues(dArr1, size);
     assignCharValues(cArr1, size);
 
-    sendCb = CkCallback(CkIndex_Ping1::senderCallback(), thisProxy[thisIndex]);
-    recvCb = CkCallback(CkIndex_Ping1::receiverCallback(), thisProxy[thisIndex]);
+    sendCb = CkCallback(CkIndex_Ping1::senderCallback(NULL), thisProxy[thisIndex]);
+    recvCb = CkCallback(CkIndex_Ping1::receiverCallback(NULL), thisProxy[thisIndex]);
 
     otherIndex = (thisIndex + 1) % 2;
     sendCbCounter = 0;
@@ -91,54 +89,56 @@ public:
   void start()
   {
     CkAssert(thisIndex == 0);
-    mySrc1 = CkNcpyBuffer(iArr1, size*sizeof(int), sendCb, CK_BUFFER_PREREG);
-    mySrc2 = CkNcpyBuffer(dArr1, size*sizeof(double), sendCb, CK_BUFFER_PREREG);
-    mySrc3 = CkNcpyBuffer(cArr1, size*sizeof(char), sendCb, CK_BUFFER_PREREG);
+    CkNcpyBuffer mySrc1(iArr1, size*sizeof(int), sendCb, CK_BUFFER_PREREG);
+    CkNcpyBuffer mySrc2(dArr1, size*sizeof(double), sendCb, CK_BUFFER_PREREG);
+    CkNcpyBuffer mySrc3(cArr1, size*sizeof(char), sendCb, CK_BUFFER_PREREG);
 
     iArr2 = (int *)CkRdmaAlloc(size*sizeof(int));
     dArr2 = (double *)CkRdmaAlloc(size*sizeof(double));
     cArr2 = (char *)CkRdmaAlloc(size*sizeof(char));
 
-    myDest1 = CkNcpyBuffer(iArr2, size*sizeof(int), recvCb, CK_BUFFER_PREREG);
-    myDest2 = CkNcpyBuffer(dArr2, size*sizeof(double), recvCb, CK_BUFFER_PREREG);
-    myDest3 = CkNcpyBuffer(cArr2, size*sizeof(char), recvCb, CK_BUFFER_PREREG);
+    CkNcpyBuffer myDest1(iArr2, size*sizeof(int), recvCb, CK_BUFFER_PREREG);
+    CkNcpyBuffer myDest2(dArr2, size*sizeof(double), recvCb, CK_BUFFER_PREREG);
+    CkNcpyBuffer myDest3(cArr2, size*sizeof(char), recvCb, CK_BUFFER_PREREG);
 
     thisProxy[otherIndex].recvNcpyInfo(mySrc1, mySrc2, mySrc3, myDest1, myDest2, myDest3);
   }
 
-  void senderCallback(){
+  void senderCallback(CkDataMsg *m){
     sendCbCounter++;
-    if(sendCbCounter == 3) {
-      // Release Resources for my sources
-      mySrc1.deregisterMem();
-      mySrc2.deregisterMem();
-      mySrc3.deregisterMem();
 
+    // Cast m->data as (CkNcpyBuffer *)
+    CkNcpyBuffer *src = (CkNcpyBuffer *)(m->data);
+    src->deregisterMem(); // in PREREG mode, actual de-registration is not performed
+    // the above API call is only for demonstration and testing
+
+    if(sendCbCounter == 3) {
       if(thisIndex == 1){
-        CmiRdmaFree(iArr1);
-        CmiRdmaFree(dArr1);
-        CmiRdmaFree(cArr1);
+        CkRdmaFree(iArr1);
+        CkRdmaFree(dArr1);
+        CkRdmaFree(cArr1);
         mainProxy.maindone();
       }
     }
   }
 
-  void receiverCallback(){
+  void receiverCallback(CkDataMsg *m){
     recvCbCounter++;
-    if(recvCbCounter == 3) {
 
-      // Release Resources for my destinations
-      myDest1.deregisterMem();
-      myDest2.deregisterMem();
-      myDest3.deregisterMem();
+    // Cast m->data as (CkNcpyBuffer *)
+    CkNcpyBuffer *dest = (CkNcpyBuffer *)(m->data);
+    dest->deregisterMem(); // in PREREG mode, actual de-registration is not performed
+    // the above API call is only for demonstration and testing
+
+    if(recvCbCounter == 3) {
 
       if(thisIndex == 1){
         CkPrintf("[%d][%d][%d] Get call completed\n", thisIndex, CkMyPe(), CkMyNode());
 
         // Create a nocopy sources for me to Put from into destinations received
-        mySrc1 = CkNcpyBuffer(iArr1, sizeof(int)*size, sendCb, CK_BUFFER_PREREG);
-        mySrc2 = CkNcpyBuffer(dArr1, sizeof(double)*size, sendCb, CK_BUFFER_PREREG);
-        mySrc3 = CkNcpyBuffer(cArr1, sizeof(char)*size, sendCb, CK_BUFFER_PREREG);
+        CkNcpyBuffer mySrc1(iArr1, sizeof(int)*size, sendCb, CK_BUFFER_PREREG);
+        CkNcpyBuffer mySrc2(dArr1, sizeof(double)*size, sendCb, CK_BUFFER_PREREG);
+        CkNcpyBuffer mySrc3(cArr1, sizeof(char)*size, sendCb, CK_BUFFER_PREREG);
 
         // Index 1 Putting to 0
         mySrc1.put(otherDest1);
@@ -167,9 +167,9 @@ public:
     otherDest3 = dest3;
 
     // Create nocopy destinations for me to Get from sources received
-    myDest1 = CkNcpyBuffer(iArr1, size*sizeof(int), recvCb, CK_BUFFER_PREREG);
-    myDest2 = CkNcpyBuffer(dArr1, size*sizeof(double), recvCb, CK_BUFFER_PREREG);
-    myDest3 = CkNcpyBuffer(cArr1, size*sizeof(char), recvCb, CK_BUFFER_PREREG);
+    CkNcpyBuffer myDest1(iArr1, size*sizeof(int), recvCb, CK_BUFFER_PREREG);
+    CkNcpyBuffer myDest2(dArr1, size*sizeof(double), recvCb, CK_BUFFER_PREREG);
+    CkNcpyBuffer myDest3(cArr1, size*sizeof(char), recvCb, CK_BUFFER_PREREG);
 
     // Index 1 Getting from 0
     myDest1.get(src1);
index a8e87981feb191aa084269aa1827e538ede3ba34..dd6c5eb94d2bd79feeed4dc14bcf5be2947f4451 100644 (file)
@@ -10,8 +10,8 @@ mainmodule simple_direct {
   array [1D] Ping1 {
     entry Ping1(int size);
     entry void start();
-    entry void senderCallback();
-    entry void receiverCallback();
+    entry void senderCallback(CkDataMsg *m);
+    entry void receiverCallback(CkDataMsg *m);
     entry void recvNcpyInfo(CkNcpyBuffer src1, CkNcpyBuffer src2, CkNcpyBuffer src3, CkNcpyBuffer dest1, CkNcpyBuffer dest2, CkNcpyBuffer dest3);
   };
 
index e520e5967640158c0e7cb2fdd03538057a32bd85..5bfaaf3329a729b667988e2800c9dfb5ccd0fdea 100644 (file)
@@ -232,8 +232,8 @@ class Ping1 : public CBase_Ping1
   }
 
   void freeBuffer(){
-    CmiRdmaFree(nocopyMsg);
-    CmiRdmaFree(otherMsg);
+    CkRdmaFree(nocopyMsg);
+    CkRdmaFree(otherMsg);
     if(thisIndex == 0){
       thisProxy[1].freeBuffer();
     }
index b8d570d9f95ecbca87776cf400892824056ead3c..a21bc47de0b618d97daa9f8ef68b9ec5ff59208b 100644 (file)
@@ -63,8 +63,6 @@ class Ping1 : public CBase_Ping1
   int size;
   int otherIndex, cbCounter, valCounter;
   CkCallback cb;
-  CkNcpyBuffer myDest1, myDest2, myDest3;
-  CkNcpyBuffer mySrc1, mySrc2, mySrc3;
 
 public:
   Ping1(int size)
@@ -77,13 +75,13 @@ public:
       assignValues(dArr1, size);
       assignCharValues(cArr1, size);
       // Set GET Sender callback
-      cb = CkCallback(CkIndex_Ping1::getSenderDone(), thisProxy[thisIndex]);
+      cb = CkCallback(CkIndex_Ping1::getSenderDone(NULL), thisProxy[thisIndex]);
     } else {
       iArr1 = (int *)CkRdmaAlloc(size * sizeof(int));
       cArr1 = (char *)CkRdmaAlloc(size * sizeof(char));
       dArr1 = (double *)CkRdmaAlloc(size * sizeof(double));
       // Set GET Receiver callback
-      cb = CkCallback(CkIndex_Ping1::getReceiverDone(), thisProxy[thisIndex]);
+      cb = CkCallback(CkIndex_Ping1::getReceiverDone(NULL), thisProxy[thisIndex]);
     }
 
     otherIndex = (thisIndex + 1) % 2;
@@ -96,37 +94,41 @@ public:
   void start()
   {
     CkAssert(thisIndex == 0);
-    mySrc1 = CkNcpyBuffer(iArr1, size*sizeof(int), cb, CK_BUFFER_PREREG);
-    mySrc2 = CkNcpyBuffer(dArr1, size*sizeof(double), cb, CK_BUFFER_PREREG);
-    mySrc3 = CkNcpyBuffer(cArr1, size*sizeof(char), cb, CK_BUFFER_PREREG);
+    CkNcpyBuffer mySrc1(iArr1, size*sizeof(int), cb, CK_BUFFER_PREREG);
+    CkNcpyBuffer mySrc2(dArr1, size*sizeof(double), cb, CK_BUFFER_PREREG);
+    CkNcpyBuffer mySrc3(cArr1, size*sizeof(char), cb, CK_BUFFER_PREREG);
 
     // Send my sources to Index 1; Index 1 performs Gets from these sources
     thisProxy[otherIndex].recvNcpyInfo(mySrc1, mySrc2, mySrc3);
   }
 
   // Executed on Index 0
-  void getSenderDone(){
+  void getSenderDone(CkDataMsg *m){
     CkAssert(thisIndex == 0);
     cbCounter++;
+
+    // Cast m->data as (CkNcpyBuffer *)
+    CkNcpyBuffer *src = (CkNcpyBuffer *)(m->data);
+    src->deregisterMem(); // in PREREG mode, actual de-registration is not performed
+    // the above API call is only for demonstration and testing
+
     if(cbCounter == 3) {
-      // Release Resources for my sources
-      mySrc1.deregisterMem();
-      mySrc2.deregisterMem();
-      mySrc3.deregisterMem();
       CkPrintf("[%d][%d][%d] Get Source Done\n", thisIndex, CkMyPe(), CkMyNode());
       sendValidationData();
     }
   }
 
   // Executed on Index 1 (which receives data from get)
-  void getReceiverDone(){
+  void getReceiverDone(CkDataMsg *m){
     CkAssert(thisIndex == 1);
     cbCounter++;
+
+    // Cast m->data as (CkNcpyBuffer *)
+    CkNcpyBuffer *dest = (CkNcpyBuffer *)(m->data);
+    dest->deregisterMem(); // in PREREG mode, actual de-registration is not performed
+    // the above API call is only for demonstration and testing
+
     if(cbCounter == 3) {
-      // Release Resources for my destinations
-      myDest1.deregisterMem();
-      myDest2.deregisterMem();
-      myDest3.deregisterMem();
       CkPrintf("[%d][%d][%d] Get Destination Done\n", thisIndex, CkMyPe(), CkMyNode());
       thisProxy[otherIndex].sendValidationData();
     }
@@ -138,9 +140,9 @@ public:
     valCounter++;
     if(valCounter == 2) {
       thisProxy[otherIndex].validateGetData(iArr1, dArr1, cArr1, size);
-      CmiRdmaFree(iArr1);
-      CmiRdmaFree(dArr1);
-      CmiRdmaFree(cArr1);
+      CkRdmaFree(iArr1);
+      CkRdmaFree(dArr1);
+      CkRdmaFree(cArr1);
       mainProxy.maindone();
     }
   }
@@ -150,9 +152,9 @@ public:
   {
     CkAssert(thisIndex == 1);
     // Create nocopy destination for me to Get into
-    myDest1 = CkNcpyBuffer(iArr1, size*sizeof(int), cb, CK_BUFFER_PREREG);
-    myDest2 = CkNcpyBuffer(dArr1, size*sizeof(double), cb, CK_BUFFER_PREREG);
-    myDest3 = CkNcpyBuffer(cArr1, size*sizeof(char), cb, CK_BUFFER_PREREG);
+    CkNcpyBuffer myDest1(iArr1, size*sizeof(int), cb, CK_BUFFER_PREREG);
+    CkNcpyBuffer myDest2(dArr1, size*sizeof(double), cb, CK_BUFFER_PREREG);
+    CkNcpyBuffer myDest3(cArr1, size*sizeof(char), cb, CK_BUFFER_PREREG);
 
     // Perform Get from Index 0's sources into my destinations
     myDest1.get(src1);
@@ -168,9 +170,9 @@ public:
     compareArray(dArr1, dArr2, size);
     compareArray(cArr1, cArr2, size);
     CkPrintf("[%d][%d][%d] Get Validated! \n", thisIndex, CkMyPe(), CkMyNode());
-    CmiRdmaFree(iArr1);
-    CmiRdmaFree(dArr1);
-    CmiRdmaFree(cArr1);
+    CkRdmaFree(iArr1);
+    CkRdmaFree(dArr1);
+    CkRdmaFree(cArr1);
     mainProxy.maindone();
   }
 
index 75b9f836794939a32d030c073e67a08401115495..354820eeff3d3ebbfae9500dcf6872a5805cd177 100644 (file)
@@ -10,8 +10,8 @@ mainmodule simple_get {
   array [1D] Ping1 {
     entry Ping1(int size);
     entry void start();
-    entry void getSenderDone();
-    entry void getReceiverDone();
+    entry void getSenderDone(CkDataMsg *m);
+    entry void getReceiverDone(CkDataMsg *m);
     entry void recvNcpyInfo(CkNcpyBuffer src1, CkNcpyBuffer src2, CkNcpyBuffer src3);
     entry void sendValidationData();
     entry void validateGetData(int iArr2[size], double dArr2[size], char cArr2[size], int size);
index 4a785d511ac133c58cedcd8d3525081b00362ba9..1cbeaa68793cc3dfb4a9f6e9027991cc3c70a7e7 100644 (file)
@@ -63,8 +63,6 @@ class Ping1 : public CBase_Ping1
   int size;
   int otherIndex, cbCounter, valCounter;
   CkCallback cb;
-  CkNcpyBuffer myDest1, myDest2, myDest3;
-  CkNcpyBuffer mySrc1, mySrc2, mySrc3;
 
 public:
   Ping1(int size)
@@ -77,13 +75,13 @@ public:
       assignValues(dArr1, size);
       assignCharValues(cArr1, size);
       // Set PUT Sender callback
-      cb = CkCallback(CkIndex_Ping1::putSenderDone(), thisProxy[thisIndex]);
+      cb = CkCallback(CkIndex_Ping1::putSenderDone(NULL), thisProxy[thisIndex]);
     } else {
       iArr1 = (int *)CkRdmaAlloc(size * sizeof(int));
       cArr1 = (char *)CkRdmaAlloc(size * sizeof(char));
       dArr1 = (double *)CkRdmaAlloc(size * sizeof(double));
       // Set PUT Receiver callback
-      cb = CkCallback(CkIndex_Ping1::putReceiverDone(), thisProxy[thisIndex]);
+      cb = CkCallback(CkIndex_Ping1::putReceiverDone(NULL), thisProxy[thisIndex]);
     }
 
     otherIndex = (thisIndex + 1) % 2;
@@ -96,37 +94,41 @@ public:
   void start()
   {
     CkAssert(thisIndex == 1);
-    myDest1 = CkNcpyBuffer(iArr1, size*sizeof(int), cb, CK_BUFFER_PREREG);
-    myDest2 = CkNcpyBuffer(dArr1, size*sizeof(double), cb, CK_BUFFER_PREREG);
-    myDest3 = CkNcpyBuffer(cArr1, size*sizeof(char), cb, CK_BUFFER_PREREG);
+    CkNcpyBuffer myDest1(iArr1, size*sizeof(int), cb, CK_BUFFER_PREREG);
+    CkNcpyBuffer myDest2(dArr1, size*sizeof(double), cb, CK_BUFFER_PREREG);
+    CkNcpyBuffer myDest3(cArr1, size*sizeof(char), cb, CK_BUFFER_PREREG);
 
     // Send my destinations to Index 0; Index 0 performs Puts into these destinations
     thisProxy[otherIndex].recvNcpyInfo(myDest1, myDest2, myDest3);
   }
 
   // Executed on Index 0 (which calls put)
-  void putSenderDone(){
+  void putSenderDone(CkDataMsg *m){
     CkAssert(thisIndex == 0);
     cbCounter++;
+
+    // Cast m->data as (CkNcpyBuffer *)
+    CkNcpyBuffer *src = (CkNcpyBuffer *)(m->data);
+    src->deregisterMem(); // in PREREG mode, actual de-registration is not performed
+    // the above API call is only for demonstration and testing
+
     if(cbCounter == 3) {
-      // Release Resources for my sources
-      mySrc1.deregisterMem();
-      mySrc2.deregisterMem();
-      mySrc3.deregisterMem();
       CkPrintf("[%d][%d][%d] Put Source Done\n", thisIndex, CkMyPe(), CkMyNode());
       sendValidationData();
     }
   }
 
   // Executed on Index 1 (which receives data from put)
-  void putReceiverDone(){
+  void putReceiverDone(CkDataMsg *m){
     CkAssert(thisIndex == 1);
     cbCounter++;
+
+    // Cast m->data as (CkNcpyBuffer *)
+    CkNcpyBuffer *dest = (CkNcpyBuffer *)(m->data);
+    dest->deregisterMem(); // in PREREG mode, actual de-registration is not performed
+    // the above API call is only for demonstration and testing
+
     if(cbCounter == 3) {
-      // Release Resources for my destinations
-      myDest1.deregisterMem();
-      myDest2.deregisterMem();
-      myDest3.deregisterMem();
       CkPrintf("[%d][%d][%d] Put Destination Done\n", thisIndex, CkMyPe(), CkMyNode());
       thisProxy[otherIndex].sendValidationData();
     }
@@ -138,9 +140,9 @@ public:
     valCounter++;
     if(valCounter == 2) {
       thisProxy[otherIndex].validatePutData(iArr1, dArr1, cArr1, size);
-      CmiRdmaFree(iArr1);
-      CmiRdmaFree(dArr1);
-      CmiRdmaFree(cArr1);
+      CkRdmaFree(iArr1);
+      CkRdmaFree(dArr1);
+      CkRdmaFree(cArr1);
       mainProxy.maindone();
     }
   }
@@ -150,9 +152,9 @@ public:
   {
     CkAssert(thisIndex == 0);
     // Create nocopy sources for me to Put into
-    mySrc1 = CkNcpyBuffer(iArr1, size*sizeof(int), cb, CK_BUFFER_PREREG);
-    mySrc2 = CkNcpyBuffer(dArr1, size*sizeof(double), cb, CK_BUFFER_PREREG);
-    mySrc3 = CkNcpyBuffer(cArr1, size*sizeof(char), cb, CK_BUFFER_PREREG);
+    CkNcpyBuffer mySrc1(iArr1, size*sizeof(int), cb, CK_BUFFER_PREREG);
+    CkNcpyBuffer mySrc2(dArr1, size*sizeof(double), cb, CK_BUFFER_PREREG);
+    CkNcpyBuffer mySrc3(cArr1, size*sizeof(char), cb, CK_BUFFER_PREREG);
 
     // Perform Puts from my sources into Index 1's destinations
     mySrc1.put(dest1);
@@ -168,9 +170,9 @@ public:
     compareArray(dArr1, dArr2, size);
     compareArray(cArr1, cArr2, size);
     CkPrintf("[%d][%d][%d] Put Validated! \n", thisIndex, CkMyPe(), CkMyNode());
-    CmiRdmaFree(iArr1);
-    CmiRdmaFree(dArr1);
-    CmiRdmaFree(cArr1);
+    CkRdmaFree(iArr1);
+    CkRdmaFree(dArr1);
+    CkRdmaFree(cArr1);
     mainProxy.maindone();
   }
 
index e41bbf3c15ff31be05d74a9885feba54b89274ed..1ebd4b40d390cdff1b56b236df2fa77c03a57d0e 100644 (file)
@@ -10,8 +10,8 @@ mainmodule simple_put {
   array [1D] Ping1 {
     entry Ping1(int size);
     entry void start();
-    entry void putSenderDone();
-    entry void putReceiverDone();
+    entry void putSenderDone(CkDataMsg *m);
+    entry void putReceiverDone(CkDataMsg *m);
     entry void recvNcpyInfo(CkNcpyBuffer dest1, CkNcpyBuffer dest2, CkNcpyBuffer dest3);
     entry void sendValidationData();
     entry void validatePutData(int iArr2[size], double dArr2[size], char cArr2[size], int size);
index f8901a0e39b41445f38937b6b2f7d08fd6b93bfe..1318c62523ef3755efb6834796ece2a248896fcd 100644 (file)
@@ -62,8 +62,6 @@ class Ping1 : public CBase_Ping1
   int size;
   int otherIndex, recvCbCounter, sendCbCounter;
   CkCallback sendCb, recvCb;
-  CkNcpyBuffer myDest1, myDest2, myDest3;
-  CkNcpyBuffer mySrc1, mySrc2, mySrc3;
   CkNcpyBuffer otherDest1, otherDest2, otherDest3;
 
 public:
@@ -76,8 +74,8 @@ public:
     assignValues(dArr1, size);
     assignCharValues(cArr1, size);
 
-    sendCb = CkCallback(CkIndex_Ping1::senderCallback(), thisProxy[thisIndex]);
-    recvCb = CkCallback(CkIndex_Ping1::receiverCallback(), thisProxy[thisIndex]);
+    sendCb = CkCallback(CkIndex_Ping1::senderCallback(NULL), thisProxy[thisIndex]);
+    recvCb = CkCallback(CkIndex_Ping1::receiverCallback(NULL), thisProxy[thisIndex]);
 
     otherIndex = (thisIndex + 1) % 2;
     sendCbCounter = 0;
@@ -89,29 +87,28 @@ public:
   void start()
   {
     CkAssert(thisIndex == 0);
-    mySrc1 = CkNcpyBuffer(iArr1, size*sizeof(int), sendCb);
-    mySrc2 = CkNcpyBuffer(dArr1, size*sizeof(double), sendCb);
-    mySrc3 = CkNcpyBuffer(cArr1, size*sizeof(char), sendCb);
+    CkNcpyBuffer mySrc1(iArr1, size*sizeof(int), sendCb);
+    CkNcpyBuffer mySrc2(dArr1, size*sizeof(double), sendCb);
+    CkNcpyBuffer mySrc3(cArr1, size*sizeof(char), sendCb);
 
     iArr2 = new int[size];
     dArr2 = new double[size];
     cArr2 = new char[size];
 
-    myDest1 = CkNcpyBuffer(iArr2, size*sizeof(int), recvCb);
-    myDest2 = CkNcpyBuffer(dArr2, size*sizeof(double), recvCb);
-    myDest3 = CkNcpyBuffer(cArr2, size*sizeof(char), recvCb);
+    CkNcpyBuffer myDest1(iArr2, size*sizeof(int), recvCb);
+    CkNcpyBuffer myDest2(dArr2, size*sizeof(double), recvCb);
+    CkNcpyBuffer myDest3(cArr2, size*sizeof(char), recvCb);
 
     thisProxy[otherIndex].recvNcpyInfo(mySrc1, mySrc2, mySrc3, myDest1, myDest2, myDest3);
   }
 
-  void senderCallback(){
+  void senderCallback(CkDataMsg *m){
     sendCbCounter++;
-    if(sendCbCounter == 3) {
-      // Release Resources for my sources
-      mySrc1.deregisterMem();
-      mySrc2.deregisterMem();
-      mySrc3.deregisterMem();
+    // Cast m->data as (CkNcpyBuffer *)
+    CkNcpyBuffer *src = (CkNcpyBuffer *)(m->data);
+    src->deregisterMem();
 
+    if(sendCbCounter == 3) {
       if(thisIndex == 1){
         delete [] iArr1;
         delete [] dArr1;
@@ -121,22 +118,22 @@ public:
     }
   }
 
-  void receiverCallback(){
+  void receiverCallback(CkDataMsg *m){
     recvCbCounter++;
-    if(recvCbCounter == 3) {
 
-      // Release Resources for my destinations
-      myDest1.deregisterMem();
-      myDest2.deregisterMem();
-      myDest3.deregisterMem();
+    // Cast m->data as (CkNcpyBuffer *)
+    CkNcpyBuffer *dest = (CkNcpyBuffer *)(m->data);
+    dest->deregisterMem();
+
+    if(recvCbCounter == 3) {
 
       if(thisIndex == 1){
         CkPrintf("[%d][%d][%d] Get call completed\n", thisIndex, CkMyPe(), CkMyNode());
 
         // Create a nocopy sources for me to Put from into destinations received
-        mySrc1 = CkNcpyBuffer(iArr1, sizeof(int)*size, sendCb);
-        mySrc2 = CkNcpyBuffer(dArr1, sizeof(double)*size, sendCb);
-        mySrc3 = CkNcpyBuffer(cArr1, sizeof(char)*size, sendCb);
+        CkNcpyBuffer mySrc1(iArr1, sizeof(int)*size, sendCb);
+        CkNcpyBuffer mySrc2(dArr1, sizeof(double)*size, sendCb);
+        CkNcpyBuffer mySrc3(cArr1, sizeof(char)*size, sendCb);
 
         // Index 1 Putting to 0
         mySrc1.put(otherDest1);
@@ -165,9 +162,9 @@ public:
     otherDest3 = dest3;
 
     // Create nocopy destinations for me to Get from sources received
-    myDest1 = CkNcpyBuffer(iArr1, size*sizeof(int), recvCb);
-    myDest2 = CkNcpyBuffer(dArr1, size*sizeof(double), recvCb);
-    myDest3 = CkNcpyBuffer(cArr1, size*sizeof(char), recvCb);
+    CkNcpyBuffer myDest1(iArr1, size*sizeof(int), recvCb);
+    CkNcpyBuffer myDest2(dArr1, size*sizeof(double), recvCb);
+    CkNcpyBuffer myDest3(cArr1, size*sizeof(char), recvCb);
 
     // Index 1 Getting from 0
     myDest1.get(src1);
index a8e87981feb191aa084269aa1827e538ede3ba34..dd6c5eb94d2bd79feeed4dc14bcf5be2947f4451 100644 (file)
@@ -10,8 +10,8 @@ mainmodule simple_direct {
   array [1D] Ping1 {
     entry Ping1(int size);
     entry void start();
-    entry void senderCallback();
-    entry void receiverCallback();
+    entry void senderCallback(CkDataMsg *m);
+    entry void receiverCallback(CkDataMsg *m);
     entry void recvNcpyInfo(CkNcpyBuffer src1, CkNcpyBuffer src2, CkNcpyBuffer src3, CkNcpyBuffer dest1, CkNcpyBuffer dest2, CkNcpyBuffer dest3);
   };
 
index 7ac310a1c597a7d95efb1bb0b1070395e966af12..3d6369487390a1cd9d557d57c1cbd3586102b6fa 100644 (file)
@@ -61,8 +61,6 @@ class Ping1 : public CBase_Ping1
   int size;
   int otherIndex, cbCounter, valCounter;
   CkCallback cb;
-  CkNcpyBuffer myDest1, myDest2, myDest3;
-  CkNcpyBuffer mySrc1, mySrc2, mySrc3;
 
 public:
   Ping1(int size)
@@ -75,13 +73,13 @@ public:
       assignValues(dArr1, size);
       assignCharValues(cArr1, size);
       // Set GET Sender callback
-      cb = CkCallback(CkIndex_Ping1::getSenderDone(), thisProxy[thisIndex]);
+      cb = CkCallback(CkIndex_Ping1::getSenderDone(NULL), thisProxy[thisIndex]);
     } else {
       iArr1 = new int[size];
       cArr1 = new char[size];
       dArr1 = new double[size];
       // Set GET Receiver callback
-      cb = CkCallback(CkIndex_Ping1::getReceiverDone(), thisProxy[thisIndex]);
+      cb = CkCallback(CkIndex_Ping1::getReceiverDone(NULL), thisProxy[thisIndex]);
     }
 
     otherIndex = (thisIndex + 1) % 2;
@@ -94,37 +92,39 @@ public:
   void start()
   {
     CkAssert(thisIndex == 0);
-    mySrc1 = CkNcpyBuffer(iArr1, size*sizeof(int), cb);
-    mySrc2 = CkNcpyBuffer(dArr1, size*sizeof(double), cb);
-    mySrc3 = CkNcpyBuffer(cArr1, size*sizeof(char), cb);
+    CkNcpyBuffer mySrc1(iArr1, size*sizeof(int), cb);
+    CkNcpyBuffer mySrc2(dArr1, size*sizeof(double), cb);
+    CkNcpyBuffer mySrc3(cArr1, size*sizeof(char), cb);
 
     // Send my sources to Index 1; Index 1 performs Gets from these sources
     thisProxy[otherIndex].recvNcpyInfo(mySrc1, mySrc2, mySrc3);
   }
 
   // Executed on Index 0
-  void getSenderDone(){
+  void getSenderDone(CkDataMsg *m){
     CkAssert(thisIndex == 0);
     cbCounter++;
+
+    // Cast m->data as (CkNcpyBuffer *)
+    CkNcpyBuffer *src = (CkNcpyBuffer *)(m->data);
+    src->deregisterMem();
+
     if(cbCounter == 3) {
-      // Release Resources for my sources
-      mySrc1.deregisterMem();
-      mySrc2.deregisterMem();
-      mySrc3.deregisterMem();
       CkPrintf("[%d][%d][%d] Get Source Done\n", thisIndex, CkMyPe(), CkMyNode());
       sendValidationData();
     }
   }
 
   // Executed on Index 1 (which receives data from get)
-  void getReceiverDone(){
+  void getReceiverDone(CkDataMsg *m){
     CkAssert(thisIndex == 1);
     cbCounter++;
+
+    // Cast m->data as (CkNcpyBuffer *)
+    CkNcpyBuffer *dest = (CkNcpyBuffer *)(m->data);
+    dest->deregisterMem();
+
     if(cbCounter == 3) {
-      // Release Resources for my destinations
-      myDest1.deregisterMem();
-      myDest2.deregisterMem();
-      myDest3.deregisterMem();
       CkPrintf("[%d][%d][%d] Get Destination Done\n", thisIndex, CkMyPe(), CkMyNode());
       thisProxy[otherIndex].sendValidationData();
     }
@@ -148,9 +148,9 @@ public:
   {
     CkAssert(thisIndex == 1);
     // Create nocopy destination for me to Get into
-    myDest1 = CkNcpyBuffer(iArr1, size*sizeof(int), cb);
-    myDest2 = CkNcpyBuffer(dArr1, size*sizeof(double), cb);
-    myDest3 = CkNcpyBuffer(cArr1, size*sizeof(char), cb);
+    CkNcpyBuffer myDest1(iArr1, size*sizeof(int), cb);
+    CkNcpyBuffer myDest2(dArr1, size*sizeof(double), cb);
+    CkNcpyBuffer myDest3(cArr1, size*sizeof(char), cb);
 
     // Perform Get from Index 0's sources into my destinations
     myDest1.get(src1);
index 75b9f836794939a32d030c073e67a08401115495..354820eeff3d3ebbfae9500dcf6872a5805cd177 100644 (file)
@@ -10,8 +10,8 @@ mainmodule simple_get {
   array [1D] Ping1 {
     entry Ping1(int size);
     entry void start();
-    entry void getSenderDone();
-    entry void getReceiverDone();
+    entry void getSenderDone(CkDataMsg *m);
+    entry void getReceiverDone(CkDataMsg *m);
     entry void recvNcpyInfo(CkNcpyBuffer src1, CkNcpyBuffer src2, CkNcpyBuffer src3);
     entry void sendValidationData();
     entry void validateGetData(int iArr2[size], double dArr2[size], char cArr2[size], int size);
index ecbe300cf296c3e9eaae92d5781b8994ec8a8da4..e5ca6bfa40b5b2f58972bf7d5137d87954f1e980 100644 (file)
@@ -75,13 +75,13 @@ public:
       assignValues(dArr1, size);
       assignCharValues(cArr1, size);
       // Set PUT Sender callback
-      cb = CkCallback(CkIndex_Ping1::putSenderDone(), thisProxy[thisIndex]);
+      cb = CkCallback(CkIndex_Ping1::putSenderDone(NULL), thisProxy[thisIndex]);
     } else {
       iArr1 = new int[size];
       cArr1 = new char[size];
       dArr1 = new double[size];
       // Set PUT Receiver callback
-      cb = CkCallback(CkIndex_Ping1::putReceiverDone(), thisProxy[thisIndex]);
+      cb = CkCallback(CkIndex_Ping1::putReceiverDone(NULL), thisProxy[thisIndex]);
     }
 
     otherIndex = (thisIndex + 1) % 2;
@@ -94,37 +94,39 @@ public:
   void start()
   {
     CkAssert(thisIndex == 1);
-    myDest1 = CkNcpyBuffer(iArr1, size*sizeof(int), cb); // not using any mode uses CK_BUFFER_REG
-    myDest2 = CkNcpyBuffer(dArr1, size*sizeof(double), cb, CK_BUFFER_REG);
-    myDest3 = CkNcpyBuffer(cArr1, size*sizeof(char), cb, CK_BUFFER_REG);
+    CkNcpyBuffer myDest1(iArr1, size*sizeof(int), cb); // not using any mode uses CK_BUFFER_REG
+    CkNcpyBuffer myDest2(dArr1, size*sizeof(double), cb, CK_BUFFER_REG);
+    CkNcpyBuffer myDest3(cArr1, size*sizeof(char), cb, CK_BUFFER_REG);
 
     // Send my destinations to Index 0; Index 0 performs Puts into these destinations
     thisProxy[otherIndex].recvNcpyInfo(myDest1, myDest2, myDest3);
   }
 
   // Executed on Index 0 (which calls put)
-  void putSenderDone(){
+  void putSenderDone(CkDataMsg *m){
     CkAssert(thisIndex == 0);
     cbCounter++;
+
+    // Cast m->data as (CkNcpyBuffer *)
+    CkNcpyBuffer *src = (CkNcpyBuffer *)(m->data);
+    src->deregisterMem();
+
     if(cbCounter == 3) {
-      // Release Resources for my sources
-      mySrc1.deregisterMem();
-      mySrc2.deregisterMem();
-      mySrc3.deregisterMem();
       CkPrintf("[%d][%d][%d] Put Source Done\n", thisIndex, CkMyPe(), CkMyNode());
       sendValidationData();
     }
   }
 
   // Executed on Index 1 (which receives data from put)
-  void putReceiverDone(){
+  void putReceiverDone(CkDataMsg *m){
     CkAssert(thisIndex == 1);
     cbCounter++;
+
+    // Cast m->data as (CkNcpyBuffer *)
+    CkNcpyBuffer *dest = (CkNcpyBuffer *)(m->data);
+    dest->deregisterMem();
+
     if(cbCounter == 3) {
-      // Release Resources for my destinations
-      myDest1.deregisterMem();
-      myDest2.deregisterMem();
-      myDest3.deregisterMem();
       CkPrintf("[%d][%d][%d] Put Destination Done\n", thisIndex, CkMyPe(), CkMyNode());
       thisProxy[otherIndex].sendValidationData();
     }
@@ -148,9 +150,9 @@ public:
   {
     CkAssert(thisIndex == 0);
     // Create nocopy sources for me to Put into
-    mySrc1 = CkNcpyBuffer(iArr1, size*sizeof(int), cb, CK_BUFFER_REG);
-    mySrc2 = CkNcpyBuffer(dArr1, size*sizeof(double), cb, CK_BUFFER_REG);
-    mySrc3 = CkNcpyBuffer(cArr1, size*sizeof(char), cb, CK_BUFFER_REG);
+    CkNcpyBuffer mySrc1(iArr1, size*sizeof(int), cb, CK_BUFFER_REG);
+    CkNcpyBuffer mySrc2(dArr1, size*sizeof(double), cb, CK_BUFFER_REG);
+    CkNcpyBuffer mySrc3(cArr1, size*sizeof(char), cb, CK_BUFFER_REG);
 
     // Perform Puts from my sources into Index 1's destinations
     mySrc1.put(dest1);
index e41bbf3c15ff31be05d74a9885feba54b89274ed..1ebd4b40d390cdff1b56b236df2fa77c03a57d0e 100644 (file)
@@ -10,8 +10,8 @@ mainmodule simple_put {
   array [1D] Ping1 {
     entry Ping1(int size);
     entry void start();
-    entry void putSenderDone();
-    entry void putReceiverDone();
+    entry void putSenderDone(CkDataMsg *m);
+    entry void putReceiverDone(CkDataMsg *m);
     entry void recvNcpyInfo(CkNcpyBuffer dest1, CkNcpyBuffer dest2, CkNcpyBuffer dest3);
     entry void sendValidationData();
     entry void validatePutData(int iArr2[size], double dArr2[size], char cArr2[size], int size);
index 6c99190d40b665b0a6a1d5c12445a6810c393e2c..b44f6498b90c739bca628320f076ba39731461f8 100644 (file)
@@ -61,8 +61,6 @@ class Ping1 : public CBase_Ping1
   int size;
   int otherIndex, recvCbCounter, sendCbCounter;
   CkCallback sendCb, recvCb;
-  CkNcpyBuffer myDest1, myDest2, myDest3;
-  CkNcpyBuffer mySrc1, mySrc2, mySrc3;
   CkNcpyBuffer otherDest1, otherDest2, otherDest3;
 
 public:
@@ -75,8 +73,8 @@ public:
     assignValues(dArr1, size);
     assignCharValues(cArr1, size);
 
-    sendCb = CkCallback(CkIndex_Ping1::senderCallback(), thisProxy[thisIndex]);
-    recvCb = CkCallback(CkIndex_Ping1::receiverCallback(), thisProxy[thisIndex]);
+    sendCb = CkCallback(CkIndex_Ping1::senderCallback(NULL), thisProxy[thisIndex]);
+    recvCb = CkCallback(CkIndex_Ping1::receiverCallback(NULL), thisProxy[thisIndex]);
 
     otherIndex = (thisIndex + 1) % 2;
     sendCbCounter = 0;
@@ -88,28 +86,29 @@ public:
   void start()
   {
     CkAssert(thisIndex == 0);
-    mySrc1 = CkNcpyBuffer(iArr1, size*sizeof(int), sendCb, CK_BUFFER_UNREG);
-    mySrc2 = CkNcpyBuffer(dArr1, size*sizeof(double), sendCb, CK_BUFFER_UNREG);
-    mySrc3 = CkNcpyBuffer(cArr1, size*sizeof(char), sendCb, CK_BUFFER_UNREG);
+    CkNcpyBuffer mySrc1(iArr1, size*sizeof(int), sendCb, CK_BUFFER_UNREG);
+    CkNcpyBuffer mySrc2(dArr1, size*sizeof(double), sendCb, CK_BUFFER_UNREG);
+    CkNcpyBuffer mySrc3(cArr1, size*sizeof(char), sendCb, CK_BUFFER_UNREG);
 
     iArr2 = new int[size];
     dArr2 = new double[size];
     cArr2 = new char[size];
 
-    myDest1 = CkNcpyBuffer(iArr2, size*sizeof(int), recvCb, CK_BUFFER_UNREG);
-    myDest2 = CkNcpyBuffer(dArr2, size*sizeof(double), recvCb, CK_BUFFER_UNREG);
-    myDest3 = CkNcpyBuffer(cArr2, size*sizeof(char), recvCb, CK_BUFFER_UNREG);
+    CkNcpyBuffer myDest1(iArr2, size*sizeof(int), recvCb, CK_BUFFER_UNREG);
+    CkNcpyBuffer myDest2(dArr2, size*sizeof(double), recvCb, CK_BUFFER_UNREG);
+    CkNcpyBuffer myDest3(cArr2, size*sizeof(char), recvCb, CK_BUFFER_UNREG);
 
     thisProxy[otherIndex].recvNcpyInfo(mySrc1, mySrc2, mySrc3, myDest1, myDest2, myDest3);
   }
 
-  void senderCallback(){
+  void senderCallback(CkDataMsg *m){
     sendCbCounter++;
+
+    // Cast m->data as (CkNcpyBuffer *)
+    CkNcpyBuffer *src = (CkNcpyBuffer *)(m->data);
+    src->deregisterMem();
+
     if(sendCbCounter == 3) {
-      // Release Resources for my sources
-      mySrc1.deregisterMem();
-      mySrc2.deregisterMem();
-      mySrc3.deregisterMem();
 
       if(thisIndex == 1){
         delete [] iArr1;
@@ -120,22 +119,22 @@ public:
     }
   }
 
-  void receiverCallback(){
+  void receiverCallback(CkDataMsg *m){
     recvCbCounter++;
-    if(recvCbCounter == 3) {
 
-      // Release Resources for my destinations
-      myDest1.deregisterMem();
-      myDest2.deregisterMem();
-      myDest3.deregisterMem();
+    // Cast m->data as (CkNcpyBuffer *)
+    CkNcpyBuffer *dest = (CkNcpyBuffer *)(m->data);
+    dest->deregisterMem();
+
+    if(recvCbCounter == 3) {
 
       if(thisIndex == 1){
         CkPrintf("[%d][%d][%d] Get call completed\n", thisIndex, CkMyPe(), CkMyNode());
 
         // Create a nocopy sources for me to Put from into destinations received
-        mySrc1 = CkNcpyBuffer(iArr1, sizeof(int)*size, sendCb, CK_BUFFER_UNREG);
-        mySrc2 = CkNcpyBuffer(dArr1, sizeof(double)*size, sendCb, CK_BUFFER_UNREG);
-        mySrc3 = CkNcpyBuffer(cArr1, sizeof(char)*size, sendCb, CK_BUFFER_UNREG);
+        CkNcpyBuffer mySrc1(iArr1, sizeof(int)*size, sendCb, CK_BUFFER_UNREG);
+        CkNcpyBuffer mySrc2(dArr1, sizeof(double)*size, sendCb, CK_BUFFER_UNREG);
+        CkNcpyBuffer mySrc3(cArr1, sizeof(char)*size, sendCb, CK_BUFFER_UNREG);
 
         // Index 1 Putting to 0
         mySrc1.put(otherDest1);
@@ -164,9 +163,9 @@ public:
     otherDest3 = dest3;
 
     // Create nocopy destinations for me to Get from sources received
-    myDest1 = CkNcpyBuffer(iArr1, size*sizeof(int), recvCb, CK_BUFFER_UNREG);
-    myDest2 = CkNcpyBuffer(dArr1, size*sizeof(double), recvCb, CK_BUFFER_UNREG);
-    myDest3 = CkNcpyBuffer(cArr1, size*sizeof(char), recvCb, CK_BUFFER_UNREG);
+    CkNcpyBuffer myDest1(iArr1, size*sizeof(int), recvCb, CK_BUFFER_UNREG);
+    CkNcpyBuffer myDest2(dArr1, size*sizeof(double), recvCb, CK_BUFFER_UNREG);
+    CkNcpyBuffer myDest3(cArr1, size*sizeof(char), recvCb, CK_BUFFER_UNREG);
 
     // Index 1 Getting from 0
     myDest1.get(src1);
index a8e87981feb191aa084269aa1827e538ede3ba34..dd6c5eb94d2bd79feeed4dc14bcf5be2947f4451 100644 (file)
@@ -10,8 +10,8 @@ mainmodule simple_direct {
   array [1D] Ping1 {
     entry Ping1(int size);
     entry void start();
-    entry void senderCallback();
-    entry void receiverCallback();
+    entry void senderCallback(CkDataMsg *m);
+    entry void receiverCallback(CkDataMsg *m);
     entry void recvNcpyInfo(CkNcpyBuffer src1, CkNcpyBuffer src2, CkNcpyBuffer src3, CkNcpyBuffer dest1, CkNcpyBuffer dest2, CkNcpyBuffer dest3);
   };
 
index 4e335eeb72d9c82fe9ab5e5e0823ee86625140b7..b5b63efe9c22b569f7b53ac623228812917e7383 100644 (file)
@@ -63,8 +63,6 @@ class Ping1 : public CBase_Ping1
   int size;
   int otherIndex, cbCounter, valCounter;
   CkCallback cb;
-  CkNcpyBuffer myDest1, myDest2, myDest3;
-  CkNcpyBuffer mySrc1, mySrc2, mySrc3;
 
 public:
   Ping1(int size)
@@ -101,17 +99,17 @@ public:
     const void *refPtr = &valCounter;
 
     cb.setRefNum(1);
-    mySrc1 = CkNcpyBuffer(iArr1, size*sizeof(int), cb, CK_BUFFER_UNREG);
+    CkNcpyBuffer mySrc1(iArr1, size*sizeof(int), cb, CK_BUFFER_UNREG);
     ACK_DEBUG(("[%d][%d][%d] Setting source Ref: Buffer Ptr: %p, Reference Ptr: %p\n", thisIndex, CkMyPe(), CkMyNode(), iArr1, refPtr));
     mySrc1.setRef(refPtr);
 
     cb.setRefNum(2);
-    mySrc2 = CkNcpyBuffer(dArr1, size*sizeof(double), cb, CK_BUFFER_UNREG);
+    CkNcpyBuffer mySrc2(dArr1, size*sizeof(double), cb, CK_BUFFER_UNREG);
     ACK_DEBUG(("[%d][%d][%d] Setting source Ref: Buffer Ptr: %p, Reference Ptr: %p\n", thisIndex, CkMyPe(), CkMyNode(), dArr1, refPtr));
     mySrc2.setRef(refPtr);
 
     cb.setRefNum(3);
-    mySrc3 = CkNcpyBuffer(cArr1, size*sizeof(char), cb, CK_BUFFER_UNREG);
+    CkNcpyBuffer mySrc3(cArr1, size*sizeof(char), cb, CK_BUFFER_UNREG);
     ACK_DEBUG(("[%d][%d][%d] Setting source Ref: Buffer Ptr: %p, Reference Ptr: %p\n", thisIndex, CkMyPe(), CkMyNode(), cArr1, refPtr));
     mySrc3.setRef(refPtr);
 
@@ -144,11 +142,10 @@ public:
     // Verify that reference pointer is equal to the reference pointer returned
     CkAssert(&valCounter == src->ref);
 
+    // Deregister the source object
+    src->deregisterMem();
+
     if(cbCounter == 3) {
-      // Release Resources for my sources
-      mySrc1.deregisterMem();
-      mySrc2.deregisterMem();
-      mySrc3.deregisterMem();
       CkPrintf("[%d][%d][%d] Get Source Done\n", thisIndex, CkMyPe(), CkMyNode());
       sendValidationData();
     }
@@ -180,11 +177,10 @@ public:
     // Verify that reference pointer is equal to the reference pointer returned
     CkAssert(&valCounter == dest->ref);
 
+    // Deregister the destination object
+    dest->deregisterMem();
+
     if(cbCounter == 3) {
-      // Release Resources for my destinations
-      myDest1.deregisterMem();
-      myDest2.deregisterMem();
-      myDest3.deregisterMem();
       CkPrintf("[%d][%d][%d] Get Destination Done\n", thisIndex, CkMyPe(), CkMyNode());
       thisProxy[otherIndex].sendValidationData();
     }
@@ -214,17 +210,17 @@ public:
 
     // Create nocopy destination for me to Get into
     cb.setRefNum(1);
-    myDest1 = CkNcpyBuffer(iArr1, size*sizeof(int), cb, CK_BUFFER_UNREG);
+    CkNcpyBuffer myDest1(iArr1, size*sizeof(int), cb, CK_BUFFER_UNREG);
     ACK_DEBUG(("[%d][%d][%d] Setting destination Ref: Buffer Ptr: %p, Reference Ptr: %p\n", thisIndex, CkMyPe(), CkMyNode(), iArr1, refPtr));
     myDest1.setRef(refPtr);
 
     cb.setRefNum(2);
-    myDest2 = CkNcpyBuffer(dArr1, size*sizeof(double), cb, CK_BUFFER_UNREG);
+    CkNcpyBuffer myDest2(dArr1, size*sizeof(double), cb, CK_BUFFER_UNREG);
     ACK_DEBUG(("[%d][%d][%d] Setting destination Ref: Buffer Ptr: %p, Reference Ptr: %p\n", thisIndex, CkMyPe(), CkMyNode(), dArr1, refPtr));
     myDest2.setRef(refPtr);
 
     cb.setRefNum(3);
-    myDest3 = CkNcpyBuffer(cArr1, size*sizeof(char), cb, CK_BUFFER_UNREG);
+    CkNcpyBuffer myDest3(cArr1, size*sizeof(char), cb, CK_BUFFER_UNREG);
     ACK_DEBUG(("[%d][%d][%d] Setting destination Ref: Buffer Ptr: %p, Reference Ptr: %p\n", thisIndex, CkMyPe(), CkMyNode(), cArr1, refPtr));
     myDest3.setRef(refPtr);
 
index 605987cfd494540d72eea8b880490768e48389d5..279e13f3b73a707277b5499f5533c1abf1d30c29 100644 (file)
@@ -61,8 +61,6 @@ class Ping1 : public CBase_Ping1
   int size;
   int otherIndex, cbCounter, valCounter;
   CkCallback cb;
-  CkNcpyBuffer myDest1, myDest2, myDest3;
-  CkNcpyBuffer mySrc1, mySrc2, mySrc3;
 
 public:
   Ping1(int size)
@@ -75,13 +73,13 @@ public:
       assignValues(dArr1, size);
       assignCharValues(cArr1, size);
       // Set PUT Sender callback
-      cb = CkCallback(CkIndex_Ping1::putSenderDone(), thisProxy[thisIndex]);
+      cb = CkCallback(CkIndex_Ping1::putSenderDone(NULL), thisProxy[thisIndex]);
     } else {
       iArr1 = new int[size];
       cArr1 = new char[size];
       dArr1 = new double[size];
       // Set PUT Receiver callback
-      cb = CkCallback(CkIndex_Ping1::putReceiverDone(), thisProxy[thisIndex]);
+      cb = CkCallback(CkIndex_Ping1::putReceiverDone(NULL), thisProxy[thisIndex]);
     }
 
     otherIndex = (thisIndex + 1) % 2;
@@ -94,37 +92,39 @@ public:
   void start()
   {
     CkAssert(thisIndex == 1);
-    myDest1 = CkNcpyBuffer(iArr1, size*sizeof(int), cb, CK_BUFFER_UNREG);
-    myDest2 = CkNcpyBuffer(dArr1, size*sizeof(double), cb, CK_BUFFER_UNREG);
-    myDest3 = CkNcpyBuffer(cArr1, size*sizeof(char), cb, CK_BUFFER_UNREG);
+    CkNcpyBuffer myDest1(iArr1, size*sizeof(int), cb, CK_BUFFER_UNREG);
+    CkNcpyBuffer myDest2(dArr1, size*sizeof(double), cb, CK_BUFFER_UNREG);
+    CkNcpyBuffer myDest3(cArr1, size*sizeof(char), cb, CK_BUFFER_UNREG);
 
     // Send my destinations to Index 0; Index 0 performs Puts into these destinations
     thisProxy[otherIndex].recvNcpyInfo(myDest1, myDest2, myDest3);
   }
 
   // Executed on Index 0 (which calls put)
-  void putSenderDone(){
+  void putSenderDone(CkDataMsg *m){
     CkAssert(thisIndex == 0);
     cbCounter++;
+
+    // Cast m->data as (CkNcpyBuffer *)
+    CkNcpyBuffer *src = (CkNcpyBuffer *)(m->data);
+    src->deregisterMem();
+
     if(cbCounter == 3) {
-      // Release Resources for my sources
-      mySrc1.deregisterMem();
-      mySrc2.deregisterMem();
-      mySrc3.deregisterMem();
       CkPrintf("[%d][%d][%d] Put Source Done\n", thisIndex, CkMyPe(), CkMyNode());
       sendValidationData();
     }
   }
 
   // Executed on Index 1 (which receives data from put)
-  void putReceiverDone(){
+  void putReceiverDone(CkDataMsg *m){
     CkAssert(thisIndex == 1);
     cbCounter++;
+
+    // Cast m->data as (CkNcpyBuffer *)
+    CkNcpyBuffer *dest = (CkNcpyBuffer *)(m->data);
+    dest->deregisterMem();
+
     if(cbCounter == 3) {
-      // Release Resources for my destinations
-      myDest1.deregisterMem();
-      myDest2.deregisterMem();
-      myDest3.deregisterMem();
       CkPrintf("[%d][%d][%d] Put Destination Done\n", thisIndex, CkMyPe(), CkMyNode());
       thisProxy[otherIndex].sendValidationData();
     }
@@ -148,9 +148,9 @@ public:
   {
     CkAssert(thisIndex == 0);
     // Create nocopy sources for me to Put into
-    mySrc1 = CkNcpyBuffer(iArr1, size*sizeof(int), cb, CK_BUFFER_UNREG);
-    mySrc2 = CkNcpyBuffer(dArr1, size*sizeof(double), cb, CK_BUFFER_UNREG);
-    mySrc3 = CkNcpyBuffer(cArr1, size*sizeof(char), cb, CK_BUFFER_UNREG);
+    CkNcpyBuffer mySrc1(iArr1, size*sizeof(int), cb, CK_BUFFER_UNREG);
+    CkNcpyBuffer mySrc2(dArr1, size*sizeof(double), cb, CK_BUFFER_UNREG);
+    CkNcpyBuffer mySrc3(cArr1, size*sizeof(char), cb, CK_BUFFER_UNREG);
 
     // Perform Puts from my sources into Index 1's destinations
     mySrc1.put(dest1);
index e41bbf3c15ff31be05d74a9885feba54b89274ed..2e90284e1bd56bafe0b2fc88fbc2ba7f1d54a2a5 100644 (file)
@@ -10,8 +10,8 @@ mainmodule simple_put {
   array [1D] Ping1 {
     entry Ping1(int size);
     entry void start();
-    entry void putSenderDone();
-    entry void putReceiverDone();
+    entry void putSenderDone(CkDataMsg *msg);
+    entry void putReceiverDone(CkDataMsg *msg);
     entry void recvNcpyInfo(CkNcpyBuffer dest1, CkNcpyBuffer dest2, CkNcpyBuffer dest3);
     entry void sendValidationData();
     entry void validatePutData(int iArr2[size], double dArr2[size], char cArr2[size], int size);
index 0110b0435dc5e5b6e69c5ae6452d553d2f35fdbd..b16aebf06adc2afa5b87b1b1a4c0c246a5f5f595 100644 (file)
@@ -353,7 +353,7 @@ void LrtsSetRdmaBufferInfo(void *info, const void *ptr, int size, unsigned short
 // Perform an RDMA Get call into the local destination address from the remote source address
 void LrtsIssueRget(NcpyOperationInfo *ncpyOpInfo) {
 
-  if(ncpyOpInfo->srcMode == CMK_BUFFER_UNREG) {
+  if(ncpyOpInfo->isSrcRegistered == 0) {
     // Remote buffer is unregistered, send a message to register it and perform PUT
 
 #if CMK_SMP
@@ -493,7 +493,7 @@ void deregisterDirectMem(gni_mem_handle_t mem_hndl, int pe) {
 
 // Method invoked to deregister memory handle
 void LrtsDeregisterMem(const void *ptr, void *info, int pe, unsigned short int mode){
-  if(mode == CMK_BUFFER_REG || (mode == CMK_BUFFER_PREREG && SIZEFIELD(ptr) >= BIG_MSG)) {
+  if(mode == CMK_BUFFER_REG) {
     CmiGNIRzvRdmaPtr_t *destInfo = (CmiGNIRzvRdmaPtr_t *)info;
     deregisterDirectMem(destInfo->mem_hndl, pe);
   }
index 462944bf261da67770a0e80c5b75afbcafe16761..8a800f689198df40f66fafc3cce4ced57e69995e 100644 (file)
@@ -18,8 +18,8 @@ void process_onesided_completion_ack(struct fi_cq_tagged_entry *e, OFIRequest *r
   fi_close(mr);
 }
 
-struct fid_mr* registerDirectMemory(const void *addr, int size) {
-  struct fid_mr *mr;
+void registerDirectMemory(void *info, const void *addr, int size) {
+  CmiOfiRdmaPtr_t *rdmaInfo = (CmiOfiRdmaPtr_t *)info;
   uint64_t requested_key = 0;
   int ret;
 
@@ -33,12 +33,12 @@ struct fid_mr* registerDirectMemory(const void *addr, int size) {
                   0ULL,
                   requested_key,
                   0ULL,
-                  &mr,
+                  &(rdmaInfo->mr),
                   NULL);
   if (ret) {
     CmiAbort("registerDirectMemory: fi_mr_reg failed!\n");
   }
-  return mr;
+  rdmaInfo->key = fi_mr_key(rdmaInfo->mr);
 }
 
 
@@ -180,27 +180,7 @@ void LrtsIssueRgets(void *recv, int pe) {
 
 // Set the machine specific information for a nocopy pointer
 void LrtsSetRdmaBufferInfo(void *info, const void *ptr, int size, unsigned short int mode){
-  CmiOfiRdmaPtr_t *rdmaDest = (CmiOfiRdmaPtr_t *)info;
-  uint64_t requested_key = 0;
-  int ret;
-
-  /* Register the destination buffer */
-  if(FI_MR_SCALABLE == context.mr_mode) {
-    requested_key = __sync_fetch_and_add(&(context.mr_counter), 1);
-  }
-  ret = fi_mr_reg(context.domain,
-                  ptr,
-                  size,
-                  FI_REMOTE_READ | FI_REMOTE_WRITE | FI_READ | FI_WRITE,
-                  0ULL,
-                  requested_key,
-                  0ULL,
-                  &(rdmaDest->mr),
-                  NULL);
-  if (ret) {
-    CmiAbort("LrtsSetRdmaBufferInfo: fi_mr_reg failed!\n");
-  }
-  rdmaDest->key = fi_mr_key(rdmaDest->mr);
+  registerDirectMemory(info, ptr, size);
 }
 
 static inline void ofi_onesided_direct_operation_callback(struct fi_cq_tagged_entry *e, OFIRequest *req)
@@ -233,7 +213,10 @@ void process_onesided_reg_and_put(struct fi_cq_tagged_entry *e, OFIRequest *req)
   // Do not free as this message
   ncpyOpInfo->freeMe = 0;
 
-  struct fid_mr *mr = registerDirectMemory(ncpyOpInfo->srcPtr, ncpyOpInfo->srcSize);
+  registerDirectMemory(ncpyOpInfo->srcLayerInfo + CmiGetRdmaCommonInfoSize(),
+                       ncpyOpInfo->srcPtr,
+                       ncpyOpInfo->srcSize);
+
   const char *rbuf  = (FI_MR_SCALABLE == context.mr_mode) ? 0 : (const char*)(ncpyOpInfo->destPtr);
 
   // Allocate a completion object for tracking write completion and ack handling
@@ -247,7 +230,7 @@ void process_onesided_reg_and_put(struct fi_cq_tagged_entry *e, OFIRequest *req)
       CmiNodeOf(ncpyOpInfo->destPe),
       ((CmiOfiRdmaPtr_t *)((char *)(ncpyOpInfo->destLayerInfo) + CmiGetRdmaCommonInfoSize()))->key,
       ncpyOpInfo->srcSize,
-      mr,
+      ((CmiOfiRdmaPtr_t *)((char *)(ncpyOpInfo->srcLayerInfo) + CmiGetRdmaCommonInfoSize()))->mr,
       ofi_onesided_direct_operation_callback,
       (void *)rdmaComp,
       &(rdmaComp->completion_count),
@@ -264,7 +247,10 @@ void process_onesided_reg_and_get(struct fi_cq_tagged_entry *e, OFIRequest *req)
   NcpyOperationInfo *ncpyOpInfo = (NcpyOperationInfo *)(data);
   resetNcpyOpInfoPointers(ncpyOpInfo);
 
-  struct fid_mr *mr = registerDirectMemory(ncpyOpInfo->destPtr, ncpyOpInfo->srcSize);
+  registerDirectMemory(ncpyOpInfo->destLayerInfo + CmiGetRdmaCommonInfoSize(),
+                       ncpyOpInfo->destPtr,
+                       ncpyOpInfo->srcSize);
+
   const char *rbuf  = (FI_MR_SCALABLE == context.mr_mode) ? 0 : (const char*)(ncpyOpInfo->srcPtr);
 
   // Allocate a completion object for tracking write completion and ack handling
@@ -278,7 +264,7 @@ void process_onesided_reg_and_get(struct fi_cq_tagged_entry *e, OFIRequest *req)
       CmiNodeOf(ncpyOpInfo->srcPe),
       ((CmiOfiRdmaPtr_t *)((char *)(ncpyOpInfo->srcLayerInfo) + CmiGetRdmaCommonInfoSize()))->key,
       ncpyOpInfo->srcSize,
-      mr,
+      ((CmiOfiRdmaPtr_t *)((char *)(ncpyOpInfo->destLayerInfo) + CmiGetRdmaCommonInfoSize()))->mr,
       ofi_onesided_direct_operation_callback,
       (void *)rdmaComp,
       &(rdmaComp->completion_count),
@@ -291,7 +277,7 @@ void LrtsIssueRget(NcpyOperationInfo *ncpyOpInfo) {
 
   OFIRequest *req;
 
-  if(ncpyOpInfo->srcMode == CMK_BUFFER_UNREG) {
+  if(ncpyOpInfo->isSrcRegistered == 0) {
     // Remote buffer is unregistered, send a message to register it and perform PUT
 #if USE_OFIREQUEST_CACHE
     req = alloc_request(context.request_cache);
@@ -344,7 +330,7 @@ void LrtsIssueRput(NcpyOperationInfo *ncpyOpInfo) {
 
   OFIRequest *req;
 
-  if(ncpyOpInfo->destMode == CMK_BUFFER_UNREG) {
+  if(ncpyOpInfo->isDestRegistered == 0) {
     // Remote buffer is unregistered, send a message to register it and perform PUT
 #if USE_OFIREQUEST_CACHE
     req = alloc_request(context.request_cache);
@@ -394,15 +380,13 @@ void LrtsIssueRput(NcpyOperationInfo *ncpyOpInfo) {
 
 // Method invoked to deregister memory handle
 void LrtsDeregisterMem(const void *ptr, void *info, int pe, unsigned short int mode){
-  if(mode == CMK_BUFFER_REG) {
-    CmiOfiRdmaPtr_t *rdmaSrc = (CmiOfiRdmaPtr_t *)info;
-    int ret;
-
-    // Deregister the buffer
-    if(rdmaSrc->mr) {
-      ret = fi_close((struct fid *)rdmaSrc->mr);
-      if(ret)
-        CmiAbort("LrtsDeregisterMem: fi_close(mr) failed!\n");
-    }
+  CmiOfiRdmaPtr_t *rdmaSrc = (CmiOfiRdmaPtr_t *)info;
+  int ret;
+
+  // Deregister the buffer
+  if(rdmaSrc->mr) {
+    ret = fi_close((struct fid *)rdmaSrc->mr);
+    if(ret)
+      CmiAbort("LrtsDeregisterMem: fi_close(mr) failed!\n");
   }
 }
index 0a4aa53efcc422c943253f8a34a164ca4d769867..1d3c3acd9e379f460c9b3a7e77340e3561fa4fdc 100644 (file)
@@ -1872,15 +1872,20 @@ static inline void processRecvWC(struct ibv_wc *recvWC,const int toBuffer){
                
                resetNcpyOpInfoPointers(newNcpyOpInfo);
                
-               struct ibv_mr *mr = registerDirectMemory(newNcpyOpInfo->srcPtr, newNcpyOpInfo->srcSize);
+               registerDirectMemory(newNcpyOpInfo->srcLayerInfo + CmiGetRdmaCommonInfoSize(),
+                                    newNcpyOpInfo->srcPtr,
+                                    newNcpyOpInfo->srcSize);
+               // Set the source as registered
+               newNcpyOpInfo->isSrcRegistered = 1;
+               
                struct infiRdmaPacket *rdmaPacket = (struct infiRdmaPacket *)malloc(sizeof(struct infiRdmaPacket));
                rdmaPacket->type = INFI_ONESIDED_DIRECT;
                rdmaPacket->localBuffer = newNcpyOpInfo;
                
                postRdma((uint64_t)(newNcpyOpInfo->srcPtr),
-                       mr->lkey,
+                       ((CmiVerbsRdmaPtr_t *)((char *)(newNcpyOpInfo->srcLayerInfo) + CmiGetRdmaCommonInfoSize()))->key,
                        (uint64_t)(newNcpyOpInfo->destPtr),
-            ((CmiVerbsRdmaPtr_t *)((char *)(newNcpyOpInfo->destLayerInfo) + CmiGetRdmaCommonInfoSize()))->key,
+                       ((CmiVerbsRdmaPtr_t *)((char *)(newNcpyOpInfo->destLayerInfo) + CmiGetRdmaCommonInfoSize()))->key,
                        newNcpyOpInfo->srcSize,
                        newNcpyOpInfo->destPe,
                        (uint64_t)rdmaPacket,
@@ -1895,14 +1900,18 @@ static inline void processRecvWC(struct ibv_wc *recvWC,const int toBuffer){
                
                resetNcpyOpInfoPointers(newNcpyOpInfo);
                
-               struct ibv_mr *mr = registerDirectMemory(newNcpyOpInfo->destPtr, newNcpyOpInfo->srcSize);
+               registerDirectMemory(newNcpyOpInfo->destLayerInfo + CmiGetRdmaCommonInfoSize(),
+                                    newNcpyOpInfo->destPtr,
+                                    newNcpyOpInfo->srcSize);
+               // Set the destination as registered
+               newNcpyOpInfo->isDestRegistered = 1;
                
                struct infiRdmaPacket *rdmaPacket = (struct infiRdmaPacket *)malloc(sizeof(struct infiRdmaPacket));
                rdmaPacket->type = INFI_ONESIDED_DIRECT;
                rdmaPacket->localBuffer = newNcpyOpInfo;
                
                postRdma((uint64_t)newNcpyOpInfo->destPtr,
-                       mr->lkey,
+                       ((CmiVerbsRdmaPtr_t *)((char *)(newNcpyOpInfo->destLayerInfo) + CmiGetRdmaCommonInfoSize()))->key,
                        (uint64_t)newNcpyOpInfo->srcPtr,
                        ((CmiVerbsRdmaPtr_t *)((char *)(newNcpyOpInfo->srcLayerInfo) + CmiGetRdmaCommonInfoSize()))->key,
                        newNcpyOpInfo->srcSize,
index 3fad1dde0cb0be55ae6af089a5f3777a171d97dc..1b4997f660f148534a5238d35e223dd26ff346b1 100644 (file)
@@ -155,23 +155,26 @@ void LrtsSetRdmaBufferInfo(void *info, const void *ptr, int size, unsigned short
   if (!mr) {
     CmiAbort("Memory Registration Failed in LrtsSetRdmaBufferInfo!\n");
   }
-  CmiVerbsRdmaPtr_t *rdmaSrc = (CmiVerbsRdmaPtr_t *)info;
-  rdmaSrc->mr = mr;
-  rdmaSrc->key = mr->rkey;
+  CmiVerbsRdmaPtr_t *rdmaInfo = (CmiVerbsRdmaPtr_t *)info;
+  rdmaInfo->mr = mr;
+  rdmaInfo->key = mr->rkey;
 }
 
-struct ibv_mr* registerDirectMemory(const void *addr, int size) {
+void registerDirectMemory(void *info, const void *addr, int size) {
   struct ibv_mr *mr = ibv_reg_mr(context->pd, (void *)addr, size, IBV_ACCESS_LOCAL_WRITE | IBV_ACCESS_REMOTE_WRITE | IBV_ACCESS_REMOTE_READ);
   if (!mr) {
     CmiAbort("Memory Registration inside registerDirectMemory!\n");
   }
-  return mr;
+  CmiVerbsRdmaPtr_t *rdmaInfo = (CmiVerbsRdmaPtr_t *)info;
+  rdmaInfo->mr = mr;
+  rdmaInfo->key = mr->rkey;
 }
 
 // Perform an RDMA Get call into the local destination address from the remote source address
 void LrtsIssueRget(NcpyOperationInfo *ncpyOpInfo) {
 
-  if(ncpyOpInfo->srcMode == CMK_BUFFER_UNREG) {
+  if(ncpyOpInfo->isSrcRegistered == 0) {
+
     // Remote buffer is unregistered, send a message to register it and perform PUT
     infiPacket packet;
     MallocInfiPacket(packet);
@@ -208,7 +211,7 @@ void LrtsIssueRget(NcpyOperationInfo *ncpyOpInfo) {
 // Perform an RDMA Put call into the remote destination address from the local source address
 void LrtsIssueRput(NcpyOperationInfo *ncpyOpInfo) {
 
-  if(ncpyOpInfo->destMode == CMK_BUFFER_UNREG) {
+  if(ncpyOpInfo->isDestRegistered == 0) {
     // Remote buffer is unregistered, send a message to register it and perform GET
     infiPacket packet;
     MallocInfiPacket(packet);
@@ -244,10 +247,9 @@ void LrtsIssueRput(NcpyOperationInfo *ncpyOpInfo) {
 
 // Method invoked to deregister a memory handle
 void LrtsDeregisterMem(const void *ptr, void *info, int pe, unsigned short int mode){
-  if(mode == CMK_BUFFER_REG) {
-    CmiVerbsRdmaPtr_t *rdmadest = (CmiVerbsRdmaPtr_t *)info;
-    if (ibv_dereg_mr(rdmadest->mr)) {
-      CmiAbort("ibv_dereg_mr() failed at LrtsDeregisterMem\n");
-    }
+  CmiVerbsRdmaPtr_t *rdmadest = (CmiVerbsRdmaPtr_t *)info;
+
+  if (ibv_dereg_mr(rdmadest->mr)) {
+    CmiAbort("ibv_dereg_mr() failed at LrtsDeregisterMem\n");
   }
 }
index 1e4c5ded0d45c3588c2e90d06bee708fc98abdfb..b1770aa4087e13dfd581a56bab8603924072eb72 100644 (file)
@@ -190,5 +190,5 @@ void LrtsIssueRput(
   unsigned short int *srcMode,
   int size);
 
-struct ibv_mr* registerDirectMemory(const void *addr, int size);
+void registerDirectMemory(void *info, const void *addr, int size);
 
index 794bedbdd176f886df5ce21b094f01a7956011e1..f6adfc6ac34577ea6c2a404687d892f1f4b1d1f6 100644 (file)
@@ -423,7 +423,6 @@ void CkNcpyBuffer::rdmaGet(CkNcpyBuffer &source) {
     CmiSetRdmaBufferInfo(layerInfo + CmiGetRdmaCommonInfoSize(), ptr, cnt, mode);
 
     isRegistered = true;
-    mode = CK_BUFFER_REG;
   }
 
   // Create a general object that can be used across layers and can store the state of the CkNcpyBuffer objects
@@ -531,7 +530,6 @@ void CkNcpyBuffer::rdmaPut(CkNcpyBuffer &destination) {
     CmiSetRdmaBufferInfo(layerInfo + CmiGetRdmaCommonInfoSize(), ptr, cnt, mode);
 
     isRegistered = true;
-    mode = CK_BUFFER_REG;
   }
 
   // Create a general object that can be used across layers that can store the state of the CkNcpyBuffer objects
index 846d2433bee4ccf704952ddd62ebc796e9339485..2334135b248ffc01e377b4566dc3ae36b1a9c06a 100644 (file)
@@ -191,8 +191,8 @@ class CkNcpyBuffer{
 #endif
       {
         CmiSetRdmaBufferInfo(layerInfo + CmiGetRdmaCommonInfoSize(), ptr, cnt, mode);
+        isRegistered = true;
       }
-      isRegistered = true;
     }
   }
 
@@ -221,10 +221,11 @@ class CkNcpyBuffer{
       return;
 
 #if CMK_REG_REQUIRED
-    CmiDeregisterMem(ptr, layerInfo + CmiGetRdmaCommonInfoSize(), pe, mode);
+    if(mode != CK_BUFFER_PREREG && mode != CK_BUFFER_NOREG) {
+      CmiDeregisterMem(ptr, layerInfo + CmiGetRdmaCommonInfoSize(), pe, mode);
+      isRegistered = false;
+    }
 #endif
-
-    isRegistered = false;
   }
 
   void pup(PUP::er &p) {