Zerocopy Direct API: Set CK_BUFFER_REG as the default mode 22/4322/3
authorNitin Bhat <nbhat4@illinois.edu>
Fri, 29 Jun 2018 21:37:39 +0000 (14:37 -0700)
committerNitin Bhat <nbhat4@illinois.edu>
Mon, 2 Jul 2018 22:25:30 +0000 (17:25 -0500)
Change-Id: I11fee6019c0e727a22b41935bb1aac7efeed7e46

doc/charm++/zerocopyapi.tex
examples/charm++/zerocopy/direct_api/reg/get_put_pingpong/get_put_pingpong.C
examples/charm++/zerocopy/direct_api/reg/pingpong/pingpong.C
examples/charm++/zerocopy/direct_api/reg/simple_get/simple_get.C
examples/charm++/zerocopy/direct_api/reg/simple_put/simple_put.C
examples/charm++/zerocopy/direct_api/unreg/get_put_pingpong/get_put_pingpong.C
examples/charm++/zerocopy/direct_api/unreg/pingpong/pingpong.C
examples/charm++/zerocopy/direct_api/unreg/simple_get/simple_get.C
examples/charm++/zerocopy/direct_api/unreg/simple_put/simple_put.C
src/ck-core/ckrdma.h

index e2bd3accee16cc9e05422e92967c9c2a206ce77e..1bec4fcc6b0c7c79f8de903eb1481a93a22984d8 100644 (file)
@@ -48,7 +48,7 @@ object and an optional mode parameter.
 \begin{alltt}
 CkCallback srcCb(CkIndex_Ping1::sourceDone, thisProxy[thisIndex]);
 // CkNcpyBuffer object representing the source buffer
-CkNcpyBuffer source(arr1, arr1Size * sizeof(int), srcCb, CK_BUFFER_UNREG);
+CkNcpyBuffer source(arr1, arr1Size * sizeof(int), srcCb, CK_BUFFER_REG);
 \end{alltt}
 
 When used inside a \kw{CkNcpyBuffer} object that represents the source buffer
@@ -62,7 +62,7 @@ determine the network registration mode for the buffer. It is only relevant
 on networks requiring explicit memory registration for performing RDMA operations.
 These networks include GNI, OFI and Verbs. When the mode is not specified by
 the user, the default mode is considered to be
-CK\textunderscore BUFFER\textunderscore UNREG.
+CK\textunderscore BUFFER\textunderscore REG.
 
 Similarly, to receive an array using the Zero copy Direct API, define another
 \kw{CkNcpyBuffer} object on the receiver chare object specifying the
@@ -78,7 +78,7 @@ parameter.
 \begin{alltt}
 CkCallback destCb(CkIndex_Ping1::destinationDone, thisProxy[thisIndex]);
 // CkNcpyBuffer object representing the destination buffer
-CkNcpyBuffer dest(arr2, arr2Size * sizeof(int), destCb, CK_BUFFER_UNREG);
+CkNcpyBuffer dest(arr2, arr2Size * sizeof(int), destCb, CK_BUFFER_REG);
 \end{alltt}
 
 Once the source \kw{CkNcpyBuffer} and destination \kw{CkNcpyBuffer} objects have
@@ -168,7 +168,7 @@ The following code snippet illustrates the usage of the \texttt{setRef} method.
 
 \begin{alltt}
 const void *refPtr = &index;
-CkNcpyBuffer source(arr1, arr1Size * sizeof(int), srcCb, CK_BUFFER_UNREG);
+CkNcpyBuffer source(arr1, arr1Size * sizeof(int), srcCb, CK_BUFFER_REG);
 source.setRef(refPtr);
 \end{alltt}
 
@@ -231,29 +231,28 @@ network memory management is not necessary (Netlrts) or is internally handled by
 layer networking API (PAMI, MPI), these switches are still supported to maintain API
 consistency by all behaving in the similar default mode of operation.
 
-\paragraph{\texttt{CK\textunderscore BUFFER\textunderscore UNREG}:}
-\texttt{CK\textunderscore BUFFER\textunderscore UNREG} is the default mode that
-is used when no mode is passed. When this mode is passed, the buffer
-is initially unregistered and it is registered only for network transfers where
-registration is absolutely required. For example, if the target buffer is on the same
-PE or same logical node (or process), since the \kw{get} internally performs a memcpy,
-registration is avoided for non-network 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
-\texttt{CK\textunderscore BUFFER\textunderscore REG} from
-\texttt{CK\textunderscore BUFFER\textunderscore UNREG}. This mode is demonstrated in
-\examplerefdir{zerocopy/direct\textunderscore api/unreg}
-
 \paragraph{\texttt{CK\textunderscore BUFFER\textunderscore REG}:}
-\texttt{CK\textunderscore BUFFER\textunderscore REG} doesn't distinguish between
+\texttt{CK\textunderscore BUFFER\textunderscore REG} is the default mode that
+is used when no mode is passed. This mode doesn't distinguish between
 non-network and network data transfers. When this mode is passed, the buffer
 is registered immediately and this can be used for both non-network sends (memcpy)
 and network sends without requiring an extra message being sent by the runtime system
 for the latter case. This mode is demonstrated in
 \examplerefdir{zerocopy/direct\textunderscore api/reg}
 
+\paragraph{\texttt{CK\textunderscore BUFFER\textunderscore UNREG}:}
+When this mode is passed, the buffer is initially unregistered and it is
+registered only for network transfers where registration is absolutely required.
+For example, if the target buffer is on the same PE or same logical node (or process),
+since the \kw{get} internally performs a memcpy, registration is avoided for non-network
+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 \texttt{CK\textunderscore BUFFER\textunderscore REG} from
+\texttt{CK\textunderscore BUFFER\textunderscore UNREG}. This mode is demonstrated in
+\examplerefdir{zerocopy/direct\textunderscore api/unreg}
+
 \paragraph{\texttt{CK\textunderscore BUFFER\textunderscore PREREG}:}
 This mode is only beneficial by implementations that use pre-registered memory pools.
 In \charmpp{}, GNI and Verbs machine layers use pre-registered memory pools for avoiding
index 649f33241419c4590e2929a9323f2c706b4baeff..a31dbfd81485a311c16227673f789eea4dddd0f1 100644 (file)
@@ -87,17 +87,17 @@ public:
   void start()
   {
     CkAssert(thisIndex == 0);
-    mySrc1 = CkNcpyBuffer(iArr1, size*sizeof(int), sendCb, CK_BUFFER_REG);
-    mySrc2 = CkNcpyBuffer(dArr1, size*sizeof(double), sendCb, CK_BUFFER_REG);
-    mySrc3 = CkNcpyBuffer(cArr1, size*sizeof(char), sendCb, CK_BUFFER_REG);
+    mySrc1 = CkNcpyBuffer(iArr1, size*sizeof(int), sendCb);
+    mySrc2 = CkNcpyBuffer(dArr1, size*sizeof(double), sendCb);
+    mySrc3 = CkNcpyBuffer(cArr1, size*sizeof(char), sendCb);
 
     iArr2 = new int[size];
     dArr2 = new double[size];
     cArr2 = new char[size];
 
-    myDest1 = CkNcpyBuffer(iArr2, size*sizeof(int), recvCb, CK_BUFFER_REG);
-    myDest2 = CkNcpyBuffer(dArr2, size*sizeof(double), recvCb, CK_BUFFER_REG);
-    myDest3 = CkNcpyBuffer(cArr2, size*sizeof(char), recvCb, CK_BUFFER_REG);
+    myDest1 = CkNcpyBuffer(iArr2, size*sizeof(int), recvCb);
+    myDest2 = CkNcpyBuffer(dArr2, size*sizeof(double), recvCb);
+    myDest3 = CkNcpyBuffer(cArr2, size*sizeof(char), recvCb);
 
     thisProxy[otherIndex].recvNcpyInfo(mySrc1, mySrc2, mySrc3, myDest1, myDest2, myDest3);
   }
@@ -133,9 +133,9 @@ public:
         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_REG);
-        mySrc2 = CkNcpyBuffer(dArr1, sizeof(double)*size, sendCb, CK_BUFFER_REG);
-        mySrc3 = CkNcpyBuffer(cArr1, sizeof(char)*size, sendCb, CK_BUFFER_REG);
+        mySrc1 = CkNcpyBuffer(iArr1, sizeof(int)*size, sendCb);
+        mySrc2 = CkNcpyBuffer(dArr1, sizeof(double)*size, sendCb);
+        mySrc3 = CkNcpyBuffer(cArr1, sizeof(char)*size, sendCb);
 
         // Index 1 Putting to 0
         mySrc1.put(otherDest1);
@@ -165,9 +165,9 @@ public:
     otherDest3 = dest3;
 
     // Create nocopy destinations for me to Get from sources received
-    myDest1 = CkNcpyBuffer(iArr1, size*sizeof(int), recvCb, CK_BUFFER_REG);
-    myDest2 = CkNcpyBuffer(dArr1, size*sizeof(double), recvCb, CK_BUFFER_REG);
-    myDest3 = CkNcpyBuffer(cArr1, size*sizeof(char), recvCb, CK_BUFFER_REG);
+    myDest1 = CkNcpyBuffer(iArr1, size*sizeof(int), recvCb);
+    myDest2 = CkNcpyBuffer(dArr1, size*sizeof(double), recvCb);
+    myDest3 = CkNcpyBuffer(cArr1, size*sizeof(char), recvCb);
 
     // Index 1 Getting from 0
     myDest1.get(src1);
index 82341b8b0c010100a5664de54c20480e69aa85c9..59dab9f965d7b3f2f2d5e9f67a5490859e677425 100644 (file)
@@ -105,11 +105,11 @@ class Ping1 : public CBase_Ping1
   void setupGetGetPingpong(int size) {
     // Source callback and Ncpy object
     CkCallback srcCb = CkCallback(CkCallback::ignore);
-    mySrc = CkNcpyBuffer(nocopyMsg, sizeof(char)*size, srcCb, CK_BUFFER_REG);
+    mySrc = CkNcpyBuffer(nocopyMsg, sizeof(char)*size, srcCb); // CK_BUFFER_REG
 
     // Destination callback and Ncpy object
     CkCallback destCb = CkCallback(CkIndex_Ping1::callbackGetGetPingpong(NULL), thisProxy[thisIndex]);
-    myDest = CkNcpyBuffer(otherMsg, sizeof(char)*size, destCb, CK_BUFFER_REG);
+    myDest = CkNcpyBuffer(otherMsg, sizeof(char)*size, destCb); // CK_BUFFER_REG
 
     thisProxy[0].beginGetGetPingpong();
   }
@@ -163,11 +163,11 @@ class Ping1 : public CBase_Ping1
 
     // Source callback and Ncpy object
     CkCallback srcCb = CkCallback(CkCallback::ignore);
-    mySrc = CkNcpyBuffer(nocopyMsg, sizeof(char)*size, srcCb, CK_BUFFER_REG);
+    mySrc = CkNcpyBuffer(nocopyMsg, sizeof(char)*size, srcCb); // CK_BUFFER_REG
 
     // Destination callback and Ncpy object
     CkCallback destCb = CkCallback(CkIndex_Ping1::callbackPutPutPingpong(NULL), thisProxy[thisIndex]);
-    myDest = CkNcpyBuffer(otherMsg, sizeof(char)*size, destCb, CK_BUFFER_REG);
+    myDest = CkNcpyBuffer(otherMsg, sizeof(char)*size, destCb); // CK_BUFFER_REG
 
     thisProxy[0].beginPutPutPingpong();
   }
index 4a499751d6c7cb5b4e218359c572c1044e9d761f..dc621812baf771c4706ddcf24ed8a05954afc6cb 100644 (file)
@@ -92,9 +92,9 @@ public:
   void start()
   {
     CkAssert(thisIndex == 0);
-    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);
+    mySrc1 = CkNcpyBuffer(iArr1, size*sizeof(int), cb);
+    mySrc2 = CkNcpyBuffer(dArr1, size*sizeof(double), cb);
+    mySrc3 = CkNcpyBuffer(cArr1, size*sizeof(char), cb);
 
     // Send my sources to Index 1; Index 1 performs Gets from these sources
     thisProxy[otherIndex].recvNcpyInfo(mySrc1, mySrc2, mySrc3);
@@ -148,9 +148,9 @@ public:
   {
     CkAssert(thisIndex == 1);
     // Create nocopy destination for me to Get into
-    myDest1 = CkNcpyBuffer(iArr1, size*sizeof(int), cb, CK_BUFFER_REG);
-    myDest2 = CkNcpyBuffer(dArr1, size*sizeof(double), cb, CK_BUFFER_REG);
-    myDest3 = CkNcpyBuffer(cArr1, size*sizeof(char), cb, CK_BUFFER_REG);
+    myDest1 = CkNcpyBuffer(iArr1, size*sizeof(int), cb);
+    myDest2 = CkNcpyBuffer(dArr1, size*sizeof(double), cb);
+    myDest3 = CkNcpyBuffer(cArr1, size*sizeof(char), cb);
 
     // Perform Get from Index 0's sources into my destinations
     myDest1.get(src1);
index a286cd8198606cf8449e034a18e8196ab65cd1d1..3b509a441e98a4261f1cf30178c8139eaf4a99d2 100644 (file)
@@ -92,7 +92,7 @@ public:
   void start()
   {
     CkAssert(thisIndex == 1);
-    myDest1 = CkNcpyBuffer(iArr1, size*sizeof(int), cb, CK_BUFFER_REG);
+    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);
 
index a31dbfd81485a311c16227673f789eea4dddd0f1..c5dd04a2ecb0d19346f9bcfcf26df88f97de8a17 100644 (file)
@@ -87,17 +87,17 @@ 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);
+    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);
 
     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);
+    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);
 
     thisProxy[otherIndex].recvNcpyInfo(mySrc1, mySrc2, mySrc3, myDest1, myDest2, myDest3);
   }
@@ -133,9 +133,9 @@ public:
         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);
+        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);
 
         // Index 1 Putting to 0
         mySrc1.put(otherDest1);
@@ -165,9 +165,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);
+    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);
 
     // Index 1 Getting from 0
     myDest1.get(src1);
index f4ec8494f61915fc94d8def728c1ef81ccf590a6..18f7998786a7a61975cd54c5548ae8332892e217 100644 (file)
@@ -105,11 +105,11 @@ class Ping1 : public CBase_Ping1
   void setupGetGetPingpong(int size) {
     // Source callback and Ncpy object
     CkCallback srcCb = CkCallback(CkCallback::ignore);
-    mySrc = CkNcpyBuffer(nocopyMsg, sizeof(char)*size, srcCb);
+    mySrc = CkNcpyBuffer(nocopyMsg, sizeof(char)*size, srcCb, CK_BUFFER_UNREG);
 
     // Destination callback and Ncpy object
     CkCallback destCb = CkCallback(CkIndex_Ping1::callbackGetGetPingpong(NULL), thisProxy[thisIndex]);
-    myDest = CkNcpyBuffer(otherMsg, sizeof(char)*size, destCb);
+    myDest = CkNcpyBuffer(otherMsg, sizeof(char)*size, destCb, CK_BUFFER_UNREG);
 
     thisProxy[0].beginGetGetPingpong();
   }
@@ -163,11 +163,11 @@ class Ping1 : public CBase_Ping1
 
     // Source callback and Ncpy object
     CkCallback srcCb = CkCallback(CkCallback::ignore);
-    mySrc = CkNcpyBuffer(nocopyMsg, sizeof(char)*size, srcCb);
+    mySrc = CkNcpyBuffer(nocopyMsg, sizeof(char)*size, srcCb, CK_BUFFER_UNREG);
 
     // Destination callback and Ncpy object
     CkCallback destCb = CkCallback(CkIndex_Ping1::callbackPutPutPingpong(NULL), thisProxy[thisIndex]);
-    myDest = CkNcpyBuffer(otherMsg, sizeof(char)*size, destCb);
+    myDest = CkNcpyBuffer(otherMsg, sizeof(char)*size, destCb, CK_BUFFER_UNREG);
 
     thisProxy[0].beginPutPutPingpong();
   }
index dc621812baf771c4706ddcf24ed8a05954afc6cb..2a0b4e48cebce95814e3be19ee306d65b54d8fa6 100644 (file)
@@ -92,9 +92,9 @@ 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);
+    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);
 
     // Send my sources to Index 1; Index 1 performs Gets from these sources
     thisProxy[otherIndex].recvNcpyInfo(mySrc1, mySrc2, mySrc3);
@@ -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);
+    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);
 
     // Perform Get from Index 0's sources into my destinations
     myDest1.get(src1);
index ebccc51602f98ff2d203044c43f6b833f9cc4044..60242e7fefb13029c56a151ed38342d46a83df2a 100644 (file)
@@ -92,9 +92,9 @@ public:
   void start()
   {
     CkAssert(thisIndex == 1);
-    myDest1 = CkNcpyBuffer(iArr1, size*sizeof(int), cb);
-    myDest2 = CkNcpyBuffer(dArr1, size*sizeof(double), cb);
-    myDest3 = CkNcpyBuffer(cArr1, size*sizeof(char), cb);
+    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);
 
     // Send my destinations to Index 0; Index 0 performs Puts into these destinations
     thisProxy[otherIndex].recvNcpyInfo(myDest1, myDest2, myDest3);
@@ -148,9 +148,9 @@ public:
   {
     CkAssert(thisIndex == 0);
     // Create nocopy sources for me to Put into
-    mySrc1 = CkNcpyBuffer(iArr1, size*sizeof(int), cb);
-    mySrc2 = CkNcpyBuffer(dArr1, size*sizeof(double), cb);
-    mySrc3 = CkNcpyBuffer(cArr1, size*sizeof(char), cb);
+    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);
 
     // Perform Puts from my sources into Index 1's destinations
     mySrc1.put(dest1);
index 638b4208a8e42a2490bbcf819db5028cc5db997f..5b1d1cead693ea99650c297cf4049381a58ddafc 100644 (file)
@@ -158,13 +158,13 @@ class CkNcpyBuffer{
   // reference pointer
   const void *ref;
 
-  CkNcpyBuffer() : ptr(NULL), pe(-1), ref(NULL), mode(CK_BUFFER_UNREG) {}
+  CkNcpyBuffer() : ptr(NULL), pe(-1), ref(NULL), mode(CK_BUFFER_REG) {}
 
-  CkNcpyBuffer(const void *ptr_, size_t cnt_, CkCallback &cb_, unsigned short int mode_=CK_BUFFER_UNREG) {
+  CkNcpyBuffer(const void *ptr_, size_t cnt_, CkCallback &cb_, unsigned short int mode_=CK_BUFFER_REG) {
     init(ptr_, cnt_, cb_, mode_);
   }
 
-  void init(const void *ptr_, size_t cnt_, CkCallback &cb_, unsigned short int mode_=CK_BUFFER_UNREG) {
+  void init(const void *ptr_, size_t cnt_, CkCallback &cb_, unsigned short int mode_=CK_BUFFER_REG) {
     ptr  = ptr_;
     cnt  = cnt_;
     cb   = cb_;