本章介绍如何为 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。