OpenCL 中的私有内存是不是有最大限制?

Posted

技术标签:

【中文标题】OpenCL 中的私有内存是不是有最大限制?【英文标题】:Is there a maximum limit to private memory in OpenCL?OpenCL 中的私有内存是否有最大限制? 【发布时间】:2014-02-28 00:08:29 【问题描述】:

OpenCL 规范是否对可以使用的私有内存量设置了任何最大限​​制?如果是这样,我如何获得这个号码?

我有一个函数,它在 OpenCL 之外运行时会给出正确的结果,但是当转换为内核时,它会吐出垃圾。我使用 CL_KERNEL_PRIVATE_MEM_SIZE 标志检查了每个工作项使用的私有内存量,大约是 4000 字节。我怀疑我使用了太多的私有内存,这会导致垃圾计算。

【问题讨论】:

【参考方案1】:

根据 OpenCL 规范,位置和大小未定义,即由供应商决定。这就提出了一个关于要使用多少的问题。如果使用得当可以获得最佳性能,否则会成为减速的原因。

您可以使用 AMD 的 CodeXL 或 NVIDIA 的 Nsight(如果您有 AMD 或 NVIDIA 卡)来分析内核的内存使用情况。只需少量操作工具,您就可以使用这些工具了解寄存器溢出。

我认为私有内存的高使用率不会导致垃圾结果,这肯定是您的代码中的问题。

【讨论】:

NVIDIA 的 NSight 似乎不适用于 opencl 代码。它对你有用吗? 哦是吗?我在 AMD 卡上工作,所以关于 nSight 的详细信息不多。看看这个统一的视觉分析器link【参考方案2】:

不同的拱门不同。例如,一个 hd7870 的每个计算单元的私有内存是 256kB,如果您的设置是每个计算单元 64 个线程,那么每个线程将有 4kB 的私有内存,这意味着 1000 个浮点值。如果进一步增加每个计算单元的线程,私有/线程将下降到甚至 1kB 范围。您应该添加一些本地内存使用来平衡它。

更重要的是,你不能全部使用它。编译器使用很大一部分进行自己的优化和一些我不知道的事情。没有分析器,您永远无法确定。

【讨论】:

【参考方案3】:

私有内存没有理论上的限制(与本地内存不同)。如果有,clGetDeviceInfo 会列出它(它没有)。但是,我知道有实际限制。例如,某些 GPU 实现会尝试在合适的情况下将私有内存存储在寄存器文件中。如果超过这个值,它会溢出到主内存,并且可能会贵几个数量级。无论如何,结果应该是正确的(只是实现得慢得多)。它不应该破坏你的计算。

【讨论】:

幻灯片 19 上的演示文稿 computer-graphics.se/gpu-computing/opencl_pub.pdf 说每个工作项最多 16 KB 的私有内存。这是否符合 opencl 规范? 有趣!感谢您的链接。不过,我认为这仅适用于 NVidia。我在 OpenCL 1.1 规范 (khronos.org/registry/cl/specs/opencl-1.1.pdf) 中找不到任何关于私有内存最小值的内容。本地内存和常量缓冲区有规范。这些值的最小值。我认为您是在使用 NVidia 架构? 您的内核还报告了大约 4k 的私有字节,幻灯片上说有 16k 的私有内存。因此,您远远低于该实施的最大值。我的猜测是,如果你以某种方式超过它,编译会失败。无论如何,使用这么多私有内存是不寻常的。我们有机会看到内核源代码吗? 另一种选择是尝试不同的 OpenCL SDK,看看它是否会产生更好的错误消息/不同的诊断或行为不同。英特尔的可通过software.intel.com/en-us/vcsource/tools/opencl-sdk免费获得

以上是关于OpenCL 中的私有内存是不是有最大限制?的主要内容,如果未能解决你的问题,请参考以下文章

将全局内存用于(大)本地/私有温度。 OpenCL 中高效的数据结构

OpenCL 中的全局内存是不是连续

GAE 中的“软私有内存限制”是啥?

有没有办法打破android中openCL内存的限制?

Internet Explorer 11 中的 window.postMessage 是不是有最大长度限制?

OpenCL 内核中的组内同步,在本地内存上使用自旋锁