在我的OpenCL内核中,我有相当多的常量来管理内存分配、循环迭代次数等。使用全局定义和# __constants哪个更快?
发布于 2013-02-28 00:23:02
与“普通”C编译器相同的规则也适用于OpenCL编译器:#define在实际编译之前被替换为值,因此它们被嵌入到内核中。
根据定义,__constant变量是在全局内存中分配的,在使用之前必须传输该变量。这比使用#defined文本要慢。然而,NVIDIA和AMD的GPU架构缓存了这些值,并且读取速度比普通全局内存更快。
故事的结尾和我个人的建议:使用#defines存储常量值,使用“魔术”数字和__constant内存存储更大、快速但只读的内存块(例如查找表)。
发布于 2013-03-07 17:38:02
define的工作方式与C语言相同,一个例外是AMD APP SDK v2.8之前的所有版本(没有OpenCL 1.2支持)。
__Constant是cahched的内存空间。请务必阅读有关OpenCL中内存布局的更多信息。
__global是图形处理器的总内存,对所有线程都可见。
__local是图形处理器的本地内存,只对块内的线程可见。
__constant是缓存内存,它比全局内存快得多,但有限,所以只在需要的地方使用它。
__private是图形处理器的私有内存,仅对每个单独的线程可见。
注意:线程,我指的是处理元素。
https://stackoverflow.com/questions/15116521
复制相似问题