工作组中的半封闭工人 让我们考虑在OpenCL内部有多个工作组和多个工作组。 如果我们在一个工作组中有大量的工作人员作为GPU上的“核心”,GPU将按顺序在工作组中工作,其中每个工作人员在一个工作组中并行工作(对吗?)。完成一个工作组后,将执行下一个工作组。 如果我们在一个工作组中的工作人员比GPU上的“核心”要少,据我所知,GPU将并行执行多个工作组,当然多个工作人员是并行执行的(对吧?)。在这种情况下,执行此代码时会发生什么 __kernel void vector_add(__global const int *A) { // Get the index of the current element to be processed int i = get_global_id(0); if(A[i] == 0) { return; //stop like the half of all workers in a workgroup } // Do some time consuming calculation ... }

工作组中的半封闭工人 让我们考虑在OpenCL内部有多个工作组和多个工作组。 如果我们在一个工作组中有大量的工作人员作为GPU上的“核心”,GPU将按顺序在工作组中工作,其中每个工作人员在一个工作组中并行工作(对吗?)。完成一个工作组后,将执行下一个工作组。 如果我们在一个工作组中的工作人员比GPU上的“核心”要少,据我所知,GPU将并行执行多个工作组,当然多个工作人员是并行执行的(对吧?)。在这种情况下,执行此代码时会发生什么 __kernel void vector_add(__global const int *A) { // Get the index of the current element to be processed int i = get_global_id(0); if(A[i] == 0) { return; //stop like the half of all workers in a workgroup } // Do some time consuming calculation ... },opencl,Opencl,此代码将导致“分支”,但工作组中的某些工作人员将直接停止(返回),而其他工作人员将执行一些耗时的计算。我们能称之为“分支”吗? 最大的问题是:返回的“核心”将做什么?他们是否在等待工作组中的每个工人都完成工作?或者因为很多人同时返回,他们会跳转到下一个工作组执行吗 这种行为是特定于供应商的吗?或者这种情况在OpenCL中定义正确吗?如果内核中有分支,并且在工作组中有些工作人员执行分支a和分支B,则所有工作人员必须分别计算这两个分支并丢弃未使用的分支结果。这会对执行时间产生负面影响,这也是在可能的

此代码将导致“分支”,但工作组中的某些工作人员将直接停止(返回),而其他工作人员将执行一些耗时的计算。我们能称之为“分支”吗? 最大的问题是:返回的“核心”将做什么?他们是否在等待工作组中的每个工人都完成工作?或者因为很多人同时返回,他们会跳转到下一个工作组执行吗


这种行为是特定于供应商的吗?或者这种情况在OpenCL中定义正确吗?

如果内核中有分支,并且在工作组中有些工作人员执行分支a和分支B,则所有工作人员必须分别计算这两个分支并丢弃未使用的分支结果。这会对执行时间产生负面影响,这也是在可能的情况下应避免在GPU上分支的原因。在您的示例中,使用空的
return
分支,如果工作组中只有一个worker必须执行
耗时的计算
,则所有其他worker必须等待,从而阻塞其他工作组的硬件资源。如果工作组很小,并且幸运的是所有线程都执行
return
分支,那么该特定工作组的执行速度非常快

物理GPU“核心”和工作组大小之间的匹配与计算结果无关,但在一定程度上会影响性能。工作组大小应为32的倍数(GPU将其“核心”细分为32组,即所谓的扭曲)。因此,如果工作组大小为16,则GPU的一半将始终处于空闲状态。另一方面,如果工作组的大小非常大(比如1024个),并且内核中有分支,那么所有工作人员都执行相同的分支的可能性就比较小,最终会出现上述情况

如果您需要通过
local
内存跨工作组进行通信,那么工作组大小有时会有点折衷。更大的工作组允许更多的本地通信,但增加了“双分支”的可能性。如果不使用
本地
内存,可以自由调整工作组大小以获得最佳性能(通常为64-256)


理想情况下,您希望让GPU充满数百万个线程,这样就不会有空闲的“内核”和最佳性能。

感谢您的详细解释!如果我理解正确,这也意味着:不同的工作组可以同时在不同的分支上工作。。。例如,工作组1正在处理分支A,而工作组2正在处理分支B。是否正确?这也意味着,在执行内核之前对条件进行排序似乎是一个好主意。只要一个工作组中的所有工作人员都执行同一个分支,性能就很好。不同的工作组可以同时执行不同的分支。