【发布时间】:2015-03-10 17:05:52
【问题描述】:
我在使用 OpenCL 时遇到了一个奇怪的问题,我正在为使用大内存缓冲区作为参数的内核调用 clEnqueueNDRangeKernel。对于小于 16384 字节的缓冲区,一切正常。如果我将缓冲区大小增加到超过该值,则会返回 INVALID_KERNEL_ARGS 错误。据我了解,此错误表示未设置参数。将参数设置为无效大小或不适合内存的内容会触发不同的错误。
有什么想法吗?
更新
@mfa 的回答让我再次查看了设备规格。看起来一个 128*128 的浮点数组正好是 64KB,这是卡的常量内存的大小。全局内存要大得多,因此内核参数使用 __global 而不是 __constant 可以解决此问题。
但我仍然感到困惑:如何调用 const memory every 的内存不足参数?在我看来,当我创建缓冲区时,尚不知道它是用作常量还是全局......有没有办法获得更有用的错误消息?
【问题讨论】:
-
当你创建数据时还不知道它会被如何使用。然而,HW 有特定的频道以非常快速的方式广播小关键参数(如 GL 中的变换矩阵)。那是
__constant内存。如果你的缓冲区大于这个大小,那么你传递给内核的参数是无效的,因此错误。