【问题标题】:How does OpenCL distribute work items?OpenCL 如何分配工作项?
【发布时间】:2018-11-16 05:38:45
【问题描述】:

我正在测试和比较 GPU 速度与不同数量的工作项(无工作组)。我使用的内核是一个非常简单但耗时的操作。当我使用多个工作项进行测试时,我使用屏障功能并将工作分成更小的块以获得与仅使用一个工作项相同的结果。我使用 cl_event 测量内核执行时间,结果如下:

  • 1 个工作项:35735 毫秒
  • 2 个工作项:11822 毫秒(比 1 个工作项快 3 倍)
  • 10 个工作项:2380 毫秒(比 2 个工作项快 5 倍)
  • 100 个工作项:239 毫秒(比 10 个工作项快 10 倍)
  • 200 个工作项:122 毫秒(比 100 个工作项快 2 倍)

CPU 平均需要大约 580 毫秒来执行相同的操作。

我不理解且无法解释的唯一结果是具有 2 个工作项的结果。与仅使用一个工作项的结果相比,我希望速度提高大约 2 倍,那为什么是 3?

我试图通过查看这些工作项在处理元素上的分布方式来理解这些数字。我假设如果我只有一个内核,则只有一个计算单元(或多处理器)将被激活,并且工作项分布在该计算单元的所有处理元素(或 CUDA 核心)上。我也不确定一个处理元素是否可以同时处理多个工作项,还是每个处理元素只有一个工作项?

CL_DEVICE_MAX_WORK_ITEM_SIZES 是 1024 / 1024 / 64 和 CL_DEVICE_MAX_WORK_GROUP_SIZE 1024。由于我只使用一个维度,这是否意味着每个处理元素或每个计算单元可以同时运行 1024 个工作项?当我尝试使用 1000 个工作项时,结果是一个较小的数字,所以我认为并不是所有的工作项都被执行了,但为什么会这样呢?

我的 GPU 信息:Nvidia GeForce GT 525M,96 个 CUDA 核心(2 个计算单元,每个单元 48 个 CUDA 核心)

【问题讨论】:

    标签: performance concurrency opencl gpu nvidia


    【解决方案1】:

    我不明白也无法解释的唯一结果是带有 2 的结果 工作项目。我预计速度会快 2 倍左右 与只有一个工作项的结果相比,为什么是 3?

    确切的原因可能很难确定,但这里有一些建议:

    • GPU根本没有针对少量工作项进行优化。对规模的那一端进行基准测试并不是特别有用。
    • 35 秒对于 GPU 来说是很长的时间。您的 GPU 可能还有其他事情要做,因此您的工作项可能会被多次中断,每次都会保存并恢复其上下文。
    • 这在很大程度上取决于您的算法。例如,如果您的内核使用本地内存或依赖于工作大小的私有内存量,它可能会“溢出”到全局内存,这会减慢速度。
    • 根据内核的内存访问模式,您可能会遇到读/写合并的影响。更多的工作项意味着更少的内存访问。

    我也不确定一个处理元素是否可以同时处理多个工作项,还是每个处理元素只能处理一个工作项?

    大多数 GPU 硬件都支持一种 SMT 形式来隐藏内存访问延迟。因此,计算核心一次最多可以有一些固定数量的工作项在运行,如果其中一个被阻塞等待内存访问或屏障,核心将继续在另一个工作项上执行命令。请注意,如果您的内核使用大量本地内存或私有寄存器,则最大并发线程数可能会受到进一步限制,因为这些是计算单元中所有内核共享的有限资源。

    工作组通常一次只能在一个计算单元上运行,因为本地内存和屏障不能跨单元工作。所以你不想让你的组太大。

    最后一点:计算硬件往往按 2 的幂进行分组,因此通常最好将工作组大小设置为例如的倍数。 16 或 64。1000 都不是,这通常意味着某些内核将什么也不做。

    当我尝试处理 1000 个工作项时,结果是一个较小的数字,所以我认为并不是所有的工作项都被执行了,但为什么会这样呢?

    请在这个问题上更准确,不清楚你在问什么。

    【讨论】:

    • 如果一个工作组在一个计算单元上运行,并且我没有指定每个工作组的工作项数(假设这意味着我只有一个工作组),我可以确保这些工作项仅在一个计算单元上执行?这是否意味着这些工作项以某种方式分布到该计算单元的 48 个核心上?我还是不明白工作项大小编号 1024。
    • 如果您不指定组大小,那么您根本就没有组。假设没有寄存器(私有内存)压力,您的工作项将被分派到“自然”并行的计算单元。确保工作项仅在一个单元上运行的方法是将它们放在一个组中。只有这样,您才能使用本地内存和/或障碍在项目之间进行协调。根据寄存器和本地内存压力,您可能无法使用完整的 1024 个工作组大小(其他硬件也会有较低的限制)。
    猜你喜欢
    • 2015-01-30
    • 1970-01-01
    • 1970-01-01
    • 2016-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-26
    • 1970-01-01
    相关资源
    最近更新 更多