fix a size bug in LrtsAlloc (should minus mempool header),
authorGengbin Zheng <gzheng@illinois.edu>
Fri, 4 Nov 2011 09:04:17 +0000 (02:04 -0700)
committerGengbin Zheng <gzheng@illinois.edu>
Fri, 4 Nov 2011 09:04:17 +0000 (02:04 -0700)
also fix a bug in expand mempool with size greater than default. The size should consider mempool_block size.

src/arch/gemini_gni/machine.c
src/arch/util/mempool.c
src/arch/util/mempool.h

index 780cb1d7ea3a43c7b87d8cd8e9507fa3a1a3e22c..65d153706ec025bc813b93314a9bb3ab8c84b336 100644 (file)
@@ -42,7 +42,7 @@ static void sleep(int secs) {
 #if USE_LRTS_MEMPOOL
 #define oneMB (1024ll*1024)
 #if CMK_SMP
-static CmiInt8 _mempool_size = 64*oneMB;
+static CmiInt8 _mempool_size = 32*oneMB;
 #else
 static CmiInt8 _mempool_size = 32*oneMB;
 #endif
@@ -1139,8 +1139,10 @@ static void getLargeMsgRequest(void* header, uint64_t inst_id)
         rdma_request_msg->destNode = inst_id;
         rdma_request_msg->pd = pd;
         PCQueuePush(sendRdmaBuf, (char*)rdma_request_msg);
-    }else
+    }else {
+        /* printf("source: %d pd:%p\n", source, pd); */
         GNI_RC_CHECK("AFter posting", status);
+    }
 #endif
 }
 
@@ -1515,7 +1517,7 @@ static void _init_static_smsg()
     gni_smsg_attr_t      remote_smsg_attr;
     gni_smsg_attr_t      *smsg_attr_vec;
     gni_mem_handle_t     my_smsg_mdh_mailbox;
-    int      i;
+    int      ret, i;
     gni_return_t status;
     uint32_t              vmdh_index = -1;
     mdh_addr_t            base_infor;
@@ -1541,8 +1543,8 @@ static void _init_static_smsg()
     smsg_attr[0].msg_maxsize = SMSG_MAX_MSG;
     status = GNI_SmsgBufferSizeNeeded(&smsg_attr[0], &smsg_memlen);
     GNI_RC_CHECK("GNI_GNI_MemRegister mem buffer", status);
-    smsg_mailbox_base = memalign(64, smsg_memlen*(mysize));
-    _MEMCHECK(smsg_mailbox_base);
+    ret = posix_memalign(&smsg_mailbox_base, 64, smsg_memlen*(mysize));
+    CmiAssert(ret == 0);
     bzero(smsg_mailbox_base, smsg_memlen*(mysize));
     //if (myrank == 0) printf("Charm++> allocates %.2fMB for SMSG. \n", smsg_memlen*mysize/1e6);
     
@@ -1663,17 +1665,26 @@ static void _init_DMA_buffer()
 
     allgather(&DMA_buffer_base_mdh_addr, DMA_buffer_base_mdh_addr_vec, sizeof(mdh_addr_t) );
 }
+
 #if USE_LRTS_MEMPOOL
 void *alloc_mempool_block(size_t *size, gni_mem_handle_t *mem_hndl, int expand_flag)
 {
     void *pool;
+    int ret;
 
     int default_size =  expand_flag? _expand_mem : _mempool_size;
     if (*size < default_size) *size = default_size;
-    pool = memalign(ALIGNBUF, *size);
+    ret = posix_memalign(&pool, ALIGNBUF, *size);
+    if (ret != 0) {
+      printf("Charm++> can not allocate memory pool of size %.2fMB. \n", 1.0*(*size)/1024/1024);
+      if (ret == ENOMEM)
+        CmiAbort("alloc_mempool_block: out of memory.");
+      else
+        CmiAbort("alloc_mempool_block: posix_memalign failed");
+    }
     gni_return_t status = MEMORY_REGISTER(onesided_hnd, nic_hndl, pool, *size,  mem_hndl, &omdh);
     if(status != GNI_RC_SUCCESS)
-        printf("!!!!!!!!!!!Please try to use large page + module load craype-hugepages8m+ or contact charm++ developer for help\n");
+        printf("Charm++> Fatal error with registering memory: Please try to use large page (module load craype-hugepages8m) or contact charm++ developer for help.\n");
     GNI_RC_CHECK("Mempool register", status);
     return pool;
 }
@@ -1685,6 +1696,7 @@ void free_mempool_block(void *ptr, gni_mem_handle_t mem_hndl)
     free(ptr);
 }
 #endif
+
 void LrtsPreCommonInit(int everReturn){
 #if USE_LRTS_MEMPOOL
     CpvInitialize(mempool_type*, mempool);
@@ -1737,7 +1749,7 @@ void LrtsInit(int *argc, char ***argv, int *numNodes, int *myNodeID)
 #else
         printf("Charm++> use Static SMSG\n");
 #endif
-        printf("Charm++> Running on Gemini (GNI) using %d  cores\n", mysize);
+        printf("Charm++> Running on Gemini (GNI) using %d cores\n", mysize);
     }
 #ifdef USE_ONESIDED
     onesided_init(NULL, &onesided_hnd);
@@ -1831,13 +1843,12 @@ void* LrtsAlloc(int n_bytes, int header)
     {
         int totalsize = n_bytes+header;
         ptr = malloc(totalsize);
-    }else 
-    {
-
-        CmiAssert(header <= ALIGNBUF);
+    }
+    else {
+        CmiAssert(header+sizeof(mempool_header) <= ALIGNBUF);
 #if     USE_LRTS_MEMPOOL
         n_bytes = ALIGN64(n_bytes);
-        char *res = mempool_malloc(CpvAccess(mempool), ALIGNBUF+n_bytes, 1);
+        char *res = mempool_malloc(CpvAccess(mempool), ALIGNBUF+n_bytes-sizeof(mempool_header), 1);
         ptr = res - sizeof(mempool_header) + ALIGNBUF - header;
 #else
         n_bytes = ALIGN4(n_bytes);           /* make sure size if 4 aligned */
@@ -1863,7 +1874,6 @@ void  LrtsFree(void *msg)
 #endif
 #if     USE_LRTS_MEMPOOL
 #if CMK_SMP
-
         mempool_free_thread((char*)msg + sizeof(CmiChunkHeader) - ALIGNBUF + sizeof(mempool_header));
 #else
         mempool_free(CpvAccess(mempool), (char*)msg + sizeof(CmiChunkHeader) - ALIGNBUF + sizeof(mempool_header));
index e0fbc3125aba16af5c0768d1c508568b44ff2248..6974963dd29692859a48c22bc8fe7cc4ac771e0c 100644 (file)
@@ -77,8 +77,8 @@ void*  mempool_malloc(mempool_type *mptr, int size, int expand)
 {
     int     bestfit_size = MAX_INT; //most close size 
     size_t    *freelist_head = &mptr->freelist_head;
-    mempool_header *freelist_head_ptr, *current, *previous, *bestfit, *bestfit_previous;
-    mempool_block *mempools_head;
+    mempool_header *freelist_head_ptr
+    mempool_header *current, *previous, *bestfit, *bestfit_previous;
 
 #if CMK_SMP
     CmiLock(mptr->mempoolLock);
@@ -88,7 +88,6 @@ void*  mempool_malloc(mempool_type *mptr, int size, int expand)
     previous = NULL;
     bestfit = NULL;
     bestfit_previous = NULL;
-    mempools_head = &(mptr->mempools_head);
 
 #if  MEMPOOL_DEBUG
     CmiPrintf("[%d] request malloc from pool: %p  free_head: %p %d for size %d, \n", CmiMyPe(), mptr, freelist_head_ptr, mptr->freelist_head, size);
@@ -140,7 +139,7 @@ void*  mempool_malloc(mempool_type *mptr, int size, int expand)
         if (!expand) return NULL;
 
          /* set minimum size, newblockfn checks against the default size */
-        expand_size = 2*size
+        expand_size = size + sizeof(mempool_block)
         pool = mptr->newblockfn(&expand_size, &mem_hndl, 1);
         expand_pool = (mempool_block*)pool;
         expand_pool->mempool_ptr = pool;
@@ -155,10 +154,10 @@ void*  mempool_malloc(mempool_type *mptr, int size, int expand)
         memblock_tail->memblock_next = mptr->memblock_tail = (char*)expand_pool - (char*)mptr;
 
         bestfit = (mempool_header*)((char*)expand_pool->mempool_ptr + sizeof(mempool_block));
-        bestfit->size = expand_size-sizeof(mempool_block);
+        bestfit_size = expand_size-sizeof(mempool_block);
+        bestfit->size = bestfit_size;
         bestfit->mem_hndl = expand_pool->mem_hndl;
         bestfit->next_free = 0;
-        bestfit_size = expand_size-sizeof(mempool_block);
 #if 1
          /* insert bestfit to the sorted free list */
         previous = NULL;
@@ -210,12 +209,12 @@ void*  mempool_malloc(mempool_type *mptr, int size, int expand)
 printf("[%d] freelist_head in malloc  offset:%d free_head: %ld %ld %d %d\n", myrank, (char*)bestfit-(char*)mptr, *freelist_head, ((mempool_header*)((char*)mptr+*freelist_head))->next_free, bestfit_size, size);
 #endif
     CmiAssert(*freelist_head >= 0);
+
 #if CMK_SMP
     CmiUnlock(mptr->mempoolLock);
+    bestfit->pool_addr = mptr;
 #endif
-#if CMK_SMP
-    ((mempool_header *)bestfit)->pool_addr = mptr;
-#endif
+
     return (char*)bestfit + sizeof(mempool_header);
 }
 
@@ -232,6 +231,7 @@ void mempool_free_thread( void *ptr_free)
     CmiUnlock(mptr->mempoolLock);
 }
 #endif
+
 //sorted free_list and merge it if it become continous 
 void mempool_free(mempool_type *mptr, void *ptr_free)
 {
@@ -239,7 +239,6 @@ void mempool_free(mempool_type *mptr, void *ptr_free)
     int merged = 0;
     int free_size;
     void *free_lastbytes_pos;
-    mempool_block     *mempools_head;
     size_t    *freelist_head;
     mempool_header    *freelist_head_ptr;
     mempool_header    *current;
@@ -248,7 +247,6 @@ void mempool_free(mempool_type *mptr, void *ptr_free)
 
     to_free = (mempool_header *)((char*)ptr_free - sizeof(mempool_header));
 
-    mempools_head = &(mptr->mempools_head);
     freelist_head = &mptr->freelist_head;
     freelist_head_ptr = mptr->freelist_head?(mempool_header*)((char*)mptr+mptr->freelist_head):NULL;
     current = freelist_head_ptr;
@@ -271,7 +269,7 @@ void mempool_free(mempool_type *mptr, void *ptr_free)
 #if  MEMPOOL_DEBUG
     if (current) CmiPrintf("[%d] previous=%p, current=%p size:%d %p\n", CmiMyPe(), previous, current, current->size, free_lastbytes_pos);
 #endif
-    //continuos with previous free space 
+    //continue with previous free space 
     if(previous!= NULL && (char*)previous+previous->size == (char*)to_free &&  memcmp(&previous->mem_hndl, &to_free->mem_hndl, sizeof(mem_handle_t))==0 )
     {
         previous->size +=  free_size;
index dd1955dbd3103d3d90054ead5fca1eda90785f20..64f2faae03fc674b522dce52f4993db0a22a9129 100644 (file)
@@ -26,12 +26,12 @@ typedef struct mempool_block_t
 
 typedef struct mempool_header
 {
-  int size;
-  mem_handle_t  mem_hndl;
-  size_t            next_free;
 #if CMK_SMP
   void*             pool_addr;
 #endif
+  mem_handle_t  mem_hndl;
+  size_t            next_free;
+  int size;
 } mempool_header;
 
 typedef void * (* mempool_newblockfn)(size_t *size, mem_handle_t *mem_hndl, int expand_flag);