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

时间:2014-02-28 00:08:30

标签: opencl

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

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

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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