9

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

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

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

4

2 回答 2

2

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

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

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

于 2015-01-27T00:36:19.337 回答
0

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

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

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

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

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

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

于 2015-02-19T00:34:49.533 回答