OpenCL工作组是否同时执行?

时间:2015-08-18 14:15:12

标签: image parallel-processing opencl gpu gpgpu

我的理解是,每个工作组都在GPU上执行,然后执行下一个工作组。

不幸的是,我的观察结果表明这是不正确的。 在我的实现中,所有工作组共享一个大的全局内存缓冲区。 所有工作组都对此缓冲区的各个位置执行读写操作。

如果内核直接对其进行操作,则不会发生冲突。 如果工作组将块加载到本地内存中,执行一些计算并将结果复制回来,则全局内存会被其他工作组损坏。

那我怎么能避免这种行为呢?

我可以告诉OpenCL只能一次执行一个工作组或重新安排执行顺序,这样我就不会有冲突吗?

3 个答案:

答案 0 :(得分:1)

答案是,这取决于。必须在设备上同时执行整个工作组(尽管不一定并行),至少在存在障碍时,因为工作组必须能够同步和通信。没有规则说工作组必须是并发的 - 但没有规则说它们不能。通常,硬件会将单个工作组放在单个计算核心上。大多数硬件都有多个内核,每个内核都有一个工作组,为了弥补延迟,如果有可用的容量,许多硬件也会在一个内核上放置多个工作组。

您无法控制工作组的执行顺序。如果您希望它们序列化,那么最好只启动一个工作组并在内部编写一个循环来序列化同一工作组中的一系列工作块。即使有多个工作组,这通常也是一个很好的策略。

但是,如果你真的只想要一个工作组,那么你可能只会使用一小部分硬件。大多数硬件无法在整个设备上传播单个工作组 - 因此,如果您坚持使用32核GPU上的一个核心,那么您将无法充分利用该设备。

答案 1 :(得分:1)

您需要将全局大小和维度设置为单个工作组的大小和维度,并为每个组排队新的NDRange。从本质上讲,将对内核的调用分解为许多较小的调用。确保您的命令队列不允许乱序执行,以便内核调用阻塞。

这可能会导致较差的性能,但您将获得您正在寻找的专用全局内存访问。

是的,这些组可以并行执行;这通常是一件非常好的事情。 Here is a related question.

答案 2 :(得分:0)

可以在ComputeUnit(AMD)或SMX(Nvidia)上同时启动的工作组数量取决于GPU硬件资源的可用性,重要的是矢量寄存器和工作组级别内存**(称为LDS for AMD和Nvidia共享内存)。如果要在CU / SMX上仅启动一个工作组,请确保工作组消耗大量这些资源,并在同一CU / SMX上阻止其他工作组。但是,您仍然可以在其他CU / SMX上执行其他工作组 - GPU通常具有多个这些工作组。 我不知道有任何API可以将内核固定到单个CU / SMX上。

**它还取决于调度程序可以处理的并发波前/扭曲的数量。