高通平台图像算法优化
图像性能优化涉及到的知识点较多,并且知识点之间的并无直接的逻辑关系。总的来说目的都是一样的:就是尽可能利用现有硬件提升运算时的并发性。
多核异构的方式能在同等功耗的情况下尽可能提升运算速率 。高通的多核异构实现如下:
运行在不同的硬件上需要对应不同的编程模型,本文对此做了简单的总结。
文章目录
1.运行在GPU(Andreno):
1.1 RenderScript
RenderScript 是 google 退出运行在 Android 平台上的并行编程语言,能在运行时决定将计算任务合理分配给CPU 和 GPU。在 frameworks/rs目录能看到 RenderScript 源码和实例。其中rsDefines.h 定义了 RenderScript 使用的基本数据结构。
RenderScript 通过以下方式实现:
详情:https://source.android.google.cn/devices/architecture/vndk/renderscript
RenderScript和framework的关系
RenderScript 和OpenCL相似,算子封装在 kernel 函数中,例如以下代码是将输入图片中所有 RGB 反色:
#pragma version(1)
#pragma rs java_package_name(com.hc.renderscript)
uchar4 __attribute__((kernel)) invert(uchar4 in)
{
uchar4 out = in;
out.r = 255- in.r;
out.g = 255-in.g;
out.b = 255-in.b;
return out;
}
以上代码会在运行时作用与输入图像的每个像素。
Google 一直在大力推广 RenderScript 作为图像处理的主力优化语言,但是目前看来普及率很低。个人推测有以下原因:
1.关于 RenderScript 的资料非常少,而且想要熟悉使用这个工具需要对 Android Framework 编译环境有深入了解。对于开发者而言,很难知道算法在设备运行时的细节。
2.RenderScript 优化能力有待商榷,在native层没有什么优势。毕竟平台商比Google更熟悉自家硬件,平台商有更多的手段针对自家硬件作优化。
1.2 OpenCL
OpenCL(全称Open Computing Language,开放运算语言)
Andreno GPU 支持OpenCL,具体参考文档: https://developer.qualcomm.com › qfile › 80-nb295-11_a
高通最新 camera 架构 CamX 上也有 GPU 的专属节点,目录位于:chi-cdk\vendor\node\gpu
该节点代码以 OpenCL 的方式对 GPU 进行编程。
工作流程如下:
- 设备初始化
- 准备主机端数据(分配主机端内存+获取数据)
- 分配设备端内存
- 将主机端数据拷贝到设备端
- 设备启动内核函数,进行运算,将结果写到设备端内存
- 将设备端结果拷贝回主机端
- 读取主机端内存,进行后续处理
- 释放资源
OpenCL 反色函数如下:
__kernel void MatrixMatrixAddSimple( const int matrixRows,
const