【发布时间】: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