繁体   English   中英

使用HWLOC的NUMA系统的realloc()

[英]realloc() for NUMA Systems using HWLOC

我有几个自定义分配器,提供不同的方法来根据不同的策略分配内存。 其中一个在定义的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()

两种可能的解决方

  1. 分配新的内存区域和memcpy()数据
  2. 使用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的缓冲区中)

从未使用过,但看起来很有趣。

hwloc_set_area_membind_nodeset可以解决问题,不是吗?

 HWLOC_DECLSPEC int     
  hwloc_set_area_membind_nodeset (hwloc_topology_t topology, 
    const void *addr, size_t len, hwloc_const_nodeset_t nodeset, 
    hwloc_membind_policy_t policy, int flags)

将由(addr,len)标识的已分配内存绑定到节点集中的NUMA节点。

返回:

  • -1如果不支持该操作,则将errno设置为ENOSYS
  • -1如果无法强制执行绑定,则将errno设置为EXDEV

在linux上,这个调用是通过mbind实现的。它仅在没有触摸区域中的页面时起作用,所以它是在第二个解决方案中移动内存区域的更正确的方法。 UPDATE有一个MPOL_MF_MOVE *标志来移动触摸的数据。

我知道唯一没有重新分配和复制的移动页面的系统调用是move_pages

move_pages将执行进程的地址空间中的一组页面移动到不同的NUMA节点。

你错了。 mbind可以移动已被触摸的页面。 您只需添加MPOL_MF_MOVE即可。 如果添加标志HWLOC_MEMBIND_MIGRATE那就是hwloc_set_area_membind_nodeset()作用。

move_pages只是一种不同的方式(更灵活,但有点慢,因为你可以将独立的页面移动到不同的地方)。 mbind与MPOL_MF_MOVE和move_pages(以及migrate_pages migrate_pages()在将输入转换为页面列表后,最终使用mm / migrate.c中MPOL_MF_MOVE migrate_pages( migrate_pages()函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM