我正在学习OpenCL,以实现一个相对复杂的图像处理算法,该算法包括几个应作为内核实现的子程序。
该实施旨在用于Mali T-6xx GPU。
我阅读了“OpenCL Programming by Example”一书和“在Mali-T600 GPU上优化OpenCL内核”文档。
在书籍示例中,他们使用一些全局大小的工作项,每个工作项处理for循环中的几个像素。
在文档中,内核的编写没有循环,因为内核中每个工作项只执行一次。
由于可能在Mali T-600 GPU上产生的工作项的最大全局大小为256(对于简单内核而言)并且在大多数图像中显然有更多的像素要处理,在我理解的内核中没有循环将尽快生成更多工作项线程,直到完成执行内核的工作项的全局大小,全局大小可能只是图像中的像素数量。是对的吗?这样它本身就是一种线程产生循环?
另一方面在书中。全局工作大小小于要处理的像素数,但内核具有循环,使每个工作项在执行内核代码时处理几个像素。
所以我想知道哪种方式是为此编写图像处理内核或任何OpenCL内核的正确方法 事情,在什么情况下,一种方式可能比另一种方式更好,假设我正确理解两种方式......
答案 0 :(得分:1)
是吗?这样它本身就是一种线程产生循环?
是
所以我想知道哪种方式是编写图像处理内核或任何OpenCL内核的正确方法以及在什么情况下编写
我怀疑一般没有“正确”的答案 - 有多个硬件供应商和多个驱动程序 - 所以我怀疑“最佳”方法因供应商而异。
对于Mali,特别是线程产生全部由硬件处理,因此通常比着色器代码中的显式循环更快,它将采用指令进行处理。
至少一些矢量化通常有一些优点 - 例如处理每个工作项的像素vec4或vec8矢量而不仅仅是1 - 因为Mali-T600 / 700/800 GPU内核使用矢量算术架构。