我有几个自定义分配器,提供不同的方法来根据不同的策略分配内存.其中一个在定义的NUMA节点上分配内存.分配器的接口是直截了当的
template<typename config>
class NumaNodeStrategy
{
public:
static void *allocate(const size_t sz){}
static void *reallocate(void *old, size_t sz, size_t old_sz){}
static void deallocate(void *p, size_t sz){}
};
使用hwloc_alloc_membind_nodeset()方法处理分配本身,并为分配策略设置相应的参数等.但是,hwloc只提供分配和释放内存的方法,我想知道如何实现reallocate().
两种可能的解决方
>分配新的内存区域和memcpy()数据
>使用hwloc_set_membind_nodeset()为节点集设置内存分配/绑定策略,并使用plain malloc()/ posix_memalign()和realloc().
能帮助我做到这一点吗?
更新:
我尝试使问题更具体:是否有可能使用hwloc执行realloc()而不分配新内存并移动页面?
解决方法:
要回复编辑:
hwloc中没有realloc,我们目前没有计划添加一个.如果你看到了你想要的(函数的C原型),可以随意添加https://svn.open-mpi.org/trac/hwloc的票证
回复ogsx:内存绑定不是特定的,它是特定的虚拟内存区域,可能是特定于线程的.如果你重新分配,libc没有做任何特别的事情.
1)如果它可以在同一页面内重新分配,则会在同一节点上获得内存.好,但很少见,特别是对于大缓冲区.
2)如果它在一个不同的页面重新分配(大多数情况下是大缓冲区),它取决于过去的malloc lib是否已经在物理内存中分配了相应的页面(malloc’ed并在虚拟内存中释放,但是仍然在物理内存中分配)
2.a)如果已经分配了虚拟页面,它可能由于各种原因在过去分配到另一个节点上,你就搞砸了.
2.b)如果尚未分配新虚拟页面,则默认为在当前节点上分配.如果您之前使用set_area_membind()或mbind()指定了绑定,则它将在右侧节点上分配.在这种情况下你可能会很开心.
简而言之,它取决于很多事情.如果您不想使用malloc lib来执行复杂/隐藏的内部事务,特别是如果缓冲区很大,那么执行mmap(MAP_ANONYMOUS)而不是malloc是确保在您真正需要时分配页面的简单方法他们.你甚至有mremap做类似于realloc的事情.
alloc变为mmap(length)set_area_membind
realloc成为mremap set_area_membind(在整个mremap的缓冲区中)
从未使用过,但看起来很有趣.