Use refNum to determine ncpy transfer completion order 12/4412/3
authorNitin Bhat <nbhat4@illinois.edu>
Fri, 27 Jul 2018 21:19:19 +0000 (17:19 -0400)
committerNitin Bhat <nbhat4@illinois.edu>
Mon, 30 Jul 2018 16:31:13 +0000 (11:31 -0500)
Previously, the completion order of the ncpy transfers
in examples/charm++/zerocopy/direct_api/unreg/simple_get
was assumed to be in the order of calling the get invocation.
This is fixed by setting reference numbers in the callbacks and using
those reference numbers to determine the get completion order.

Change-Id: I4e2c28cc5fc64a6fa1e7f629863bbf12e0e7ef07

doc/charm++/zerocopyapi.tex
examples/charm++/zerocopy/direct_api/unreg/simple_get/simple_get.C

index 93babd5a951546e6af343ac3fc52e75538099485..d4630b67e015a4612238d772bb7df8c2d4acec97 100644 (file)
@@ -208,7 +208,11 @@ 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
 invocation, these reference numbers can be used to identify the buffers that
-were passed into the \kw{CkNcpyBuffer} objects. This is
+were passed into the \kw{CkNcpyBuffer} objects. Upon callback invocation, the
+reference number of the callback can be accessed using the \texttt{CkDataMsg}
+argument of the callback function. For a callback using a \texttt{CkDataMsg *msg},
+the reference number is obtained by using the method \texttt{CkGetRefNum(msg);}.
+This is illustrated in \examplerefdir{zerocopy/direct\_api/unreg/simple\_get}.
 specifically useful where there is an indexed collection of buffers, where the
 reference number can be used to index the collection.
 
index effae23e22a0ca9e649fd42505e23a35e7d0b417..652f0179e0e5870a3e2a1bdab0d62e8ceba1554b 100644 (file)
@@ -98,14 +98,17 @@ public:
     // arbitrary pointer pointing to valCounter
     const void *refPtr = &valCounter;
 
+    cb.setRefNum(1);
     mySrc1 = CkNcpyBuffer(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);
     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);
     ACK_DEBUG(("[%d][%d][%d] Setting source Ref: Buffer Ptr: %p, Reference Ptr: %p\n", thisIndex, CkMyPe(), CkMyNode(), cArr1, refPtr));
     mySrc3.setRef(refPtr);
@@ -121,10 +124,12 @@ public:
 
     // Cast m->data as (CkNcpyAck *)
     CkNcpyAck *ack = (CkNcpyAck *)(m->data);
-    ACK_DEBUG(("[%d][%d][%d] In source callback : Buffer Ptr: %p, Reference Ptr: %p\n", thisIndex, CkMyPe(), CkMyNode(), ack->ptr, ack->ref));
+    ACK_DEBUG(("[%d][%d][%d] In source callback : Buffer Ptr: %p, Reference Ptr: %p and refnum is %d\n", thisIndex, CkMyPe(), CkMyNode(), ack->ptr, ack->ref, CkGetRefNum(m)));
+
+    int refNum = CkGetRefNum(m);
 
     void *srcPointer;
-    switch(cbCounter) {
+    switch(refNum) {
       case 1 : srcPointer = iArr1; break;
       case 2 : srcPointer = dArr1; break;
       case 3 : srcPointer = cArr1; break;
@@ -155,10 +160,12 @@ public:
 
     // Cast m->data as (CkNcpyAck *)
     CkNcpyAck *ack = (CkNcpyAck *)(m->data);
-    ACK_DEBUG(("[%d][%d][%d] In destination callback : Buffer Ptr: %p, Reference Ptr: %p\n", thisIndex, CkMyPe(), CkMyNode(), ack->ptr, ack->ref));
+    ACK_DEBUG(("[%d][%d][%d] In destination callback : Buffer Ptr: %p, Reference Ptr: %p and refnum is %d\n", thisIndex, CkMyPe(), CkMyNode(), ack->ptr, ack->ref, CkGetRefNum(m)));
+
+    int refNum = CkGetRefNum(m);
 
     void *destPointer;
-    switch(cbCounter) {
+    switch(refNum) {
       case 1 : destPointer = iArr1; break;
       case 2 : destPointer = dArr1; break;
       case 3 : destPointer = cArr1; break;
@@ -206,14 +213,17 @@ public:
     const void *refPtr = &valCounter;
 
     // Create nocopy destination for me to Get into
+    cb.setRefNum(1);
     myDest1 = CkNcpyBuffer(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);
     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);
     ACK_DEBUG(("[%d][%d][%d] Setting destination Ref: Buffer Ptr: %p, Reference Ptr: %p\n", thisIndex, CkMyPe(), CkMyNode(), cArr1, refPtr));
     myDest3.setRef(refPtr);