我的OpenCL内核中有很多常量可以控制内存分配,循环迭代次数等。使用全局__constants或#defines?
是否更快?答案 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的私有内存,仅由每个单独的线程可见。
注意:线程,我的意思是处理元素。