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

标签 caching constants cuda limit opencl

我对使用常量缓存的内核进行了一些测试。如果我使用 16,000 个 float (16,000 * 4KB = 64KB),那么一切都会顺利运行。如果我使用16,200,它仍然运行顺利。如果我使用 16,400 个 float ,我的结果会出现错误(不是来自 OpenCL)。难道只是技术上有 64.x KB 的常量缓存可用吗?如果我正好使用 16,000 个 float ,我是否应该相信我的代码?通常,当您使用的东西达到规定的限制时,我预计代码会中断。

最佳答案

您可以并且应该使用 OpenCL clGetDeviceInfo API 并使用参数 CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE 来查询此信息。 OpenCL 1.1 规范规定,符合要求的实现必须提供至少 64K 字节,这可能就是您的设备正在实现的。

如果超过此限制,则 OpenCL 应该给出错误或透明地将常量数组移动到全局内存数组中。

如果它没有返回错误,但给出了不好的结果,则这是 OpenCL 实现中的错误。不足为奇,他们都还不是很成熟。您绝对应该向供应商报告该错误。 (我假设是 NVidia,因为您引用了 CUDA)(当然,在确保您安装了最新版本之后。)

关于caching - 当我使用略多于 64kb 的常量缓存时,为什么我的内核不会失败? (OpenCL/CUDA),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4100986/

相关文章:

sql - Postgres : how can a "select count(*)" cause dirty blocks?

caching - Grails在客户端存储和获取数据

c - 在 C/C++ 中定义 PI 的更好/更可移植的方法?

C++ const 与 volatile

php - 我使用phpinfo()获得的_ENV ["HTTP_X_VARNISH"]值是什么意思

c++ - 为什么 const 方法不能返回非常量引用?

cuda - 如何使用 CUDA 的 cuSolver 重复前向和后向求解?

c++ - CUDA 错误 : "dynamic initialization is not supported for __device__, __constant__ and __shared__ variables"

algorithm - 在 GPU 上并行写入位集(数组的数组)

c++ - 在Intel x86中读取缓存行与部分缓存行