【问题标题】:Are OpenCL work items executed in parallel?OpenCL 工作项是否并行执行?
【发布时间】:2012-02-17 07:10:32
【问题描述】:

我知道工作项被分组到工作组中,您无法在工作组之外进行同步。

是否意味着工作项是并行执行的?

如果是这样,是否有可能/有效地创建一个具有 128 个工作项的工作组?

【问题讨论】:

    标签: opencl


    【解决方案1】:

    组内的工作项将被安排在一起,并且可以一起运行。由硬件和/或驱动程序来选择实际执行的并行程度。这有不同的原因,但一个很好的原因是隐藏内存延迟。

    在我的 AMD 卡上,“计算单元”分为 16 个 4 宽 SIMD 单元。这意味着从技术上讲,组中可以同时运行 16 个工作项。建议我们在一个组中使用 64 个工作项的倍数,以隐藏内存延迟。显然,它们不可能都在准确的时间运行。这不是问题,因为实际上大多数内核都受内存限制,因此调度程序(硬件)会将等待在内存控制器上的工作项交换出去,而“就绪”项则获得它们的计算时间。组中的实际工作项数由主机程序设置,并受 CL_DEVICE_MAX_WORK_GROUP_SIZE 限制。您将需要为您的内核试验最佳工作组大小。

    当涉及到同时工作项时,cpu 实现“更糟糕”。运行的工作项的数量与可用于运行它们的内核数量一样多。它们在 cpu 中的行为更加有序。

    那么工作项是否在完全相同的时间运行?几乎从来没有。这就是为什么当我们想要确保它们在给定点暂停时需要使用障碍的原因。

    【讨论】:

    • 您确定运行的工作项与您拥有的内核数量一样多吗?根据this page,单独的核心是计算单元,这意味着一个核心与一个工作项没有任何对应关系。
    • 我确信这一点。确实,“正在运行”的工作项目可能比 cpu 上的内核数量还要多——这实际上就是工作组。在同时计算方面,一个 cpu 内核在给定时间只能执行一个指令队列。即使在非 opencl 应用程序中,线程要么通过上下文切换伪造,要么通过多核硬件实现(有时使用有限的 SIMD 功能)。
    【解决方案2】:

    在(抽象的)OpenCL 执行模型中,是的,所有工作项都是并行执行的,并且可能有数百万个。

    在 GPU 内部,同一工作组的所有工作项必须在单个“核心”上执行。这对每个工作组的工作项数量进行了物理限制(最大值为 256 或 512,但对于使用大量寄存器的大型内核,它可以更小)。然后将所有工作组安排在 GPU 的(通常是 2 到 16 个)内核上。

    您可以在一个工作组内同步线程(工作项),因为它们都驻留在同一个核心中,但您不能同步来自不同工作组的线程,因为它们可能不会同时被调度,并且可以在不同的内核上执行。

    是的,一个工作组内可以有 128 个工作项,除非它消耗太多资源。为了达到最佳性能,您通常希望在一个工作组中拥有尽可能多的线程(至少需要 64 个线程才能隐藏内存延迟,请参阅Vasily Volkov's presentations 关于此主题)。

    【讨论】:

      【解决方案3】:

      想法是,如果可能,它们可以并行执行(它们实际上是否会并行执行取决于)。

      【讨论】:

        【解决方案4】:

        是的,工作项是并行执行的。

        要获得尽可能多的工作项,请使用clGetDeviceInfoCL_DEVICE_MAX_WORK_GROUP_SIZE。这取决于硬件。

        它是否有效主要取决于您要执行的任务。如果您需要大量同步,可能 OpenCL 不适合您的任务。不知道你真正想做什么,我不能说更多。

        【讨论】:

          【解决方案5】:

          给定工作组中的工作项在单个处理单元的处理元素上同时执行。

          【讨论】:

            猜你喜欢
            • 2023-03-03
            • 1970-01-01
            • 1970-01-01
            • 2019-01-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-06-06
            • 1970-01-01
            相关资源
            最近更新 更多