Opencl 私有内存比本地内存慢吗?

Opencl 私有内存比本地内存慢吗?,opencl,Opencl,我正在开发一个内核,它每个线程都有很多全局内存访问权限,所以我将它们复制到本地内存中,速度提高了40% 我想要更高的速度,所以从本地复制到私有,这降低了性能 因此,我认为我们不能使用太多可能降低性能的私有内存,这是正确的吗?在(类似GPU的)OpenCL设备中,本地内存是片上的,靠近处理元件(PE)。它可能与访问一级缓存一样快。每个线程的专用内存实际上是从片外全局内存中分配的。这与PE相去甚远,可能有数百个时钟周期的延迟,从而降低了读写性能。Ashwin的回答是正确的,但有点误导 OpenCL将

我正在开发一个内核,它每个线程都有很多全局内存访问权限,所以我将它们复制到本地内存中,速度提高了40%

我想要更高的速度,所以从本地复制到私有,这降低了性能


因此,我认为我们不能使用太多可能降低性能的私有内存,这是正确的吗?

在(类似GPU的)OpenCL设备中,本地内存是片上的,靠近处理元件(PE)。它可能与访问一级缓存一样快。每个线程的专用内存实际上是从片外全局内存中分配的。这与PE相去甚远,可能有数百个时钟周期的延迟,从而降低了读写性能。

Ashwin的回答是正确的,但有点误导

OpenCL将变量的地址空间从物理存储中抽象出来,两者之间不一定存在1:1的映射

考虑在_私有地址空间中声明的OpenCL变量,默认情况下,它在函数中包含自动非指针变量。英伟达GPU实现将尽可能物理地将这些分配到寄存器中,当登记容量不足时,仅溢出到物理芯片外存储器。这种特殊的片外存储器称为“CUDA本地”存储器,其性能特征与分配给_全局变量的存储器相似,这解释了寄存器溢出导致的性能损失。在这个实现中没有“私有内存”这样的物理东西,只有一个“私有地址空间”,可以在芯片上或芯片外分配

性能损失不是使用专用地址空间(或“专用内存”)的直接后果,专用地址空间通常分配在高性能内存中。这是因为,在这种实现下,变量太大,无法分配到高性能寄存器上,因此“溢出”到片外内存中。

(我知道这是一个老问题,但给出的答案并不十分准确,在谷歌搜索过程中,我在其他地方看到了相互矛盾的答案。)

根据“使用OpenCL进行异构计算”(修订版OpenCL 1.2版):

私有内存是单个工作项特有的内存。局部变量 默认情况下,非指针内核参数是私有的。实际上,这些变量 通常映射到寄存器,尽管私有数组和任何溢出 寄存器通常映射到片外(即长延迟)内存


因此,如果您使用大量的私有内存,或者在私有内存中使用数组,是的,它可能比本地内存慢。

James Beilby的答案是正确的,但有点离题:

根据实现情况,它可能更快或更慢,因为opencl不强制供应商使用片内或片外存储器,但AMD在opencl的性价比方面非常出色,因此我将给出一些数字

AMD实现中的私有内存速度最快(延迟最小,带宽最高,如主流gpu的22 TB/s)

在附录d中:

您可以看到registerfile、LDS常量缓存global这些在有足够空间时用于不同的名称空间。例如,寄存器文件有22 TB/s,每个计算单元只有大约300kB。这比用于本地内存空间的LDS具有更少的延迟和更多的带宽。LDS的总大小甚至小于此值(每个计算单元)

如果从本地到私有不起作用,例如,您应该将本地线程组大小从256减少到64。因此,每个线程可以使用更多的私有寄存器

所以对于这个例子AMD gpu,本地内存比全局内存快15倍,私有内存比本地内存快5倍。如果它不适合在私有内存中,它会溢出到全局内存中,因此只有一级缓存可以在这里提供帮助。如果数据没有被大量重复使用,这里就没有必要使用私有寄存器。只要使用一次,就可以从全局流到全局


对于某些智能手机或cpu,使用专用寄存器可能非常糟糕,因为它们可能会被映射到其他对象。

如果假设一个线程使用全局缓冲区值两次,而不是最初将该值保留在专用(寄存器)中,则会减少一次全局访问,从而提高性能。从这个意义上说,我感到困惑。等待您的重播。Megharaj:请注意,私有内存与寄存器不同。不过,如果存在寄存器溢出,可能会使用私有内存。非常感谢您的回答(danyavadagalu)。“这与PE相去甚远,可能有数百个时钟周期的延迟,从而降低读写性能。”在下面的例子中,为什么它会提供性能“如果假设让我们像线程一样使用全局缓冲区值两次,而不是最初将该值保留在专用内存中,则会降低一次全局访问的性能”。那么我们必须在多大程度上使用私有内存。谢谢。“本地内存是片上的,靠近处理元件(PE)。它可能和访问一级缓存一样快”非常感谢你,这很有意义,我会研究一下。再次感谢:)抱歉,再次打断,我写了一个中值滤波器的情况,比NVIDIA的更快,在我的程序中,我从全局内存复制到本地内存(有效:),我不想更改本地缓冲区值,所以我复制到私有内存并执行操作以提高性能。但是只使用本地内存而不复制到私有内存会降低性能。但是,如果通过从本地复制到私有内存来执行,则会提供良好的性能。一个最小的可运行示例和精确的平台规格将非常棒:-)