ZC Direct API: Pass completion status as the return value for get and put 11/4611/8
authorNitin Bhat <nbhat4@illinois.edu>
Tue, 9 Oct 2018 18:32:24 +0000 (14:32 -0400)
committerNitin Bhat <nbhat4@illinois.edu>
Mon, 26 Nov 2018 22:04:49 +0000 (16:04 -0600)
CkNcpyStatus::complete is returned for memcpy and cma transfers
indicating successful completion and CkNcpyStatus::incomplete is
returned for rdma transfers indicating that the data transfer is
in-progress and not necessarily complete.

Change-Id: I7d9bb65dd2473d8d0e1f1e58fb7c2eeb257cd47c

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

index b960ef83dc94fd53dc8ad1a944e496d4a41ba278..e76b3767063f298aec9bd7a0b870b9c456ce0f56 100644 (file)
@@ -208,6 +208,18 @@ Similarly, a valid \kw{put} call using two \kw{CkNcpyBuffer} objects \texttt{obj
 \texttt{obj2} is performed as \texttt{obj1.put(obj2)}, where \texttt{obj1} is the local source buffer
 object and \texttt{obj2} is the remote destination buffer object that was passed to this PE.
 
+In addition to the callbacks, the return values of \kw{get} and \kw{put} also indicate the
+completion of data transfer between the buffers. When the source and destination buffers are
+within the same process or on different processes within the same CMA-enabled physical node,
+the zerocopy data transfer happens immediately without an asynchronous
+RDMA call. In such cases, both the methods, \kw{get} and \kw{put} return an enum value of
+\kw{CkNcpyStatus::complete}. This value of the API indicates the completion of the zerocopy data
+transfer. On the other hand, in the case of an asynchronous RDMA call, the data transfer is not immediate
+and the return enum value of the \kw{get} and \kw{put} methods is \kw{CkNcpyStatus::incomplete}.
+This indicates that the data transfer is in-progress and not necessarily complete. Use of
+\kw{CkNcpyStatus} in an application is illustrated in
+\examplerefdir{zerocopy/direct\_api/reg/simple\_get}.
+
 Since callbacks in \charmpp{} allow to store a reference number, these
 callbacks passed into \kw{CkNcpyBuffer} can be set with a
 reference number using the method \texttt{cb.setRefNum(num)}. Upon callback
index 3d6369487390a1cd9d557d57c1cbd3586102b6fa..83e4146767f3c690fcba3f658a83298b6821a7e5 100644 (file)
@@ -153,9 +153,23 @@ public:
     CkNcpyBuffer myDest3(cArr1, size*sizeof(char), cb);
 
     // Perform Get from Index 0's sources into my destinations
-    myDest1.get(src1);
-    myDest2.get(src2);
-    myDest3.get(src3);
+    CkNcpyStatus status1 = myDest1.get(src1);
+    if(status1 == CkNcpyStatus::complete)
+      CmiPrintf("[%d][%d][%d] Get 1 is complete\n", thisIndex, CkMyPe(), CkMyNode());
+    else if(status1 == CkNcpyStatus::incomplete)
+      CmiPrintf("[%d][%d][%d] Get 1 is still incomplete\n", thisIndex, CkMyPe(), CkMyNode());
+
+    CkNcpyStatus status2 = myDest2.get(src2);
+    if(status2 == CkNcpyStatus::complete)
+      CmiPrintf("[%d][%d][%d] Get 2 is complete\n", thisIndex, CkMyPe(), CkMyNode());
+    else if(status2 == CkNcpyStatus::incomplete)
+      CmiPrintf("[%d][%d][%d] Get 2 is still incomplete\n", thisIndex, CkMyPe(), CkMyNode());
+
+    CkNcpyStatus status3 = myDest3.get(src3);
+    if(status3 == CkNcpyStatus::complete)
+      CmiPrintf("[%d][%d][%d] Get 3 is complete\n", thisIndex, CkMyPe(), CkMyNode());
+    else if(status3 == CkNcpyStatus::incomplete)
+      CmiPrintf("[%d][%d][%d] Get 3 is still incomplete\n", thisIndex, CkMyPe(), CkMyNode());
   }
 
   // Executed on Index 1
index 1486a918436cf73a55e298ea323fbadc4b6c3973..c5d3f9b6c8ab15947cd8aa662116c3a194237b89 100644 (file)
@@ -464,7 +464,7 @@ void CkNcpyBuffer::rdmaGet(CkNcpyBuffer &source) {
 }
 
 // Perform a nocopy get operation into this destination using the passed source
-void CkNcpyBuffer::get(CkNcpyBuffer &source){
+CkNcpyStatus CkNcpyBuffer::get(CkNcpyBuffer &source){
   if(mode == CK_BUFFER_NOREG || source.mode == CK_BUFFER_NOREG) {
     CkAbort("Cannot perform RDMA operations in CK_BUFFER_NOREG mode\n");
   }
@@ -487,6 +487,9 @@ void CkNcpyBuffer::get(CkNcpyBuffer &source){
     //Invoke the destination callback
     cb.send(sizeof(CkNcpyBuffer), this);
 
+    // rdma data transfer complete
+    return CkNcpyStatus::complete;
+
 #if CMK_USE_CMA
   } else if(transferMode == CkNcpyMode::CMA) {
 
@@ -498,6 +501,9 @@ void CkNcpyBuffer::get(CkNcpyBuffer &source){
     //Invoke the destination callback
     cb.send(sizeof(CkNcpyBuffer), this);
 
+    // rdma data transfer complete
+    return CkNcpyStatus::complete;
+
 #endif
   } else if (transferMode == CkNcpyMode::RDMA) {
 
@@ -516,6 +522,9 @@ void CkNcpyBuffer::get(CkNcpyBuffer &source){
 
     rdmaGet(source);
 
+    // rdma data transfer incomplete
+    return CkNcpyStatus::incomplete;
+
   } else {
     CkAbort("Invalid CkNcpyMode");
   }
@@ -586,7 +595,7 @@ void CkNcpyBuffer::rdmaPut(CkNcpyBuffer &destination) {
 }
 
 // Perform a nocopy put operation into the passed destination using this source
-void CkNcpyBuffer::put(CkNcpyBuffer &destination){
+CkNcpyStatus CkNcpyBuffer::put(CkNcpyBuffer &destination){
   if(mode == CK_BUFFER_NOREG || destination.mode == CK_BUFFER_NOREG) {
     CkAbort("Cannot perform RDMA operations in CK_BUFFER_NOREG mode\n");
   }
@@ -608,6 +617,9 @@ void CkNcpyBuffer::put(CkNcpyBuffer &destination){
     //Invoke the source callback
     cb.send(sizeof(CkNcpyBuffer), this);
 
+    // rdma data transfer complete
+    return CkNcpyStatus::complete;
+
 #if CMK_USE_CMA
   } else if(transferMode == CkNcpyMode::CMA) {
     cmaPut(destination);
@@ -618,6 +630,9 @@ void CkNcpyBuffer::put(CkNcpyBuffer &destination){
     //Invoke the source callback
     cb.send(sizeof(CkNcpyBuffer), this);
 
+    // rdma data transfer complete
+    return CkNcpyStatus::complete;
+
 #endif
   } else if (transferMode == CkNcpyMode::RDMA) {
 
@@ -636,6 +651,9 @@ void CkNcpyBuffer::put(CkNcpyBuffer &destination){
 
     rdmaPut(destination);
 
+    // rdma data transfer incomplete
+    return CkNcpyStatus::incomplete;
+
   } else {
     CkAbort("Invalid CkNcpyMode");
   }
index 86778b06686d4868b662e4a66c8b45a9e995fe10..5accbf6eaee51b66244646eb053d0e375d3110cf 100644 (file)
@@ -107,6 +107,10 @@ int getRdmaBufSize(envelope *env);
 void CkRdmaAckHandler(void *cookie);
 void CkRdmaDirectAckHandler(void *ack);
 
+enum class CkNcpyMode : char { MEMCPY, CMA, RDMA };
+
+enum class CkNcpyStatus : char { incomplete, complete };
+
 // Class to represent an RDMA buffer
 class CkNcpyBuffer{
 
@@ -209,8 +213,8 @@ class CkNcpyBuffer{
   void rdmaGet(CkNcpyBuffer &source);
   void rdmaPut(CkNcpyBuffer &destination);
 
-  void get(CkNcpyBuffer &source);
-  void put(CkNcpyBuffer &destination);
+  CkNcpyStatus get(CkNcpyBuffer &source);
+  CkNcpyStatus put(CkNcpyBuffer &destination);
 
   // Deregister(Unpin) the memory that is registered for the buffer
   void deregisterMem() {
@@ -242,6 +246,4 @@ class CkNcpyBuffer{
   friend void CkRdmaDirectAckHandler(void *ack);
 };
 
-enum class CkNcpyMode : char { MEMCPY, CMA, RDMA };
-
 #endif