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