OpenCL本地内存大小和计算单元数
每个GPU设备(AMD、NVidea或任何其他)被拆分为几个计算单元(多处理器),每个计算单元都有固定数量的内核(顶点着色器/流处理器)。因此,可以使用OpenCL本地内存大小和计算单元数,opencl,Opencl,每个GPU设备(AMD、NVidea或任何其他)被拆分为几个计算单元(多处理器),每个计算单元都有固定数量的内核(顶点着色器/流处理器)。因此,可以使用(计算单元)x(顶点着色器/计算单元)并行处理器进行计算,但每个多处理器只有少量固定的uu local内存(通常为16KB或32KB)。因此,这些多处理器的确切数量很重要 现在我的问题是: (a) 如何知道设备上的多处理器数量?这与CL\u设备\u最大\u计算\u单位相同吗?我可以从以下规格表中推断出来吗 (b) 在购买GPU之前,我如何知道每
(计算单元)x(顶点着色器/计算单元)
并行处理器进行计算,但每个多处理器只有少量固定的uu local
内存(通常为16KB或32KB)。因此,这些多处理器的确切数量很重要
现在我的问题是:
- (a) 如何知道设备上的多处理器数量?这与
CL\u设备\u最大\u计算\u单位相同吗?我可以从以下规格表中推断出来吗
- (b) 在购买GPU之前,我如何知道每个MP上有多少可用的
\u本地
内存?当然,我可以在运行它的计算机上请求
,但我不知道如何从单独的详细规格表(例如李>CL\u DEVICE\u LOCAL\u MEM\u SIZE
- (c) 当前最大的
CL\u设备\u本地\u内存大小的卡是什么?价格并不重要,但64KB(或更大)会给我正在编写的应用程序带来明显的好处,因为我的算法是完全可并行的,而且内存高度密集,每个MP中都有随机访问模式(在图的边上迭代)
- (c) 当前最大的
CL\u设备\u最大\u计算单元
应提供计算单元的数量,否则您可以从适当的手册(和)中浏览使用基于费米的卡,如果您的所有工作组都对相同的数据进行操作(但我不知道如何切换L1/本地内存配置),那么您最好使用缓存而不是显式本地内存。尝试在SDK中AMD/NVIDIA提供的示例中运行设备查询。如果你想知道特定设备的设备查询,有很多人已经把它放到了网上。这是你提到的一个非常有趣的点,我的算法确实消耗了每个计算单元的所有本地内存。同一个计算单元上应该运行多少个工作组才能使它以(接近)全速运行?同样,二级缓存听起来很有趣,但我不明白。现代设备上有32个计算单元,费米提供了768KB的二级缓存,即每个计算单元只有24KB(与64KB的一级缓存相比)?也就是说,二级缓存少于一级缓存???或者我误解了这个缓存的意义了吗?我在上面的第一个评论的附录:每个工作组将由几百个工作项组成。@user1111929:GF100和GF110基于的卡最多有16个CU,因此二级缓存的大小为48kB/CU,因此二级缓存的大小与所有一级缓存的大小相同(请记住,一级缓存可以配置为16kB或48kB/CU)。如果您的所有工作组都在大致相同的数据集上操作,这将非常有用。对于工作组的数量:您需要多少工作组来获得最佳速度取决于您的内核。线程越多,隐藏的延迟就越好。根据上面链接的文档,G80的最大线程/CU为768,G200的最大线程/CU为1024,GF100的最大线程/CU为1536,AMD卡的最大线程/CU为1200到3200(极端低端的最大线程/CU为6200)之间(取决于卡在一代中的位置,而不是一代中的位置)。我通常会尝试为nvidia争取至少一半的价值,大约是amd高端卡的高端最大值(大约1200),这通常足以隐藏大部分延迟。请注意,线程(以及工作组)的数量也受到每个线程使用的寄存器数量和每个CU可用的数量的限制。当然,如果你的工作组足够大,你可能不用使用一个工作组。