【发布时间】:2014-02-28 00:08:29
【问题描述】:
OpenCL 规范是否对可以使用的私有内存量设置了任何最大限制?如果是这样,我如何获得这个号码?
我有一个函数,它在 OpenCL 之外运行时会给出正确的结果,但是当转换为内核时,它会吐出垃圾。我使用 CL_KERNEL_PRIVATE_MEM_SIZE 标志检查了每个工作项使用的私有内存量,大约是 4000 字节。我怀疑我使用了太多的私有内存,这会导致垃圾计算。
【问题讨论】:
标签: opencl
OpenCL 规范是否对可以使用的私有内存量设置了任何最大限制?如果是这样,我如何获得这个号码?
我有一个函数,它在 OpenCL 之外运行时会给出正确的结果,但是当转换为内核时,它会吐出垃圾。我使用 CL_KERNEL_PRIVATE_MEM_SIZE 标志检查了每个工作项使用的私有内存量,大约是 4000 字节。我怀疑我使用了太多的私有内存,这会导致垃圾计算。
【问题讨论】:
标签: opencl
根据 OpenCL 规范,位置和大小未定义,即由供应商决定。这就提出了一个关于要使用多少的问题。如果使用得当可以获得最佳性能,否则会成为减速的原因。
您可以使用 AMD 的 CodeXL 或 NVIDIA 的 Nsight(如果您有 AMD 或 NVIDIA 卡)来分析内核的内存使用情况。只需少量操作工具,您就可以使用这些工具了解寄存器溢出。
我认为私有内存的高使用率不会导致垃圾结果,这肯定是您的代码中的问题。
【讨论】:
不同的拱门不同。例如,一个 hd7870 的每个计算单元的私有内存是 256kB,如果您的设置是每个计算单元 64 个线程,那么每个线程将有 4kB 的私有内存,这意味着 1000 个浮点值。如果进一步增加每个计算单元的线程,私有/线程将下降到甚至 1kB 范围。您应该添加一些本地内存使用来平衡它。
更重要的是,你不能全部使用它。编译器使用很大一部分进行自己的优化和一些我不知道的事情。没有分析器,您永远无法确定。
【讨论】:
私有内存没有理论上的限制(与本地内存不同)。如果有,clGetDeviceInfo 会列出它(它没有)。但是,我知道有实际限制。例如,某些 GPU 实现会尝试在合适的情况下将私有内存存储在寄存器文件中。如果超过这个值,它会溢出到主内存,并且可能会贵几个数量级。无论如何,结果应该是正确的(只是实现得慢得多)。它不应该破坏你的计算。
【讨论】: