2013-02-27 36 views
2

我在我的OpenCL内核中有相当多的常量来管理内存分配,循环迭代次数等。使用全局__constants或#define会更快吗?OpenCL __constant vs #define

回答

4

同样的规则作为用于“正常的” C编译器应用到OpenCL编译:甲#define之前实际编译替换为值,因此它们烘烤到内核中。

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

末和我个人的建议是:使用#defines恒定值,以及“魔术”号和__constant内存大速度快,但只读存储器模块(例如查找表)。

+0

我同意你的看法,除了必须传递常量内存这一事实。我从来没有设法做到这一点。对我来说,使用常量内存的唯一方法是使用#define定义大型常量数组的值... – 2013-02-28 18:52:05

+0

您可以像设置了CL_MEM_READ_ONLY标志一样创建一个常量内存缓冲区,就像其他任何内存缓冲区一样。要传输它,你可以使用'CL_MEM_COPY_HOST_PTR'标志或像往常一样拷贝'clEnqueueWriteBuffer'。 – matthias 2013-03-01 08:47:38

+0

如果您正在使用__constant缓冲区,请记住检查设备信息属性CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE以获取最大恒定缓冲区大小。 – 2013-03-02 03:09:21

1

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

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

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

__local是GPU的本地内存,仅可由块内的线程看到。

__constant是高速缓存的内存,它比全球的要快得多,但是有限,所以只有在需要时才使用它。

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

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