2

在我的 OpenCL 内核中,我有很多控制内存分配、循环迭代次数等的常量。使用全局 __constants 或 #defines 更快吗?

4

2 回答 2

4

与“普通”C 编译器相同的规则适用于 OpenCL 编译器:A被实际编译之前#define的值替换,因此它们被烘焙到内核中。

根据定义,__constant变量在全局内存中分配,并且必须在使用前传输。这比使用#defined 文字要慢。但是,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 回答