【问题标题】:OpenCL group size meaningOpenCL 组大小的含义
【发布时间】:2014-12-16 00:57:11
【问题描述】:

本地组大小对 OpenCL 意味着什么?如果工作组大小为1,是否意味着同时只有一个线程在运行?

我发现我们可以将cl_ndrange设置为NULL,让程序自动选择组大小,我们怎么知道选择了什么组大小?

【问题讨论】:

    标签: opencl


    【解决方案1】:

    在opencl内核中,

    get_local_size (0);
    

    为 8x16 工作组大小的内核提供“8”,同时

    get_local_size (1);
    

    为相同的内核执行给出“16”。如果是 3D 内核,则“2”作为参数给出第三维的大小。查询维数(1,2,3 ?),

     get_work_dim ();
    

    被使用。

    本地工作组大小给出每个硬件同步的线程数。对于 AMD gpus,其最大值为 256,而 Nvidia 和 cpus 可以达到 1024。当您将“1”作为此工作组大小时,每个同步计算单元仅获得单个线程(如果不受驱动程序或硬件的最小值限制)和实现了每个线程(也是每个波)的最大本地内存。

    同时?整个执行被折叠到少数几个计算单元上,让多个下发执行,增加占用,特别是工作组规模小,本地内存足够。例如,如果 L=1 让 MAX_VALUE 波折叠到同一个计算单元上,L=64 只允许折叠 16 个波,L=256 只允许折叠 4 个波。是的,在同一时间但不在同一同步范围内。

    一些供应商的一些模型可以做并发内核执行以完全占用管道,因此单个线程可能不是单独的,而是与来自另一个命令队列的另一个内核的另一个线程。

    例如,即将推出的 r9 390x gpu 将有 64 个计算单元,每个计算单元可能有 4 个向量单元,每个向量单元有 16 个算术和 fpu 单元,总计 4096 个内核。 AMD 的计算单元总共有 64 个内核,一个内核由大约 4 个波流传输,因此每个计算单元有 256 个线程。但是这个线程系统可能与 CPU 上的不同,因此上下文切换可能更快,并且由于组切换,缓存争用最小化。

    【讨论】:

    • 但是一个组怎么可能超过一百? GPU不是只有32核吗?
    • 它们是计算单元,每个单元都有许多向量单元或标量单元。
    • 如果我将组大小加倍,运行时间是否可能会减少一半?
    • 工作组大小表示有多少“工作项”将完全并行运行(同步、障碍和本地内存可用)。并且是硬件依赖的,如果你加倍它,而硬件不能,你会得到一个错误。
    • @DarkZeros “工作组大小表示有多少“工作项”将完全并行运行”。不,它没有。它指示有多少工作项能够在屏障上同步,因此如果使用屏障同步,则至少有多少工作项必须在给定的计算单元上并发。在真实系统上,只有这些工作项的子集可能实际上并行运行,并且多个工作组可能会并发,因此它是最低限度的。它是资源有限的,但不直接依赖于硬件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-21
    • 2018-01-30
    • 2014-08-07
    相关资源
    最近更新 更多