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

OpenCL中的私有内存是否有最大限制?,opencl,Opencl,OpenCL规范是否对可使用的私有内存量设置了任何最大限制?如果是,我如何得到这个号码 我有一个函数,它在OpenCL之外运行时会给出正确的结果,但是当转换成内核时,它会抛出垃圾。我使用CL_KERNEL_private_MEM_SIZE标志检查了每个工作项使用的私有内存量,它大约是4000字节。我怀疑我使用了太多的私有内存,这在某种程度上导致了垃圾计算。私有内存没有理论上的限制(与本地内存不同)。如果有,clGetDeviceInfo会列出它(它没有)。然而,我知道有实际的限制。例如,一些GP

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


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

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

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

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

您可以使用AMD的CodeXL或NVIDIA的Nsight(如果您有AMD或NVIDIA卡)来分析内核的内存使用情况。通过使用这些工具,您可以理解寄存器溢出


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

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

您可以使用AMD的CodeXL或NVIDIA的Nsight(如果您有AMD或NVIDIA卡)来分析内核的内存使用情况。通过使用这些工具,您可以理解寄存器溢出


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

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


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

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


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

NVIDIA的NSight似乎无法与opencl代码一起工作。对你有用吗?是吗?我在AMD卡上工作,所以在nSight上没有太多详细的信息。看看这个统一的视觉分析器,NVIDIA的NSight似乎不适用于opencl代码。对你有用吗?是吗?我在AMD卡上工作,所以在nSight上没有太多详细的信息。让我们看看这个统一的可视档案器。幻灯片19上的演示说,每个工作项最多有16 KB的专用内存。这与opencl规范一致吗?有趣!谢谢你的链接。我想这只是为了NVidia。我在OpenCL1.1规范()中找不到任何关于私有内存最小值的内容。本地内存和常量缓冲区具有这些值的规格最小值。我想您使用的是NVidia体系结构?而且您的内核报告了约4k的私有字节,幻灯片上显示了16k的私有内存。因此,您在该实现的最大值以下。我的猜测是,如果您以某种方式超过它,编译将失败。无论如何,使用如此多的私有内存是不寻常的。我们是否有可能看到内核源代码?另一个选择是尝试不同的OpenCL SDK,看看它是否产生更好的错误消息/不同的诊断或行为不同。在幻灯片19上的演示文稿中,英特尔免费提供了每个工作项最多16 KB的专用内存。这与opencl规范一致吗?有趣!谢谢你的链接。我想这只是为了NVidia。我在OpenCL1.1规范()中找不到任何关于私有内存最小值的内容。本地内存和常量缓冲区具有这些值的规格最小值。我想您使用的是NVidia体系结构?而且您的内核报告了约4k的私有字节,幻灯片上显示了16k的私有内存。因此,您在该实现的最大值以下。我的猜测是,如果您以某种方式超过它,编译将失败。无论如何,使用如此多的私有内存是不寻常的。我们是否有可能看到内核源代码?另一个选择是尝试不同的OpenCL SDK,看看它是否产生更好的错误消息/不同的诊断或行为不同。英特尔的