add mem region support for nm malloc
This commit is contained in:
parent
4d50e55e1e
commit
cd4785f08a
@ -10,10 +10,12 @@
|
||||
#include "nmp.h"
|
||||
|
||||
static pthread_mutex_t alloc_lock;
|
||||
static int nm_mem_idx[NM_MAX_OBJS_PER_LVL];
|
||||
static void* nm_mem_regions[NM_MAX_OBJS_PER_LVL];
|
||||
static constexpr unsigned int MEM_OBJ_SIZE = 4096; // 4k
|
||||
static constexpr unsigned int MEM_OBJ_NUM = 1024 * 256; // 4k * 1024 * 256 = 1024MB per node
|
||||
static constexpr unsigned int MEM_OBJ_NUM = 1024 * 256; // 4k * 1024 * 255 = 1GB per region
|
||||
static constexpr unsigned int MEM_REGION_NUM = 4; // 4 x 1GB = 4GB total
|
||||
static int nm_mem_idx[NM_MAX_OBJS_PER_LVL];
|
||||
static int nm_mem_region_idx[NM_MAX_OBJS_PER_LVL];
|
||||
static void* nm_mem_regions[NM_MAX_OBJS_PER_LVL][MEM_REGION_NUM];
|
||||
|
||||
int
|
||||
nm_alloc_init()
|
||||
@ -46,25 +48,28 @@ nm_alloc_init()
|
||||
return ret;
|
||||
}
|
||||
|
||||
if ((nm_mem_regions[i] = mmap(nullptr, MEM_OBJ_NUM * MEM_OBJ_SIZE, PROT_READ | PROT_WRITE,
|
||||
MAP_ANON | MAP_ALIGNED_SUPER | MAP_NOCORE | MAP_PRIVATE,
|
||||
-1, 0)) == MAP_FAILED) {
|
||||
if (nm_get_verbose() > 0) {
|
||||
fprintf(stdout, "libnm: mmap failed with %d\n", errno);
|
||||
for (unsigned int j = 0; j < MEM_REGION_NUM; j++) {
|
||||
if ((nm_mem_regions[i][j] = mmap(nullptr, MEM_OBJ_NUM * MEM_OBJ_SIZE, PROT_READ | PROT_WRITE,
|
||||
MAP_ANON | MAP_ALIGNED_SUPER | MAP_NOCORE | MAP_PRIVATE,
|
||||
-1, 0)) == MAP_FAILED) {
|
||||
if (nm_get_verbose() > 0) {
|
||||
fprintf(stdout, "libnm: mmap failed with %d\n", errno);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
// touch the pages to prefault the pages
|
||||
for (unsigned int j = 0; j < MEM_OBJ_NUM; j++) {
|
||||
*(uint32_t*)((char*)nm_mem_regions[i] + j * MEM_OBJ_SIZE) = 0;
|
||||
// touch the pages to prefault the pages
|
||||
for (unsigned int k = 0; k < MEM_OBJ_NUM; k++) {
|
||||
*(uint32_t*)((char*)nm_mem_regions[i][j] + k * MEM_OBJ_SIZE) = 0;
|
||||
}
|
||||
|
||||
if (nm_get_verbose() > 0) {
|
||||
fprintf(stdout, "libnm: reserved %u bytes (%u MB) on node %d. vaddr: 0x%p\n", MEM_OBJ_NUM * MEM_OBJ_SIZE, MEM_OBJ_SIZE * MEM_OBJ_NUM / 1024 / 1024, i, nm_mem_regions[i][j]);
|
||||
}
|
||||
}
|
||||
|
||||
nm_mem_idx[i] = 0;
|
||||
|
||||
if (nm_get_verbose() > 0) {
|
||||
fprintf(stdout, "libnm: reserved %u bytes (%u MB) on node %d\n", MEM_OBJ_NUM * MEM_OBJ_SIZE, MEM_OBJ_SIZE * MEM_OBJ_NUM / 1024 / 1024, i);
|
||||
}
|
||||
nm_mem_region_idx[i] = 0;
|
||||
}
|
||||
|
||||
// restore existing thread's allocation strategy
|
||||
@ -78,14 +83,27 @@ nm_malloc(unsigned int node, size_t size)
|
||||
{
|
||||
void * ret = nullptr;
|
||||
int num_objs = (size + MEM_OBJ_SIZE - 1) / MEM_OBJ_SIZE;
|
||||
bool retry = false;
|
||||
|
||||
pthread_mutex_lock(&alloc_lock);
|
||||
if ((int)MEM_OBJ_NUM - nm_mem_idx[node] >= num_objs) {
|
||||
ret = (char*)nm_mem_regions[node] + MEM_OBJ_SIZE * nm_mem_idx[node];
|
||||
nm_mem_idx[node] += num_objs;
|
||||
int cur_region = nm_mem_region_idx[node];
|
||||
int cur_idx = nm_mem_idx[node];
|
||||
|
||||
retry:
|
||||
if ((int)MEM_OBJ_NUM - cur_idx >= num_objs) {
|
||||
ret = (char*)nm_mem_regions[node][cur_region] + MEM_OBJ_SIZE * cur_idx;
|
||||
nm_mem_region_idx[node] = cur_region;
|
||||
nm_mem_idx[node] = cur_idx + num_objs;
|
||||
} else if (!retry && (cur_region < (int)MEM_REGION_NUM)) {
|
||||
// check next region
|
||||
cur_region++;
|
||||
cur_idx = 0;
|
||||
retry = true;
|
||||
goto retry;
|
||||
}
|
||||
pthread_mutex_unlock(&alloc_lock);
|
||||
|
||||
printf("size: 0x%lx alloc: %p\n", size, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user