【发布时间】:2012-09-03 16:48:11
【问题描述】:
我有一个每个块的数据数组。 我在 cuda Grid 中有 N 个块和一个大小为 N 的常量数据数组“block_data[]”。
因此,给定块“X”中的所有线程仅访问一次 block_data[X],并使用该值执行某些操作。
我的问题是:这种广播方案是否有效? 如果不是,我应该采取什么方法?
在 cmets 之后编辑:我对常量内存的唯一问题是它的大小有限,因为我可以拥有超过 64K 的块。这意味着超过 64KB
问候
【问题讨论】:
-
您是否修改了 cuda 内核中的 block_data ?如果不是,则将其分配在针对该类型的访问进行了精确优化的常量内存中是有意义的
-
它没有变化,实际上它是一个查找表。常量内存的唯一问题是整个内核执行的内存是 64KB,对吗?
-
是的,总共只有 64kb 的常量内存。顺便说一句,我记得如果地址不依赖于线程 ID(这可能是您的情况),Fermi GPU 还可以通过常量缓存(即加载统一)从全局内存中加载只读数据。因此,我认为如果您按原样使用 block_data 不会对性能产生任何影响
-
是的,大多数查找表都没有被常量内存很好地服务。 @asm 是对的,加载统一指令可能是你最好的选择。
-
是的,它是 ptx 指令。只需确保使用 const 限定符声明 block_array 即可。然后你可以检查生成的ptx代码,看看是否确实使用了load uniform