内核内部的小数组动态分配的替代方案?

时间:2019-07-11 09:46:59

标签: cuda

我有一个需要少量内存才能运行的内核。但是,此内存是特定于输入的,因此我在内部malloc内进行动态分配,但是它通常是一个很小的向量,长度很少超过5,几乎永远不会超过10。但是,每次执行时在程序中,只有1个长度值存在,它只需要动态以支持不同的输入,在整个程序的每次执行中长度是相同的。

(简而言之,它是深度优先的树形搜索,其中搜索到的对象可以是多个叶子的一部分,因此我需要跟踪当前搜索路径是哪个,以及在路径中的每个节点中检查了多少。相关,只需添加一些信息即可。

我测试了动态分配和静态分配大小(int path[6];)之间的速度差异,毫不奇怪,静态版本快15倍。

是否有替代方法可以为我的特殊情况动态分配数组(对于程序的给定执行,我一直都知道数组的长度相同)?我想到只是静态分配例如的向量10个值,因此我总是很安全,但这对我的输入大小设置了一个任意上限,即使很难达到,我也不愿意这样做。有任何想法吗?

1 个答案:

答案 0 :(得分:1)

给出

  1. 您知道先验
  2. 所需的本地存储大小的值
  3. 您知道本地存储大小的范围很小且有限,

逻辑解决方案是使用模板,将大小作为模板参数传递:

LoadData()

这样做带来了其他优点,尤其是数组大小现在是编译时间常数。这意味着编译器可以部署很多优化,例如展开循环,如果非常幸运,可以将数组溢出到寄存器中。这也意味着通常的编译器控件(如启动范围,寄存器限制等)也可以按预期工作,并且可以在每个不同的本地存储大小下提高性能。