当我使用64kb以上的常量缓存时,为什么我的内核不会失败? (OpenCL / CUDA)

我在我的内核上运行了一些使用常量缓存的测试。如果我使用16,000个浮点数(16,000 * 4KB = 64KB),那么一切都运行顺利。如果我使用16,200它仍然可以顺利运行。如果我使用16,400个浮点数,我的结果会出错(而不是来自OpenCL)。难道只是在技术上有64.x KB的常量缓存可用吗?如果我正在使用16,000个花车,我是否应该相信我的代码?通常我希望代码在你使用东西达到规定的限制时中断。     
已邀请:
您可以并且应该使用OpenCL clGetDeviceInfo API使用参数CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE进行查询。 OpenCL 1.1规范说,一致的实现必须提供至少64K字节,这可能是您的设备正在实现的。 如果超过此限制,则OpenCL应该给出错误或者将常量数组移动到全局内存数组中。 如果它没有返回错误,但是给你不好的结果,那就是你的OpenCL实现中的一个错误。不足为奇,它们都不是很成熟。您绝对应该向供应商报告该错误。 (我假设是NVidia,因为你引用了CUDA)(当然确保你已经安装了最新版本。)     
我甚至没有看过GPU规格,找出哪些机器没有64KB恒定内存的硬限制;我假设你已经确定这实际上是你卡上的限制。 我将添加观察结果,尽管通常GPU和它们的CUDA / OpenCL /任何运行时对于捕获或标记错误都不是非常激进,并且如果使用无效参数,当然不会努力失败。虽然我从未见过它明确说过,但我的理解是,这部分是为了避免开销,但主要是为了尽可能宽容;在一个游戏中,怪物手臂看起来比整个游戏死掉几帧更好,因为有人做了一个单独的界限访问。 对于那些进行GPGPU编程的人来说,这很尴尬 - 你要确保你的所有参数和内存使用都是有效的,如果没有,结果可能很奇怪:有时它会起作用,而且往往不会。但这就是事物的方式。我当然不会指望可靠失败的东西,并且如果你超过给定的内存限制,有一些明显和有用的方法。     

要回复问题请先登录注册