OpenCL本地内存大小和计算单元数

use*_*929 7 opencl

每个GPU设备(AMD,NVidea或任何其他设备)被分成几个计算单元(MultiProcessors),每个计算单元具​​有固定数量的核心(VertexShaders/StreamProcessors).因此,有一个(Compute Units) x (VertexShaders/compute unit)同时具有计算机的处理器,但__local每个多处理器只有少量固定数量的内存(通常为16KB或32KB).因此,这些多处理器的确切数量很重要.

现在我的问题:

  • (a)我如何知道设备上多处理器的数量?这是一样的CL_DEVICE_MAX_COMPUTE_UNITS吗?我可以从规格表中推断出它,例如http://en.wikipedia.org/wiki/Comparison_of_AMD_graphics_processing_units吗?
  • (b)__local在购买之前,我怎么知道GPU上每个MP有多少内存?当然我可以CL_DEVICE_LOCAL_MEM_SIZE在运行它的计算机上请求,但我不知道如何从单独的详细规格表中推断出它,例如http://www.amd.com/us/products/desktop/graphics/ 7000/7970/Pages/radeon-7970.aspx#3
  • (c)目前最大的卡是什么CL_DEVICE_LOCAL_MEM_SIZE?价格并不重要,但64KB(或更大)会为我正在编写的应用程序带来明显的好处,因为我的算法是完全可并行化的,但也是高度内存密集型的,每个MP内部都有随机访问模式(迭代边缘)图表).

Gri*_*zly 7

  1. CL_DEVICE_MAX_COMPUTE_UNITS应该给你ComputeUnits的数量,否则你可以从适当的手册(AMD opencl编程指南Nvidia OpenCL编程指南)浏览它
  2. AMD的链接指南包含有关每个计算单元的可用本地内存(通常为32kB/CU)的信息.对于NVIDIA,快速谷歌搜索发现了这个文件,它为G80和G200基于GPU的本地内存大小为16kB/CU.对于基于fermi的卡(GF100),可提供64kB的片上存储器,可配置为48kB本地存储器和16kB L1高速缓存或16kB本地存储器和48kB L1高速缓存.此外,基于fermi的卡具有高达768kB的L2缓存(GF100和GF110为768kB,GF104和GF114为512kB,GF106和GF116为384kB,根据维基百科没有GF108和GF118).
  3. 从上面的信息来看,似乎当前的nvidia卡每个计算单元具​​有最多的本地内存.此外,根据我的理解,它是唯一一个具有通用L2 Cache的人.

但是,对于本地内存的使用,您应该记住每个工作组分配本地内存(并且只能由工作组访问),而计算单元通常可以支持多个工作组.因此,如果您的算法将整个本地内存分配给一个工作组,您将无法使用实现最大并行度.还要注意,由于本地存储器是存储的,因此随机访问将导致很多存储体冲突和扭曲序列化.所以你的算法可能不会像你想象的那样平行(或者可能只会提到可能性).

使用基于Fermi的卡,如果所有工作组都使用相同的数据(我不知道如何切换L1 /本地内存配置),那么最好的选择可能是依靠缓存而不是显式本地内存.