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

OpenCL本地内存大小和计算单元数,opencl,Opencl,每个GPU设备(AMD、NVidea或任何其他)被拆分为几个计算单元(多处理器),每个计算单元都有固定数量的内核(顶点着色器/流处理器)。因此,可以使用(计算单元)x(顶点着色器/计算单元)并行处理器进行计算,但每个多处理器只有少量固定的uu local内存(通常为16KB或32KB)。因此,这些多处理器的确切数量很重要 现在我的问题是: (a) 如何知道设备上的多处理器数量?这与CL\u设备\u最大\u计算\u单位相同吗?我可以从以下规格表中推断出来吗 (b) 在购买GPU之前,我如何知道每

每个GPU设备(AMD、NVidea或任何其他)被拆分为几个计算单元(多处理器),每个计算单元都有固定数量的内核(顶点着色器/流处理器)。因此,可以使用
(计算单元)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中都有随机访问模式(在图的边上迭代)
  • CL\u设备\u最大\u计算单元
    应提供计算单元的数量,否则您可以从适当的手册(和)中浏览
  • AMD的链接指南包含关于每个计算单元(通常为32kB/CU)的可用本地内存的信息。对于NVIDIA,谷歌快速搜索显示,基于G80和G200的GPU的本地内存大小为16kB/CU。对于基于费米的卡(GF100),有64kB的片上内存可用,可配置为48kB本地内存和16kB一级缓存或16kB本地内存和48kB一级缓存。此外,基于费米的卡具有高达768kB的二级缓存(根据维基百科,GF100和GF110为768kB,GF104和GF114为512kB,GF106和GF116为384kB,GF108和GF118为无)
  • 从上面的信息看来,目前的nvidia卡每个计算单元的本地内存最多。此外,据我所知,它是唯一一个具有通用二级缓存的
  • 但是,对于本地内存的使用,您应该记住,本地内存是为每个工作组分配的(并且仅可供工作组访问),而计算单元通常可以支持多个工作组。因此,如果您的算法将整个本地内存分配给一个工作组,您将无法使用它来实现最大数量的并行性。另外请注意,由于本地内存已存储,随机访问将导致大量存储冲突和扭曲序列化。因此,您的算法可能不会像您认为的那样并行(或者可能会并行,仅提及可能性)


    使用基于费米的卡,如果您的所有工作组都对相同的数据进行操作(但我不知道如何切换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可用的数量的限制。当然,如果你的工作组足够大,你可能不用使用一个工作组。