【问题标题】:How to make cudaMalloc dynamically如何动态制作cudaMalloc
【发布时间】:2012-03-21 08:03:12
【问题描述】:

我需要动态执行 cudaMalloc 来为动态扩展的数组分配内存,该数组的大小可以在很大范围内变化。该数组表示两个表的连接操作的结果,因此它可以是零大小或达到最大数据量(如果表包含完全相似的数据)。

如果我因为期望表的数据几乎相似而分配内存,我可以获得大量根本没有使用的内存

那么,有没有办法通过 CUDA 动态执行内存分配以提高内存使用效率?

【问题讨论】:

  • 我不明白这个问题。 cudaMalloc 动态的,运行时内存分配。您是在询问在正在运行的内核中完成内存分配还是在其他方面?
  • 您是否希望 cudaMalloc 自动为您的数组保留额外的内存,您是否需要扩展它?
  • 我的意思是在运行内核之前先分配最小大小的数组,但是可以在内核运行时扩展(额外的内存分配)

标签: cuda


【解决方案1】:

无法动态扩展内核中先前分配的内存。你得到的最接近的是费米上的“新”和“删除”。但是那些分配新块,它们不会扩展您现有的块。但是,我认为尝试在内核中扩展分配的内存没有任何意义。只需预先分配内核可以使用的最大内存量。如果这意味着您没有足够的内存来完成之后的数据处理,那么如果您能够动态扩展内存,那么程序无论如何都无法处理这种情况。

此外,您将不断扩展分配的内存以保存新结果的方案将需要线程之间的大量通信(因为所有线程都必须知道当前已找到多少结果)。相反,不要试图创建一个没有间隙的结果集。让连接的结果存储在整个分配区域中,与线程索引对应的位置。然后,使用第二个内核或 Thrust 扫描结果以将结果收集在一起。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-25
    • 1970-01-01
    • 2019-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-11
    相关资源
    最近更新 更多