【问题标题】:Is there a custom memory allocator design pattern that does not store metadata in its allocations? [closed]是否存在不将元数据存储在其分配中的自定义内存分配器设计模式? [关闭]
【发布时间】:2015-03-25 01:29:58
【问题描述】:

基本上,我需要一个内存池来快速分配小对象。理想情况下,我想用 cudaMalloc 替换主机上的分配,以及 GPU 上分配的内存。我可以自己编写,如果需要我也会编写,但我不介意换成可靠的开源实现之一。

唯一的问题是,使用 cudaMalloc,内存池无法触及分配的内存。我的理解是,许多(全部?)常见的内存分配器,如标题中的那些,在分配的数据中存储少量元数据。因此它们不会起作用。

有谁知道不是这种情况的内存分配器?

【问题讨论】:

  • 我觉得这里对malloc的内部解释已经很清楚了,所以你可以根据stackoverflow.com/questions/3479330/…提供的信息编写自己的
  • 哦,是的,我同意你的观点! CUDA 内存分配器使用各种固定大小的分配来存储空闲列表,所以我怀疑它已经非常适合要求。想要替换 malloc() 是新软件工程师的必经之路,他们通常会在被要求具体证明需求后摆脱它。
  • @ArchaeaSoftware 需要来自严格的基准测试,cudaMalloc 在一个不可接受的地方花费了数百微秒。我今天早些时候放入了一个带有哈希图的简单缓存分配器,这节省了时间(尽管我的缓存分配器很烂)。非常感谢您加入,但希望您不要称我为新晋软件工程师。
  • @ArchaeaSoftware(和其他人):我们经常在设备上分配小对象。他们不会逗留很长时间。启动初始化数据的内核实际上非常快(几微秒),但使用 cudaMalloc 分配它们的时间要长 100 倍。
  • 你可以试试github.com/Iwan-Zotow/FixedBlockAllocator的一个,但最后还是有一些开销

标签: c++ memory-management cuda memory-pool tcmalloc


【解决方案1】:

如果您所有的小分配都相同大小或具有合理的上限,那么固定大小的池分配器是一个很好的模式。

这个想法是分配器使用系统调用抓取一个大块,然后管理它自己的大块内固定大小块的空闲列表。分配就像获取空闲列表头部的块一样简单。释放有点复杂,但可以根据您的要求以不同的方式实现。

自己编写很简单,或者如果你用谷歌搜索 C++ 固定大小分配器,你可以找到许多不错的实现,包括 boost::pool

【讨论】:

    【解决方案2】:

    任何分配器都需要在某处存储一些元数据。当分配需求变得更简单时,元数据的数量当然会减少。

    我认为,当我正确理解您的问题时,普通的固定大小分配器仍然会给您带来麻烦。正如我所见,你有一个非常特殊的硬件限制。

    您当然可以使用固定池分配器,它不会释放单个分配,而只会释放整个池。因此,将无需在分配的内存中存储元数据。

    当然,您始终可以通过使用不同的内存区域来实现将元数据存储在分配区域之外的分配器。但是大多数库确实将元数据存储在分配的区域中,因为它对于普通架构来说是最方便的。

    所以最好的猜测是找到一个固定的池分配器,它要么不提供释放单个分配的功能,要么您不能使用此功能(因此分配器不存储任何内容)。当然,这只是一种选择,当您可以时,始终释放整个内存池而不是单个分配(顺便说一句,这是防止内存泄漏的良好预防措施,如果适用的话)。

    当然,另一种选择是实现自己的分配器,可能基于使用尽可能简单元数据的简单分配器。

    【讨论】:

      猜你喜欢
      • 2020-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-22
      • 1970-01-01
      • 2012-05-29
      • 2019-08-11
      相关资源
      最近更新 更多