a little optimiation for SMP: use node shared queue for messages to the same node...
authorGengbin Zheng <gzheng@illinois.edu>
Wed, 3 Dec 2008 21:18:20 +0000 (21:18 +0000)
committerGengbin Zheng <gzheng@illinois.edu>
Wed, 3 Dec 2008 21:18:20 +0000 (21:18 +0000)
src/conv-ldb/cldb.rand.c

index c037b4899da3746b3fe6647ef530c50a178c8a02..669a446e0b56d27da2f33c9436387a0cf1cdad2d 100644 (file)
@@ -55,13 +55,21 @@ void CldEnqueueMulti(int npes, int *pes, void *msg, int infofn)
 void CldEnqueue(int pe, void *msg, int infofn)
 {
   int len, queueing, priobits; unsigned int *prioptr;
 void CldEnqueue(int pe, void *msg, int infofn)
 {
   int len, queueing, priobits; unsigned int *prioptr;
-  CldInfoFn ifn = (CldInfoFn)CmiHandlerToFunction(infofn);
+  CldInfoFn ifn;
   CldPackFn pfn;
   if (pe == CLD_ANYWHERE) {
     pe = (((CrnRand()+CmiMyPe())&0x7FFFFFFF)%CmiNumPes());
   CldPackFn pfn;
   if (pe == CLD_ANYWHERE) {
     pe = (((CrnRand()+CmiMyPe())&0x7FFFFFFF)%CmiNumPes());
+      /* optimizationfor SMP */
+#if CMK_SMP
+    if (CmiNodeOf(pe) == CmiMyNode()) {
+      CldNodeEnqueue(CmiMyNode(), msg, infofn);
+      return;
+    }
+#endif
     if (pe != CmiMyPe())
       CpvAccess(CldRelocatedMessages)++;
   }
     if (pe != CmiMyPe())
       CpvAccess(CldRelocatedMessages)++;
   }
+  ifn = (CldInfoFn)CmiHandlerToFunction(infofn);
   if (pe == CmiMyPe() && !CmiImmIsRunning()) {
     ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
     /* CsdEnqueueGeneral is not thread or SIGIO safe */
   if (pe == CmiMyPe() && !CmiImmIsRunning()) {
     ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
     /* CsdEnqueueGeneral is not thread or SIGIO safe */