1

我正在学习 OpenCL 以实现一个相对复杂的图像处理算法,其中包括几个应该作为内核实现的子例程。

该实现旨在在 Mali T-6xx GPU 上进行。

我阅读了“OpenCL Programming by Example”一书和“Optimizing OpenCL kernels on the Mali-T600 GPUs”文档。

在书中的示例中,他们使用了一些全局大小的工作项,每个工作项在 for 循环中处理几个像素。

在文档中,内核是在没有循环的情况下编写的,因为内核中的每个工作项都有一次执行。

由于可能在 Mali T-600 GPU 上生成的工作项的最大全局大小为 256(对于简单内核而言)并且在大多数图像中显然有更多的像素需要处理,据我了解,没有循环的内核将生成尽可能多的工作项线程,直到工作项的全局大小完成执行内核,全局大小可能只是图像中的像素数量。那正确吗?这样它本身就是一种线程生成循环?

另一方面在书中。全局工作大小小于要处理的像素数量,但内核有循环使每个工作项在执行内核代码时处理几个像素。

所以我想知道哪种方法是编写图像处理内核或任何 OpenCL 内核的正确方法,以及在什么情况下一种方法可能比另一种更好,假设我正确理解了两种方法......

4

1 回答 1

1

那正确吗?这样它本身就是一种线程生成循环?

是的。

所以我想知道哪种方法是编写图像处理内核或任何 OpenCL 内核的正确方法,以及在什么情况下

我怀疑一般来说没有一个“正确”的答案——有多个硬件供应商和多个驱动程序——所以我怀疑“最佳”方法会因供应商而异。

特别是对于 Mali,线程生成全部由硬件处理,因此通常比着色器代码中的显式循环更快,后者将采用指令进行处理。

通常至少有一些矢量化有一些优势——例如,处理每个工作项的 vec4 或 vec8 像素矢量,而不仅仅是 1——因为 Mali-T600/700/800 GPU 内核使用矢量算术架构。

于 2016-05-08T20:03:43.720 回答