【问题标题】:OpenCL large global size or for loops per work item?OpenCL 大全局大小或每个工作项的循环?
【发布时间】:2016-09-03 09:12:16
【问题描述】:

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

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

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

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

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

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

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

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

【问题讨论】:

    标签: loops kernel opencl gpu mali


    【解决方案1】:

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

    是的。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多