在我的 OpenCL 内核中,我有很多控制内存分配、循环迭代次数等的常量。使用全局 __constants 或 #defines 更快吗?
问问题
5945 次
2 回答
4
与“普通”C 编译器相同的规则适用于 OpenCL 编译器:A被实际编译之前#define
的值替换,因此它们被烘焙到内核中。
根据定义,__constant
变量在全局内存中分配,并且必须在使用前传输。这比使用#define
d 文字要慢。但是,NVIDIA 和 AMD 的 GPU 架构会缓存这些值,并且比普通的全局内存读取速度更快。
故事结束和我的个人建议:#defines
用于常量值以及“神奇”数字和__constant
内存,用于更大的快速但只读的内存块(例如查找表)。
于 2013-02-27T16:23:02.470 回答
1
define 的工作方式与 C 中的相同。AMD APP SDK v2.8 之前的所有版本(不支持 OpenCL 1.2)是一个例外。
__Constant 是缓存的内存空间。请阅读有关 OpenCL 中内存布局的更多信息。
__global 是 GPU 的总内存,对所有线程可见。
__local 是 GPU 的本地内存,只有块内的线程可见。
__constant 是缓存内存,它比全局快得多但有限,因此仅在需要时使用它。
__private 是 GPU 的私有内存,仅对每个单独的线程可见。
注意:线程,我的意思是处理元素。
于 2013-03-07T09:38:01.933 回答