我知道工作项被分组到工作组中,您无法在工作组之外进行同步。
这是否意味着工作项并行执行?
如果是这样,是否可以/有效地制作一个包含128个工作项的工作组?
答案 0 :(得分:11)
组内的工作项将一起安排,并可以一起运行。由硬件和/或驱动程序来决定执行的实际并行程度。这有不同的原因,但一个非常好的原因是隐藏内存延迟。
在我的AMD卡上,“计算单元”分为16个4宽SIMD单元。这意味着技术上可以在组中同时运行16个工作项。建议我们在一个组中使用64个工作项的多个,以隐藏内存延迟。显然,他们不可能在确切的时间运行。这不是问题,因为大多数内核实际上都是内存限制的,因此调度程序(硬件)会将等待内存控制器的工作项交换出来,而“就绪”项则会获得计算时间。组中的实际工作项数由主程序设置,并受CL_DEVICE_MAX_WORK_GROUP_SIZE限制。您需要尝试内核的最佳工作组大小。
当涉及到同步工作项时,cpu实现“更糟糕”。只有尽可能多的工作项运行,因为您有可用于运行它们的核心。它们在cpu中表现得更顺序。
那么工作项目是否在同一时间运行?几乎从来没有真的。这就是为什么当我们想要确保它们在给定点暂停时我们需要使用障碍。
答案 1 :(得分:5)
在(抽象)OpenCL执行模型中,是的,所有工作项并行执行,并且可能有数百万个。
在GPU内部,同一工作组的所有工作项必须在单个“核心”上执行。这对每个工作组的工作项数量设置了物理限制(256或512是最大值,但对于使用大量寄存器的大型内核,它可以更小)。然后,所有工作组都安排在GPU的(通常是2到16个)核心上。
您可以同步工作组中的线程(工作项),因为它们都驻留在同一个核心中,但是您无法同步来自不同工作组的线程,因为它们可能不会同时进行调度,并且可以在不同的核心上执行。
是的,工作组中可以有128个工作项,除非它消耗太多资源。要获得最大性能,通常需要在工作组中拥有尽可能多的线程数(隐藏内存延迟至少需要64个,请参阅此主题的Vasily Volkov's presentations)。
答案 2 :(得分:1)
这个想法是,如果可能的话,他们可以并行执行(无论它们实际上是否会并行执行)。
答案 3 :(得分:0)
是的,工作项是并行执行的。
要获得尽可能多的工作项,请将clGetDeviceInfo
与CL_DEVICE_MAX_WORK_GROUP_SIZE
一起使用。这取决于硬件。
是否有效主要取决于您要实施的任务。如果您需要大量同步,可能是OpenCL不适合您的任务。在不知道你真正想做什么的情况下,我不能说更多。
答案 4 :(得分:0)
给定工作组中的工作项同时在sigle处理单元的处理元素上执行。