ZC Direct API: Invoke callbacks in SMP mode through the first worker thread 55/4655/4
authorNitin Bhat <nbhat4@illinois.edu>
Thu, 4 Oct 2018 23:28:55 +0000 (19:28 -0400)
committerNitin Bhat <nbhat4@illinois.edu>
Mon, 8 Oct 2018 21:22:51 +0000 (16:22 -0500)
There is no relationship between a CkNcpyBuffer's PE and the its callback.
Previously, in the SMP mode, where the ackhandler function was being
executed on the comm thread, the comm thread would invoke the
_callback_group on the srcPe/destPe to finally invoke the callback.
This was done as a workaround for the absence of a location manager on
the comm thread. However, it was unnecessary to invoke the _callback_group
on the srcPe/destPe. With this commit, the _callback_group is invoked on the
first pe of that node i.e. CmiNodeFirst(CkMyNode()) rather than the
srcPe/destPe. This prefers local communication over the more expensive remote
communication.

Change-Id: I621f3eb008eeb2768d5137b88de4f41d802c937c

src/ck-core/ckrdma.C

index 35a2c45390070bb5c03ab8004fe8889b0c2919f0..3232b8071ee36ee3b0bf910f684bc04f66475cf1 100644 (file)
@@ -93,9 +93,9 @@ void CkHandleRdmaCookie(void *cookie){
   CkRdmaWrapper *w = (CkRdmaWrapper *)cookie;
   CkCallback *cb= w->callback;
 #if CMK_SMP
-  //call to callbackgroup to call the callback when calling from comm thread
-  //this add one more trip through the scheduler
-  _ckcallbackgroup[w->srcPe].call(*cb, sizeof(void *), (char*)&w->ptr);
+  //call the callbackgroup on my node's first PE when callback requires to be called from comm thread
+  //this adds one more trip through the scheduler
+  _ckcallbackgroup[CmiNodeFirst(CmiMyNode())].call(*cb, sizeof(void *), (char*)&w->ptr);
 #else
   //direct call to callback when calling from worker thread
   cb->send(sizeof(void *), &w->ptr);
@@ -360,24 +360,24 @@ void CkRdmaDirectAckHandler(void *ack) {
   if(info->ackMode == 0 || info->ackMode == 1) {
 
 #if CMK_SMP
-    //call to callbackgroup to call the callback when calling from comm thread
+    //call the callbackgroup on my node's first PE when callback requires to be called from comm thread
     //this adds one more trip through the scheduler
-    _ckcallbackgroup[info->srcPe].call(*(CkCallback *)(info->srcAck), sizeof(CkNcpyBuffer), (const char *)(&src));
+    _ckcallbackgroup[CmiNodeFirst(CmiMyNode())].call(*srcCb, sizeof(CkNcpyBuffer), (const char *)(&src));
 #else
     //Invoke the destination callback
-    ((CkCallback *)(info->srcAck))->send(sizeof(CkNcpyBuffer), &src);
+    srcCb->send(sizeof(CkNcpyBuffer), &src);
 #endif
   }
 
   if(info->ackMode == 0 || info->ackMode == 2) {
 
 #if CMK_SMP
-    //call to callbackgroup to call the callback when calling from comm thread
+    //call the callbackgroup on my node's first PE when callback requires to be called from comm thread
     //this adds one more trip through the scheduler
-    _ckcallbackgroup[info->destPe].call(*(CkCallback *)(info->destAck), sizeof(CkNcpyBuffer), (const char *)(&dest));
+    _ckcallbackgroup[CmiNodeFirst(CmiMyNode())].call(*destCb, sizeof(CkNcpyBuffer), (const char *)(&dest));
 #else
     //Invoke the destination callback
-    ((CkCallback *)(info->destAck))->send(sizeof(CkNcpyBuffer), &dest);
+    destCb->send(sizeof(CkNcpyBuffer), &dest);
 #endif
   }