【问题标题】:OpenCL Parallel DispatchOpenCL 并行调度
【发布时间】:2017-09-16 02:12:47
【问题描述】:

我在 NVIDIA 上使用对 OpenCL 2.0 的测试版支持,并针对 1080ti 等高端 GPU。在我的计算管道中,我有时需要分派工作来独立地处理相对较小的图像。理论上,我认为这些图像应该能够在单个 GPU 上并行处理,因为单个图像的工作组数量不会使 GPU 的所有计算单元饱和。

  1. 这在 OpenCL 中可行吗?这在 OpenCL 中有名称吗?

  2. 如果可能的话,为单个设备使用多个队列是唯一的方法吗?或者驱动程序会查看“waitEventList”并决定哪些内核可以并行处理?

  3. 我需要 CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE 吗?

【问题讨论】:

    标签: opencl gpgpu


    【解决方案1】:

    1- 是的,这是在占用计算单元上实现高收益的方法之一。通用名称可以是“流水线”(借助异步排队和/或动态并行)。有不同的方法,一种是在 1 个队列上进行读取,在另一个队列上进行写入,在第三个队列上进行计算,其中 3 个队列控制等待事件;第二种方法可能是让 M 个队列,每个队列在没有事件的情况下执行不同图像的读取-计算-写入工作。

    2- 您甚至可以使用单队列,但可以使用无序类型,以便独立调度内核。但至少对于某些 AMD 卡,即使是有序队列也可以通过并发执行(这可能超出 opencl 规范)来优化独立内核(根据 amd 的 codexl)。等待事件可能成为停止此类驱动程序端优化的约束(同样,至少在 amd 上)

    从 2.x 开始,有设备端排队功能,因此您可以将 1 个内核从主机入队,而该内核可以将 N 个内核入队,与主机干预无关(如果所有数据都已上传到卡上),这可能不会就像使用多个主机端队列一样隐藏延迟(如果需要从主机到设备的数据)。

    3- 供应商不会强制执行乱序执行,因此这可能行不通。

    【讨论】:

    • 如果您不想使用乱序命令队列的痛苦,请改用多个有序命令队列。如果您的设备一次能够处理多个内核,则从每个命令队列中提取一个。比处理乱序队列要容易得多。
    • 是的,由于明确的主机端控制,多个有序队列也具有可预测的性能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-16
    • 2015-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多