在linux系统中,pthreads库为我们提供了用于对齐缓存的功能(posix_memalign),以防止错误共享。要选择架构的特定NUMA节点,我们可以使用libnuma库。我想要的是同时需要两者的东西。我将某些线程绑定到某些处理器,并且我想为来自相应NUMA节点的每个线程分配本地数据结构,以减少线程的内存操作延迟。我怎样才能做到这一点?
如果您只是希望围绕NUMA分配器获得对齐功能,则可以轻松构建自己的对齐功能。
想法是将未对齐的malloc()空间称为更多空间。然后返回第一个对齐的地址。为了释放它,您需要将基址存储在已知位置。
malloc()
这是一个例子。只需用适当的名称替换名称:
pint // An unsigned integer that is large enough to store a pointer. NUMA_malloc // The NUMA malloc function NUMA_free // The NUMA free function void* my_NUMA_malloc(size_t bytes,size_t align, /* NUMA parameters */ ){ // The NUMA malloc function void *ptr = numa_malloc( (size_t)(bytes + align + sizeof(pint)), /* NUMA parameters */ ); if (ptr == NULL) return NULL; // Get aligned return address pint *ret = (pint*)((((pint)ptr + sizeof(pint)) & ~(pint)(align - 1)) + align); // Save the free pointer ret[-1] = (pint)ptr; return ret; } void my_NUMA_free(void *ptr){ if (ptr == NULL) return; // Get the free pointer ptr = (void*)(((pint*)ptr)[-1]); // The NUMA free function numa_free(ptr); }
要使用此功能,您需要调用my_NUMA_free分配的任何内容my_NUMA_malloc。
my_NUMA_free
my_NUMA_malloc