c++ - 使用 HWLOC 的 NUMA 系统的 realloc()

标签 c++ linux memory numa

我有几个自定义分配器,它们提供了不同的方法来根据不同的策略分配内存。其中之一在定义的 NUMA 节点上分配内存。分配器的接口(interface)很简单

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() 为节点集设置内存分配/绑定(bind)策略,并使用普通的 malloc()/posix_memalign()realloc().

谁能帮我解决这个问题?

更新:

我试着让问题更具体:是否有可能在不分配新内存和移动页面的情况下使用 hwloc 执行 realloc()

最佳答案

要回复编辑: hwloc 中没有 realloc,我们目前没有计划添加一个。如果您准确地看到了您想要的(函数的 C 原型(prototype)),请随时向 https://svn.open-mpi.org/trac/hwloc 添加一张票

回复 ogsx:内存绑定(bind)不是特定的,它是虚拟内存区域特定的,并且可能是线程特定的。如果你重新分配,libc 不会做任何特别的事情。 1)如果它可以在同一个页面内重新分配,你就可以在同一个节点上获得内存。很好,但很少见,尤其是对于大型缓冲区。 2)如果它在不同的页面中重新分配(大多数情况下是大缓冲区),这取决于相应的页面是否已经在过去由 malloc lib 在物理内存中分配(在虚拟内存中分配和释放,但是仍然分配在物理内存中) 2.a) 如果已经分配了虚拟页面,它可能在过去由于各种原因分配到另一个节点上,你搞砸了。 2.b) 如果新的虚拟页还没有分配,默认在当前节点上分配。如果您之前使用 set_area_membind() 或 mbind() 指定了绑定(bind),它将被分配到正确的节点上。在这种情况下您可能会很高兴。

简而言之,这取决于很多事情。如果你不想为 malloc lib 做复杂/隐藏的内部事情而烦恼,特别是如果你的缓冲区很大,做 mmap(MAP_ANONYMOUS) 而不是 malloc 是确保页面在你真正需要时分配的简单方法他们。您甚至可以使用 mremap 来执行类似于 realloc 的操作。

alloc 变成 mmap(length) + set_area_membind realloc 变为 mremap + set_area_membind(在整个 mremap 缓冲区上)

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

关于c++ - 使用 HWLOC 的 NUMA 系统的 realloc(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6933129/

相关文章:

linux - 单个主机上的多个 glibc 库

c++ - Bad_alloc 问题

Objective-C/Cocoa : Uploading Images, 工作内存和存储

c++ - OpenGL glRasterPos 没有正确接受我的值

c++ - Arduino 类中的 Serial.println

c++ - 编写 C++ 版本的代数游戏 24

linux - wsl ubuntu问题上的jenkins安装

linux - Nginx重写规则动态子文件夹和路径

c# - 哪个占用更多内存,字符串值还是长值?

c++ - 无法使用成员函数更改私有(private)变量