本章介绍如何为 Mali GPU 优化现有的 OpenCL 代码。它包含以下小节:
 > 关于为优化现有代码
 > 为优化现有代码的步骤
 


6.1 关于为 Mali GPU 优化现有 OpenCL 代码

  OpenCL 是一种可移植语言,但并不总是在性能上可移植。这意味着 OpenCL 可以在不同类型的计算设备上工作,但性能无法维持。现有的 OpenCL 通常针对桌面 GPU 等特定架构进行了调节。要在 Mali GPU 上获得更佳的性能,您必须针对 Mali GPU 重调代码。

  转换 OpenCL 代码以便在 Mali GPU 上优化运行的过程如下:

a. 分析代码。

b. 查找和删除针对其他计算设备的优化。

c. 矢量化代码。

d. 针对 Mali GPU 优化代码。

 


6.2 为 Mali GPU 优化现有 OpenCL 代码的步骤

  本节介绍为 Mali GPU 优化现有 OpenCL 代码的步骤。它包含下列小节:
 > 分析代码
 > 查找和删除设备优化
 > 为优化代码
 

6.2.1 分析代码

  如果不是自己编写的代码,您必须分析代码,以便了解它的确切行为。尝试了解如下所列:
 > 代码的目的是什么?
 > 算法如何运作?
 > 如果没有优化,代码会是什么样子?
 
  这些问题的答案可以充当向导,帮助您删除设备相关的优化。这些问题可能难以回答,因为高度优化的代码可能会非常复杂。


6.2.2 查找和删除设备优化

  存在针对其他计算设备的优化,它们对 Mali GPU 没有作用,或者会减低性能。要针对 Mali GPU 优化代码,您必须首先删除下列所有类型的优化,从而创建设备无关的参考实施;


本地或专用内存的使用

  Mali GPU 使用缓存而非本地或专用内存,因此您不必手动将数据移入或移出其中。删除来往于本地或专用内存的所有分配和复制。


屏障

  来往于本地内存的数据传输通常与屏障同步。删除所有此用途的屏障。


缓存大小优化

  某些代码优化读取和写入操作,以便数据能装入缓存行。这是有用的优化,但缓存行大小可能与 Mali GPU 的不同。删除这些类别的优化。


对标量的使用

  许多 GPU 使用标量,而 Mali GPU 使用的是矢量。如果有基于标量的优化,请将其删除。


针对库冲突的修改

  某些代码包含可避免库冲突的优化。请删除这些优化。


扭曲或波前

  Mali GPU 不使用扭曲或波前。请删除任何相关的优化。


针对分叉线程的优化

  Mali GPU 上的线程是独立的,无法分叉。如果代码包含针对分叉线程的优化或变通,请将其删除。

 

6.2.3 为 Mali GPU 优化 OpenCL 代码

  要针对 Mali GPU 优化代码,请参见第 7 章 为 Mali GPU 优化 OpenCL。