Merge branches 'charm', 'charm' and 'charm' of charmgit:charm into charm
authorGengbin Zheng <gzheng@illinois.edu>
Sat, 12 Mar 2011 06:11:31 +0000 (00:11 -0600)
committerGengbin Zheng <gzheng@illinois.edu>
Sat, 12 Mar 2011 06:11:31 +0000 (00:11 -0600)
1  2 
src/arch/net-linux-x86_64/conv-mach-ibverbs.h
src/arch/net/machine-ibverbs.c
src/conv-ldb/cldb.workstealing.c
src/conv-ldb/cldb.workstealing.h
src/util/sockRoutines.h

index 8cc13962c2a459054773c761a9b2e9aad658030f,8cc13962c2a459054773c761a9b2e9aad658030f..d26d758fd07a677767399f5242cfcda56f01947f
  #define CMK_THREADS_USE_CONTEXT                            0
  #define CMK_THREADS_USE_JCONTEXT                           1
  
++/*
  #undef CMK_IMMEDIATE_MSG
  #define CMK_IMMEDIATE_MSG       0
++*/
  
  #undef CMK_BROADCAST_SPANNING_TREE
  #define CMK_BROADCAST_SPANNING_TREE 0
index 9286f0a03e470db7398917cb2486ec2615c93082,9286f0a03e470db7398917cb2486ec2615c93082..6c3bc292632005c0a6ba963d11a8470b526f991d
@@@ -1249,6 -1249,6 +1249,7 @@@ static inline  void CommunicationServer
        
  //    checkAllQps();
  //    _count--;
++
        MACHSTATE(2,"} CommServer_nolock ne");
        
  }
@@@ -1459,6 -1459,6 +1460,9 @@@ static void ServiceCharmrun_nolock(
  
  static void CommunicationServer(int sleepTime, int where){
        if( where == COMM_SERVER_FROM_INTERRUPT){
++#if CMK_IMMEDIATE_MSG
++              CmiHandleImmediate();
++#endif
                return;
        }
  #if CMK_SMP
  #if CMK_SMP
        CmiCommUnlock();
  #endif
++
++      /* when called by communication thread or in interrupt */
++#if CMK_IMMEDIATE_MSG
++      if (where == COMM_SERVER_FROM_SMP) {
++              CmiHandleImmediate();
++      }
++#endif
  }
  
  
@@@ -2392,7 -2392,7 +2403,7 @@@ static inline void *getInfiCmiChunk(in
          // poolIdx = floor(log2(dataSize/firstBinSize))+1
          int ratio = dataSize/firstBinSize;
          int poolIdx=0;
--        void *res;
++        char *res;
  #if CMK_IBVERBS_STATS
        if(numAlloc>10000 && numAlloc%1000==0)
          {
                          count = blockAllocRatio;
                  }
                  res = malloc((allocSize+sizeof(infiCmiChunkHeader))*count);
--                hdr = res;
++                hdr = (infiCmiChunkHeader *)res;
  
                  key = ibv_reg_mr(context->pd,res,(allocSize+sizeof(infiCmiChunkHeader))*count,IBV_ACCESS_REMOTE_READ | IBV_ACCESS_LOCAL_WRITE | IBV_ACCESS_REMOTE_WRITE);
                  CmiAssert(key != NULL);
  
  
  void * infi_CmiAlloc(int size){
--      void *res;
++      char *res;
  #if CMK_IBVERBS_STATS
        numAlloc++;
  #endif
  /*(   if(size-sizeof(CmiChunkHeader) > firstBinSize){*/
                MACHSTATE1(1,"infi_CmiAlloc for dataSize %d",size-sizeof(CmiChunkHeader));
  
--              res = getInfiCmiChunk(size-sizeof(CmiChunkHeader));     
++              res = (char*)getInfiCmiChunk(size-sizeof(CmiChunkHeader));      
                res -= sizeof(CmiChunkHeader);
  #if CMK_SMP   
        CmiMemUnlock();
@@@ -2646,7 -2646,7 +2657,7 @@@ void infi_CmiFree(void *ptr)
                infiCmiChunkMetaData *metaData;
                int poolIdx;
                //there is a infiniband specific header
--              freePtr = ptr - sizeof(infiCmiChunkHeader);
++              freePtr = (char*)ptr - sizeof(infiCmiChunkHeader);
                metaData = METADATAFIELD(ptr);
                poolIdx = metaData->poolIdx;
                if(poolIdx == INFIMULTIPOOL){
@@@ -2939,7 -2939,7 +2950,8 @@@ void CmiDirect_assocLocalBuffer(struct 
  #if CMI_DIRECT_DEBUG
        CmiPrintf("[%d] RDMA assoc addr %p %d remote addr %p \n",CmiMyPe(),table->handles[idx].buf,sendBufSize,userHandle->recverBuf);
  #endif
--      table->handles[idx].callbackFnPtr = table->handles[idx].callbackData = NULL;
++      table->handles[idx].callbackFnPtr = NULL;
++      table->handles[idx].callbackData = NULL;
        table->handles[idx].key =  ibv_reg_mr(context->pd, sendBuf, sendBufSize,IBV_ACCESS_REMOTE_READ | IBV_ACCESS_LOCAL_WRITE | IBV_ACCESS_REMOTE_WRITE);
        CmiAssert(table->handles[idx].key != NULL);
  #if CMK_IBVERBS_STATS
index e49f1cfb205ce2d11d2792b8d8f2e7228adbe2c7,e49f1cfb205ce2d11d2792b8d8f2e7228adbe2c7..69daaf705a2a800024c169d25867d9020a9c4585
@@@ -5,13 -5,13 +5,7 @@@
  #include "queueing.h"
  #include "cldb.h"
  
--#define IDLE_IMMEDIATE                0
  #define TRACE_USEREVENTS        0
--
--#define PERIOD 10                /* default: 30 */
--#define MSGDELAY 10
--#define MAXOVERLOAD 1
--
  #define LOADTHRESH       0
  
  static int WS_Threshold = LOADTHRESH;
@@@ -22,6 -22,6 +16,8 @@@ typedef struct CldProcInfo_s 
  } *CldProcInfo;
  
  int _stealonly1 = 0;
++int _steal_immediate = 0;
++int workstealingproactive = 0;
  
  CpvStaticDeclare(CldProcInfo, CldData);
  CpvStaticDeclare(int, CldAskLoadHandlerIndex);
@@@ -44,8 -44,8 +40,6 @@@ static void StealLoad(
    int mype;
    int numpes;
  
--  /* CcdRaiseCondition(CcdUSER); */
--
    if (CpvAccess(isStealing)) return;    /* already stealing, return */
  
    CpvAccess(isStealing) = 1;
    }while(victim == mype);
  
    CmiSetHandler(&msg, CpvAccess(CldAskLoadHandlerIndex));
--#if IDLE_IMMEDIATE
++#if CMK_IMMEDIATE_MSG
    /* fixme */
--  CmiBecomeImmediate(&msg);
++  if (_steal_immediate) CmiBecomeImmediate(&msg);
  #endif
--  msg.to_rank = CmiRankOf(victim);
++  /* msg.to_rank = CmiRankOf(victim); */
++  msg.to_pe = victim;
    CmiSyncSend(victim, sizeof(requestmsg),(char *)&msg);
    
  #if CMK_TRACE_ENABLED && TRACE_USEREVENTS
@@@ -79,11 -79,11 +74,12 @@@ void LoadNotifyFn(int l
      if(CldCountTokens() <= WS_Threshold)
          StealLoad();
  }
--/* since I am idle, ask for work from neighbors */
  
++/* since I am idle, ask for work from neighbors */
  static void CldBeginIdle(void *dummy)
  {
--    if (CldCountTokens() == 0) StealLoad();
++    //if (CldCountTokens() == 0) StealLoad();
++    StealLoad();
  }
  
  /* immediate message handler, work at node level */
@@@ -100,20 -100,20 +96,26 @@@ static void CldAskLoadHandler(requestms
    now = CmiWallTimer();
  #endif
  
++  //int myload = CldLoad();
++  /* rank = msg->to_rank; */
++  CmiAssert(msg->to_pe!=-1);
++  rank = CmiRankOf(msg->to_pe);
++  CmiAssert(rank!=-1);
++  myload = CldCountTokensRank(rank);
++
    receiver = msg->from_pe;
    /* only give you work if I have more than 1 */
    if (myload>LOADTHRESH) {
        if(_stealonly1) sendLoad = 1;
--      else sendLoad = (myload-LOADTHRESH) / 2; 
--      rank = CmiMyRank();
--      if (msg->to_rank != -1) rank = msg->to_rank;
++      else sendLoad = myload / 2; 
        if(sendLoad > 0)
            CldMultipleSend(receiver, sendLoad, rank, 0);
        CmiFree(msg);
    }else
    {
++      msg->to_pe = msg->from_pe;
        msg->from_pe = CmiMyPe();
--      msg->to_rank = CmiMyRank();
++      /*msg->to_rank = CmiMyRank(); */
  
        /* CcdRaiseCondition(CcdUSER); */
  
@@@ -139,14 -139,14 +141,18 @@@ void  CldAckNoTaskHandler(requestmsg *m
    now = CmiWallTimer();
  #endif
  
--
    do{
        /*victim = (((CrnRand()+notaskpe)&0x7FFFFFFF)%CmiNumPes());*/
        victim = (((CrnRand()+mype)&0x7FFFFFFF)%numpes);
    }while(victim == mype);
  
    /* reuse msg */
--  msg->to_rank = CmiRankOf(victim);
++#if CMK_IMMEDIATE_MSG
++  /* fixme */
++  if (_steal_immediate) CmiBecomeImmediate(msg);
++#endif
++  /*msg->to_rank = CmiRankOf(victim); */
++  msg->to_pe = victim;
    msg->from_pe = mype;
    CmiSetHandler(msg, CpvAccess(CldAskLoadHandlerIndex));
    CmiSyncSendAndFree(victim, sizeof(requestmsg),(char *)msg);
@@@ -167,6 -167,6 +173,7 @@@ void CldHandler(void *msg
    ifn = (CldInfoFn)CmiHandlerToFunction(CmiGetInfo(msg));
    ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
    CsdEnqueueGeneral(msg, queueing, priobits, prioptr);
++  /* CsdEnqueueGeneral(msg, CQS_QUEUEING_LIFO, priobits, prioptr); */
  }
  
  void CldBalanceHandler(void *msg)
@@@ -308,6 -308,6 +315,8 @@@ void CldGraphModuleInit(char **argv
        CmiAssert(WS_Threshold>=0);
    }
  
++  _steal_immediate = CmiGetArgFlagDesc(argv, "+workstealing-immediate", "Charm++> Work Stealing, steal using immediate messages");
++
    /* register idle handlers - when idle, keep asking work from neighbors */
    if(CmiNumPes() > 1)
      CcdCallOnConditionKeep(CcdPROCESSOR_BEGIN_IDLE,
index 5f55e2cdba8d0cecc07f6b041712ba8a0c54f27f,5f55e2cdba8d0cecc07f6b041712ba8a0c54f27f..f4df95de10653f95caafee4679f01e76aa834d4a
@@@ -14,6 -14,6 +14,7 @@@
  typedef struct requestmsg_s {
    char header[CmiMsgHeaderSizeBytes];
    int from_pe;
--  int to_rank;
++/*  int to_rank;  */
++  int to_pe;
  } requestmsg;
  
index 02f54295deeec8dd90cb0d9ecc3a3bdcc113ba20,02f54295deeec8dd90cb0d9ecc3a3bdcc113ba20..2f85389a1fc80a7d7901417c30c794533f80b4eb
@@@ -189,6 -189,6 +189,8 @@@ int skt_sendN(SOCKET hSocket,const voi
  int skt_recvN(SOCKET hSocket,      void *pBuff,int nBytes);
  int skt_sendV(SOCKET fd,int nBuffers,const void **buffers,int *lengths);
  
++int skt_tcp_no_nagle(SOCKET fd);
++
  #ifdef __cplusplus
  }
  #endif