(1) fix L2Atomic Queue bug (2) add spin L2AtomicQueue on idle
authorYanhua Sun <sun51@illinois.edu>
Fri, 8 Feb 2013 03:15:17 +0000 (03:15 +0000)
committerYanhua Sun <sun51@illinois.edu>
Fri, 8 Feb 2013 03:15:17 +0000 (03:15 +0000)
src/arch/bluegenep/machine.c
src/arch/gemini_gni/machine.c
src/arch/mpi/machine.c
src/arch/pamilrts-bluegeneq/conv-mach-smp.h
src/arch/pamilrts/lrtsqueue.h
src/arch/pamilrts/machine.c
src/arch/util/machine-common-core.c
src/arch/util/machine-lrts.h

index 7cfa12e3d10270d5c7ab53f3136f41051a2f1168..ab0aced2e03473f4815603658774a6481f57165d 100644 (file)
@@ -874,7 +874,7 @@ static void MachinePostCommonInitForDCMF(int everReturn) {
  * Abort function:
  *
  ************************************************************************/
-
+void LrtsNotifyIdle() {}
 void LrtsAbort(const char *message) {
     CmiError("------------- Processor %d Exiting: Called CmiAbort ------------\n"
              "{snd:%d,rcv:%d} Reason: %s\n",CmiMyPe(),
index 9c2486c03f46c2e1bd604af45e04d94c0df7ef05..90d1b9b43ef7c172f47d4324303068d0562dfbe8 100644 (file)
@@ -1671,7 +1671,7 @@ inline static gni_return_t send_large_messages(SMSG_QUEUE *queue, int destNode,
     return status;
 #endif
 }
-
+inline void LrtsNotifyIdle() {}
 inline void LrtsPrepareEnvelope(char *msg, int size)
 {
     CmiSetMsgSize(msg, size);
index cc201b10fd184564824e99d009ed37277818365f..4a3a6058caf94b5794ea8422b23b0f4fd3dc9d28 100644 (file)
@@ -1549,6 +1549,8 @@ void LrtsInit(int *argc, char ***argv, int *numNodes, int *myNodeID) {
 #endif
 }
 
+void LrtsNotifyIdle() {}
+
 void LrtsPreCommonInit(int everReturn) {
 
 #if USE_MPI_CTRLMSG_SCHEME
index 07d35648ebb1258680686be3b4a557ebc2496461..ad78d7311359135def8771c36baa8839f5014ec1 100644 (file)
@@ -26,3 +26,6 @@
 #define CMK_FAKE_SCHED_YIELD                               1
 
 #define SPECIFIC_PCQUEUE                                   1
+#if SPECIFIC_PCQUEUE
+#define SPECIFIC_IDLE                                       1
+#endif
index 85f709b5057e9f2b80544179d9d5b8960e2b77e5..4a1ddb6f541fc1ea0c2a03213da6b3c670054942 100755 (executable)
@@ -19,6 +19,7 @@
 #define L2A_FAIL    -2
 
 typedef  void* LRTSQueueElement;
+static void *l2atomicbuf;
 
 typedef struct _l2atomicstate {
   volatile uint64_t Consumer;  // not used atomically
@@ -74,7 +75,6 @@ int LRTSQueuePush(LRTSQueue queue,
                     void                   * element) 
 {
   //fprintf(stderr,"Insert message %p\n", element);
-
   register int qsize_1 = queue->_qsize - 1;
   uint64_t index = L2_AtomicLoadIncrementBounded(&queue->_l2state->Producer);
   L1P_FlushRequests();
@@ -195,7 +195,6 @@ int LRTSQueue2QSpinWait (LRTSQueue    queue0,
   return 0; 
 }
 
-static void *l2atomicbuf;
 typedef pami_result_t (*pamix_proc_memalign_fn) (void**, size_t, size_t, const char*);
 void   LRTSQueuePreInit()
 {
@@ -215,9 +214,8 @@ void   LRTSQueuePreInit()
 
 LRTSQueue  LRTSQueueCreate()
 {
-    static  int  position;
+    static  int  position=0;
     LRTSQueue   Q;
-    int actualNodeSize = 64/Kernel_ProcessCount(); 
     Q = (LRTSQueue)calloc(1, sizeof( struct _l2atomicq ));
     LRTSQueueInit ((char *) l2atomicbuf + sizeof(L2AtomicState)*position,
                           sizeof(L2AtomicState),
@@ -225,5 +223,6 @@ LRTSQueue  LRTSQueueCreate()
                           1, /*use overflow*/
                           DEFAULT_SIZE /*1024 entries*/);
     position++; 
+    return Q;
 }
 #endif
index 9323548582fcf77d7d89e46d190ec622d9658650..19ff645939b08b07fd099240d9bc4e76af7ffff2 100644 (file)
@@ -29,9 +29,6 @@ char *ALIGN_32(char *p) {
   return((char *)((((unsigned long)p)+0x1f) & (~0x1FUL)));
 }
 
-#if MACHINE_DEBUG_LOG
-FILE *debugLog = NULL;
-#endif
 
 #define CMI_MAGIC(msg)                   ((CmiMsgHeaderBasic *)msg)->magic
 /* FIXME: need a random number that everyone agrees ! */
@@ -495,11 +492,6 @@ void LrtsInit(int *argc, char ***argv, int *numNodes, int *myNodeID)
   result = PAMI_Client_query(cmi_pami_client, &configuration, 1);
   *myNodeID = configuration.value.intval;
 
-#if MACHINE_DEBUG_LOG
-    char ln[200];
-    sprintf(ln,"debugLog.%d", *myNodeID);
-    debugLog=fopen(ln,"w");
-#endif
   configuration.name = PAMI_CLIENT_NUM_TASKS;
   result = PAMI_Client_query(cmi_pami_client, &configuration, 1);
   *numNodes = configuration.value.intval;
@@ -721,6 +713,28 @@ void LrtsAbort(const char *message) {
   assert(0);
 }
 
+void LrtsNotifyIdle()
+{
+#if CMK_SMP && CMK_PAMI_MULTI_CONTEXT
+#if !CMK_ENABLE_ASYNC_PROGRESS && SPECIFIC_QUEUE  &&  CMK_NODE_QUEUE_AVAILABLE
+  //Wait on the atomic queue to get a message with very low core
+  //overheads. One thread calls advance more frequently
+  ////spin wait for 2-4us when idle
+  ////process node queue messages every 10us
+  ////Idle cores will only use one LMQ slot and an int sum
+  CmiState cs = CmiGetStateN(rank);
+  if ((CmiMyRank()% THREADS_PER_CONTEXT) == 0)
+  {LRTSQueueSpinWait(CmiMyRecvQueue(), 
+                           10);}
+  else
+#endif
+#if SPECIFIC_QUEUE 
+  { LRTSQueueSpinWait(CmiMyRecvQueue(), 
+                           1000);
+  }
+#endif
+#endif
+}
 pami_result_t machine_send_handoff (pami_context_t context, void *msg);
 void  machine_send       (pami_context_t      context, 
     int                 node, 
@@ -778,7 +792,7 @@ void  machine_send       (pami_context_t      context,
   to_lock = CpvAccess(uselock);
 #endif
 
-#if CMK_PAMI_MULTI_CONTEXT
+#if CMK_PAMI_MULTI_CONTEXT &&  CMK_NODE_QUEUE_AVAILABLE
   size_t dst_context = (rank != DGRAM_NODEMESSAGE) ? (rank>>LTPS) : (rand_r(&r_seed) % cmi_pami_numcontexts);
   //Choose a context at random
   //size_t dst_context = myrand(&r_seed) % cmi_pami_numcontexts;
index fc8ba21d3e59b3b995cef920d53b8045f363c14b..fcc634eda6cba8bb33cfd3d28fea3ce25b695c77 100644 (file)
@@ -318,6 +318,7 @@ static void CmiNotifyStillIdle(CmiIdleState *s);
 void CmiNotifyIdle(void);
 /* ===== End of Idle-state Related Declarations =====  */
 
+CsvDeclare(CmiNodeState, NodeState);
 /* ===== Beginning of Processor/Node State-related Stuff =====*/
 #if !CMK_SMP
 /************ non SMP **************/
@@ -347,6 +348,15 @@ INLINE_KEYWORD int CmiNodeSpan() {
 }
 #else
 /************** SMP *******************/
+INLINE_KEYWORD CMIQueue CmiMyRecvQueue() {
+    return CmiGetState()->recv;
+}
+
+#if CMK_NODE_QUEUE_AVAILABLE
+INLINE_KEYWORD CMIQueue CmiMyNodeQueue() {
+    return CsvAccess(NodeState).NodeRecv;
+}
+#endif
 INLINE_KEYWORD int CmiMyPe() {
     return CmiGetState()->pe;
 }
@@ -372,7 +382,6 @@ INLINE_KEYWORD int CmiRankOf(int pe) {
     return pe%_Cmi_mynodesize;
 }
 #endif
-CsvDeclare(CmiNodeState, NodeState);
 /* ===== End of Processor/Node State-related Stuff =====*/
 
 #include "machine-broadcast.c"
@@ -1172,6 +1181,9 @@ static void CmiNotifyStillIdle(CmiIdleState *s) {
 void CmiNotifyIdle(void) {
     AdvanceCommunication(1);
     CmiYield();
+#if SPECIFIC_IDLE
+    LrtsNotifyIdle();
+#endif
 }
 
 /* Utiltiy functions */
index 74bb569ccf72862c36d82a81d066cc77eb388780..f7c3a5da161b54b812a46d7545f54e4254b908fb 100644 (file)
@@ -31,4 +31,5 @@ void LrtsPostNonLocal();
 
 void* LrtsAlloc(int, int);
 void  LrtsFree(void*);
+void LrtsNotifyIdle();
 #endif