OpenCL __constant vs #define

时间:2013-02-27 15:56:31

标签: opencl

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

是否更快?

2 个答案:

答案 0 :(得分:4)

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

根据定义,__constant变量在全局内存中分配,必须在使用前进行传输。这比使用#define d文字要慢。但是,NVIDIA和AMD的GPU架构可以缓存这些值,并且比普通的全局内存更快阅读。

故事结束和我的个人建议:使用#defines表示常量值以及“魔术”数字和__constant内存,用于较大的快速但只读的内存块(例如查找表)。 / p>

答案 1 :(得分:1)

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

__ Constant是cahched内存空间。请在OpenCL中阅读有关内存布局的更多信息。

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

__ local是GPU的本地内存,仅由块内的线程可见。

__ constant是缓存内存,它比全局快但速度有限,因此只在需要的地方使用它。

__ private是GPU的私有内存,仅由每个单独的线程可见。

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