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

时间:2012-01-14 23:21:34

标签: opencl

每个GPU设备(AMD,NVidea或任何其他设备)被拆分为多个计算单元(多处理器),每个计算单元具​​有固定数量的核心(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)我怎么知道在购买之前GPU上有多少__local个内存?当然,我可以在运行它的计算机上请求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内部都有随机访问模式(迭代边缘)图表)。

1 个答案:

答案 0 :(得分:7)

  1. CL_DEVICE_MAX_COMPUTE_UNITS应该为您提供ComputeUnits的数量,否则您可以从相应的手册(AMD opencl programming guideNvidia OpenCL programming guide
  2. 中浏览它
  3. AMD的链接指南包含有关每个计算单元的可用本地内存(通常为32kB / CU)的信息。对于NVIDIA,快速谷歌搜索显示this document,它为G80和G200基于GPU的本地内存大小为16kB / CU。对于基于fermi的卡(GF100),可提供64kB的片上存储器,可配置为48kB本地存储器和16kB L1高速缓存或16kB本地存储器和48kB L1高速缓存。此外,基于fermi的卡的L2缓存高达768kB(GF100和GF110为768kB,GF104和GF114为512kB,GF106和GF116为384kB,根据维基百科没有GF108和GF118)。
  4. 从上面的信息来看,似乎当前的nvidia卡每个计算单元拥有最多的本地内存。此外,根据我的理解,它是唯一一个具有通用L2 Cache的人。
  5. 对于本地内存的使用,您应该记住每个工作组分配本地内存(并且只能由工作组访问),而计算单元通常可以支持多个工作组。因此,如果您的算法将整个本地内存分配给一个工作组,您将无法使用实现最大并行度。还要注意,由于本地存储器是存储的,因此随机访问将导致很多存储体冲突和扭曲序列化。所以你的算法可能不会像你想象的那样平行(或者可能只会提到可能性)。

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