OpenCL _常数vs#定义

OpenCL _常数vs#定义,opencl,Opencl,在我的OpenCL内核中,我有很多常数来控制内存分配、循环迭代次数等。使用全局常量或定义更快吗?与“普通”C编译器相同的规则适用于OpenCL编译器:在实际编译之前,将定义替换为值,从而将它们烘焙到内核中 根据定义,全局内存中分配了一个\u常量变量,必须在使用前进行传输。这比使用#defined文本要慢。然而,NVIDIA和AMD的GPU架构缓存了这些值,并且比普通的全局内存读取速度更快 故事的结尾和我的个人建议:使用#define来定义常量值以及“神奇”数字,并使用u constant内存来定

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

与“普通”C编译器相同的规则适用于OpenCL编译器:在实际编译之前,将定义替换为值,从而将它们烘焙到内核中

根据定义,全局内存中分配了一个
\u常量
变量,必须在使用前进行传输。这比使用
#define
d文本要慢。然而,NVIDIA和AMD的GPU架构缓存了这些值,并且比普通的全局内存读取速度更快


故事的结尾和我的个人建议:使用
#define
来定义常量值以及“神奇”数字,并使用
u constant
内存来定义更大的快速只读内存块(例如查找表)。

define的工作方式与C中的工作方式相同。AMD APP SDK v2.8之前的所有版本都是例外(不支持OpenCL 1.2)

__常量是cahched内存空间。请阅读更多关于OpenCL内存布局的信息

__全局是GPU的总内存,对所有线程都可见

__local是GPU的本地内存,仅块内的线程可见

__常量是缓存内存,它比全局内存快得多,但有限,因此仅在需要时使用它

__private是GPU的私有内存,仅每个线程可见


注:线程,我指的是处理元素。

我同意你的说法,除了必须传输恒定内存这一事实。我从来没有这样做过。对我来说,使用常量内存的唯一方法是使用#define…定义一个大常量数组的值。你创建一个常量内存缓冲区,就像其他任何内存缓冲区一样,但是设置了
CL\u MEM\u READ\u
标志。要传输它,您可以使用
CL\u MEM\u COPY\u HOST\u PTR
标志,或者像往常一样使用
clEnqueueWriteBuffer
进行复制。如果您使用的是u constant buffer,请记住检查设备信息属性CL\u Device\u MAX\u constant\u buffer\u SIZE以获得最大常量缓冲区大小。@matthias,这对我不起作用。与源代码中定义的常量数组相比,使用CL_MEM_READ_创建的缓冲区执行的内核速度要慢得多。。。就好像它没有进入缓存内存一样。您还为参数使用了
\uu常量
说明符?