OpenCL 本地内存大小和计算单元数量
Posted
技术标签:
【中文标题】OpenCL 本地内存大小和计算单元数量【英文标题】:OpenCL local memory size and number of compute units 【发布时间】:2012-01-14 23:21:34 【问题描述】:每个 GPU 设备(AMD、NVidea 或任何其他设备)都被拆分为多个计算单元(多处理器),每个计算单元都有固定数量的内核(顶点着色器/流处理器)。因此,一个有(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 之前,我如何知道每个 MP 有多少 __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 内的随机访问模式也是高度内存密集型的(迭代边缘图表)。
【问题讨论】:
尝试在 SDK 中 AMD/NVIDIA 提供的示例中运行设备查询。如果你想知道特定设备的设备查询,有很多人已经把它放到网上。 【参考方案1】:CL_DEVICE_MAX_COMPUTE_UNITS
应该为您提供 ComputeUnit 的数量,否则您可以从相应的手册中查看(AMD opencl programming guide 和 Nvidia OpenCL programming guide)
AMD 链接指南包含有关每个计算单元的可用本地内存(通常为 32kB / CU)的信息。对于 NVIDIA,谷歌快速搜索显示this document,它给出了基于 G80 和 G200 的 GPU 的本地内存大小为 16kB/CU。对于基于 fermi 的卡 (GF100),有 64kB 的片上内存可用,可以配置为 48kB 本地内存和 16kB L1 缓存或 16kB 本地内存和 48kB L1 缓存。此外,基于 fermi 的卡具有高达 768kB 的二级缓存(根据***,GF100 和 GF110 为 768kB,GF104 和 GF114 为 512kB,GF106 和 GF116 为 384kB,GF108 和 GF118 没有)。
从以上信息看来,当前的 nvidia 卡的每个计算单元的本地内存最多。此外,据我了解,它是唯一具有通用 L2 缓存的。
但是,对于本地内存的使用,您应该记住,本地内存是为每个工作组分配的(并且只能由一个工作组访问),而一个计算单元通常可以维持一个以上的工作组。因此,如果您的算法将整个本地内存分配给一个工作组,您将无法使用实现最大并行性。另请注意,由于本地内存被存储,随机访问将导致大量存储冲突和扭曲序列化。所以你的算法可能不会像你想象的那么好(或者它可能会,只是提到可能性)。
使用基于 Fermi 的卡,如果您的所有工作组都在相同的数据上运行,您最好的选择可能是依靠缓存而不是显式本地内存(虽然我不知道如何切换 L1/本地内存配置) .
【讨论】:
这是一个非常有趣的观点,我的算法确实消耗了每个计算单元的所有本地内存。应该在同一个计算单元上运行多少个工作组才能使其以(接近)全速运行? 另外,L2 缓存听起来很有趣,但我不明白。现代设备上有大约 32 个计算单元,而 Fermi 提供了 768KB L2 缓存,每个计算单元只有 24KB(与 64KB L1 相比)? IE。 L2 比 L1 缓存少???还是我误解了这个缓存的意义? 我上面第一条评论的附录:每个工作组将包含几百个工作项。 @user1111929:基于 GF100 和 GF110 的卡最多有 16 个 CU,所以它是 48kB 的 L2/CU,所以 L2 的大小与所有 L1 缓存的总和相同(记住 L1 可以是配置为 16kB 或 48kB/CU)。如果您的所有工作组都在大致相同的数据集上运行,这将非常有用。对于工作组的数量:获得最佳速度所需的工作组数量取决于您的内核。您拥有的线程越多,可以隐藏更好的延迟。 G80 的最大线程/CU 为 768,G200 为 1024,GF100 为 1536,AMD 卡为 1200 到 3200(极低端为 6200)(取决于 卡在一代中的定位,而不是一代)根据我上面链接的文档。我通常会尝试为 nvidia 争取至少一半的价值,在 amd 的高端卡的高端最大值附近(大约 1200),这通常足以隐藏大多数延迟。请注意,线程(以及工作组)的数量也受到每个线程使用的寄存器数量和每个 CU 可用数量的限制。当然,如果你的工作组足够大,你可能会使用一个工作组。以上是关于OpenCL 本地内存大小和计算单元数量的主要内容,如果未能解决你的问题,请参考以下文章