我正在学习 OpenCL 以实现一个相对复杂的图像处理算法,其中包括几个应该作为内核实现的子例程。
该实现旨在在 Mali T-6xx GPU 上进行。
我阅读了“OpenCL Programming by Example”一书和“Optimizing OpenCL kernels on the Mali-T600 GPUs”文档。
在书中的示例中,他们使用了一些全局大小的工作项,每个工作项在 for 循环中处理几个像素。
在文档中,内核是在没有循环的情况下编写的,因为内核中的每个工作项都有一次执行。
由于可能在 Mali T-600 GPU 上生成的工作项的最大全局大小为 256(对于简单内核而言)并且在大多数图像中显然有更多的像素需要处理,据我了解,没有循环的内核将生成尽可能多的工作项线程,直到工作项的全局大小完成执行内核,全局大小可能只是图像中的像素数量。那正确吗?这样它本身就是一种线程生成循环?
另一方面在书中。全局工作大小小于要处理的像素数量,但内核有循环使每个工作项在执行内核代码时处理几个像素。
所以我想知道哪种方法是编写图像处理内核或任何 OpenCL 内核的正确方法,以及在什么情况下一种方法可能比另一种更好,假设我正确理解了两种方法......