【发布时间】:2012-02-17 07:10:32
【问题描述】:
我知道工作项被分组到工作组中,您无法在工作组之外进行同步。
是否意味着工作项是并行执行的?
如果是这样,是否有可能/有效地创建一个具有 128 个工作项的工作组?
【问题讨论】:
标签: opencl
我知道工作项被分组到工作组中,您无法在工作组之外进行同步。
是否意味着工作项是并行执行的?
如果是这样,是否有可能/有效地创建一个具有 128 个工作项的工作组?
【问题讨论】:
标签: opencl
组内的工作项将被安排在一起,并且可以一起运行。由硬件和/或驱动程序来选择实际执行的并行程度。这有不同的原因,但一个很好的原因是隐藏内存延迟。
在我的 AMD 卡上,“计算单元”分为 16 个 4 宽 SIMD 单元。这意味着从技术上讲,组中可以同时运行 16 个工作项。建议我们在一个组中使用 64 个工作项的倍数,以隐藏内存延迟。显然,它们不可能都在准确的时间运行。这不是问题,因为实际上大多数内核都受内存限制,因此调度程序(硬件)会将等待在内存控制器上的工作项交换出去,而“就绪”项则获得它们的计算时间。组中的实际工作项数由主机程序设置,并受 CL_DEVICE_MAX_WORK_GROUP_SIZE 限制。您将需要为您的内核试验最佳工作组大小。
当涉及到同时工作项时,cpu 实现“更糟糕”。运行的工作项的数量与可用于运行它们的内核数量一样多。它们在 cpu 中的行为更加有序。
那么工作项是否在完全相同的时间运行?几乎从来没有。这就是为什么当我们想要确保它们在给定点暂停时需要使用障碍的原因。
【讨论】:
在(抽象的)OpenCL 执行模型中,是的,所有工作项都是并行执行的,并且可能有数百万个。
在 GPU 内部,同一工作组的所有工作项必须在单个“核心”上执行。这对每个工作组的工作项数量进行了物理限制(最大值为 256 或 512,但对于使用大量寄存器的大型内核,它可以更小)。然后将所有工作组安排在 GPU 的(通常是 2 到 16 个)内核上。
您可以在一个工作组内同步线程(工作项),因为它们都驻留在同一个核心中,但您不能同步来自不同工作组的线程,因为它们可能不会同时被调度,并且可以在不同的内核上执行。
是的,一个工作组内可以有 128 个工作项,除非它消耗太多资源。为了达到最佳性能,您通常希望在一个工作组中拥有尽可能多的线程(至少需要 64 个线程才能隐藏内存延迟,请参阅Vasily Volkov's presentations 关于此主题)。
【讨论】:
想法是,如果可能,它们可以并行执行(它们实际上是否会并行执行取决于)。
【讨论】:
是的,工作项是并行执行的。
要获得尽可能多的工作项,请使用clGetDeviceInfo 和CL_DEVICE_MAX_WORK_GROUP_SIZE。这取决于硬件。
它是否有效主要取决于您要执行的任务。如果您需要大量同步,可能 OpenCL 不适合您的任务。不知道你真正想做什么,我不能说更多。
【讨论】:
给定工作组中的工作项在单个处理单元的处理元素上同时执行。
【讨论】: