Xilinx社区
首页 > 技术专栏 > Qualcomm Hexagon SDK 入门到精通(3)SDK 3.2结构及部分API介绍
Qualcomm Hexagon SDK 入门到精通(3)SDK 3.2结构及部分API介绍
来源:Qualcomm 时间:2017-06-02

  前面介绍了SDK安装过程和注意事项,下面我们简单介绍下SDK的主要结构和功能。如果你有开发经验的化,一定知道SDK中API的重要性。这不但为我们节省了很多通用的功能的实现,也可以让我们关注在汽车的具体功能上的开发。并且可以得到强大的程序。

  本文对一些API做一些介绍,具体可以查询SDK库。

  Hexagon SDK主要功能和结构介绍

  Qualcomm的Hexagon SDK让开发者能够在Hexagon DSP上运行的代码,是通过Computation Offload来实现的. Computation Offload是将计算工作卸载到DSP上进行. 而且令人振奋的是application DSP、compute DSP、modem DSP和Sensors Low Power Island都能实现计算工作卸载的功能。这需要Fast RPC和Dynamic loading来实现这个过程.

  FastRPC是CPU和DSP链接交互的桥梁。Dynamic loading是指Hexagon SDK提供的通过动态共享对象在DSP上创建和执行自定义代码的工具和服务.

  所有需要安装的工具都在Hexagon SDK的tools目录下.

  上图是SDK目录结构图:

   目录build:包括cedp等,make.d的文件

   目录docs:包括Hexagon SDK的文件信息

   目录examples:包括一些例子,可以用来作为了解这个SDK的起点来做更先进的音频,动态和FastRPC模块

   目录incs:示例或库使用的一些头文件

   目录libs:可运行在应用处理器工具库和工具

   目录scrips:包含实用脚本

   目录test:一些用来测试Hexagon DSP模块的基础

   目录tools:新建实例的工具集,Android NDK,Hexagon 工具,Hexagon IDE,签名,调试和一些其他工具

  HVX矢量计算及机器学习

  HVX: 全称Hexagon Vector Extensions,是一种能有效地实现低功耗和高性能的以处理像素为基础的算法,适用于相机,计

  基于HVX的计算机视觉: SDK包含了几个例子,图算机视觉和视频处理.

  像处理应用程序演示等,都是用Hexagon DSP来实现计算机视觉,这些例子可以更广泛地用于各种目的的卸载计算应用到Hexagon DSP中处理.

  基于HVX的机器学习: 机器学习探索的研究和构建算法,可以学习和预测数据.这样的算法操作,通过示例输入建立一个模型来做数据的预测,而不是严格遵循静态程序指令.可升级的骁龙架构让其能够被应用到低功耗的可穿戴设备之类,完全链接的手机设备之类.这些设备有不同的计算能力和连接能力,适用于各自环境如:不同的电源限制如插入或不操作,不同的可靠性要求如连续运行5年,安全要求如OEM代码的执行.骁龙架构的一个重要组成部分就是Hexagon DSP,随着Hexagon DSP的扩展,低功耗设备机器学习可以用于新的应用.

  基于HVX的部分API

  这里我们介绍一下SDK中一些示例,即在HVX上实现的一些算法。

  线性回归是一个变量Y和一个或多个变量X之间的关系建模方法,属于监督学习范畴.基于HVX的线性回归的设计和API函数的设计. 参考代码在目录examples/machine_learn-ing/LinearRegression中。

  线性回归的实现主要通过Cost function和梯度下降来实现。

  Cost Function有助于找出适合数据的最佳直线,也有助于决定theta(i)参数的值,不同的值会得到不同的函数.基于训练集,我们需要得到的直线的参数使得htheta(x)逼近于y. Cost Function有助于解决一个最小化问题,使得htheta(x)和y的差的平方最小化,也使得训练集中的所有h(x)和y之间的差最小化.

  HVX的Cost Function的API:

  void computeCostHVX16(int16_t* input,

  // Signed 16 bit input vector which needed to be scaled down

  int16_t numTrainingSet,

  // Length of training set

  int16_t numFeatures,

  // Number of input features

  int16_t* output,

  // Output Collected

  int16_t* theta,

  // Theta vector

  int16_t* costJ,

  // Cost Function. This would be output from the function.

  int16_t inputQformat

  // Input Q Format. n of Qm.n format

  )

  输入跟输出都是标准的数量,是训练设置VLEN的倍数,如果不是就补充0来使之是VLEN的倍数.

  梯度下降: 梯度下降算法有助于收敛到最小的θ,算法如下:

  需要反复执行直到相等:

  HVX 的梯度下降的API:

  void computeGradientHVX16(int16_t *restrict input,

  // Input Training Data Vector in appropriate Q Format

  // Ensure that this vector is memaligned with VLEN

  int16_t numTrainingSet,

  // Number of data points used for training

  int16_t numFeatures,

  // Number of features

  int16_t *restrict output,

  // Output Training Data Vector in appropriate Q Format

  // Ensure that this vector is memaligned with VLEN

  int16_t *restrict theta,

  // Initial Theta for computing cost.

  // This should be provided in appropriate Q Format

  // Ensure that this vector is memaligned with VLEN

  int16_t* grad,

  // Gradient for respective iteration

  int16_t inputQformat,

  // Input Q format

  // Output will also be in same Qformat

  // n of Qm.n format

  int16_t lambda

  // Regularization Parameter

  );

  训练集的数量要求是VLEN/2,如果不是VLEN/2的个数,就填充0让他是.

  介绍完Cost function和梯度下降,我们重点看下线性回归。

  线性回归:

  计算Cost和梯度同时收敛到局部极小,输出的alpha和λ就是我们需要的.

  算法: 初始化theta;

  重复{

  用theta计算cost

  用theta计算梯度

  更新theta:theta=theta-(alpha(multiply)grad)

  }

  HVX 的线性回归API:

  void linearRegressionSingleLambdaAlphaHVX16(

  int16_t *restrict input,

  // Input Training Data Vector in appropriate Q Format

  // Ensure that this vector is memaligned with VLEN

  int16_t numTrainingSet,

  // Number of data points used for training

  int16_t numFeatures,

  // Number of features

  int16_t *restrict output,

  // Output Training Data Vector in appropriate Q Format

  // Ensure that this vector is memaligned with VLEN

  int16_t* theta,

  // Initial Theta for computing cost.

  // This should be provided in appropriate Q Format

  // Ensure that this vector is memaligned with VLEN

  int16_t* costJ,

  // Cost for respective iteration

  int16_t* grad,

  // Gradient for respective iteration

  int16_t inputQformat,

  // Input Q format

  // Output will also be in same Qformat

  // n of Qm.n format

  int16_t lambda,

  // Regularization Parameter

  // This should be provided in appropriate Q format

  int16_t alpha,

  // Factor to converge to minima

  // This should be provided in appropriate Q format

  int16_t num_iteration

  // Number of iterations for which convergence should

  // be executed

  );

  线性回归的验证曲线:

  对于任何机器学习算法,将数据集分成训练数据和交叉验证数据.同样的对于线性回归,我们需要50%个数据的训练和50%个数据交叉验证.costs值的比较有助于决定正则化参数.

  算法:

  初始化theta{

  生成线性回归模型(alpha,lambda)

  用模型计算cost做测试数据

  用模型计算cost做验证数据

  }

  HVX的交叉验证API:

  void validationLinearRegressionHVX16(

  int16_t *restrict input,

  // Input Training Data Vector in appropriate Q Format

  // Ensure that this vector is memaligned with VLEN

  int16_t *restrict inputVal,

  // Input Validation Data Vector in appropriate Q Format

  // Ensure that this vector is memaligned with VLEN

  int16_t numTrainingSet,

  // Number of data points used for training

  int16_t numValidationSet,

  // Number of data points used for validation

  int16_t numFeatures,

  // Number of features

  int16_t *restrict output,

  // Output Training Data Vector in appropriate Q Format

  // Ensure that this vector is memaligned with VLEN

  int16_t* outputVal,

  // Output Validation Data Vector in appropriate Q Format

  // Ensure that this vector is memaligned with VLEN

  int16_t* theta,

  // Initial Theta for computing cost.

  // This should be provided in appropriate Q Format

  // Ensure that this vector is memaligned with VLEN

  int16_t* costJ,

  // Cost

  int16_t* grad,

  // Gradient

  int16_t inputQformat,

  // Input Q format

  // Output will also be in same Qformat

  // n of Qm.n format

  int16_t num_iteration,

  // Number of iterations for which convergence should

  // be executed

  int16_t *alpha,

  // Factor to converge to minima

  // This should be provided in appropriate Q format

  uint32_t sizeAlpha,

  // Size of data pointer of Alpha

  int16_t *lambda,

  // Data pointer to Regularization Parameter

  // This should be provided in appropriate Q format

  uint32_t sizeLambda

  // Size of data pointer of Lambda

  )

  Qualcomm汽车技术讨论组 QQ群号:566131670

more汽车电子市场动态
more技术专栏
more专家答疑
问:配置高通pmd9607的mpp管脚, 设置为模拟输入一直量不到电压,请教。
答:需要注意,MPP管脚并不是所有MPP管脚都可以配置的,请参考spec说明,你需要配置的pin有没有限制。通常模拟输入的话,还要配置ANA_IN_CTL等寄存器,需要外接模拟量,然后读取该pin的值的寄存器中HKADC值。
问:专家请指导: sensor厂家给的sensor相关资料(chromatix + lib)是支持前置摄像头的,“支持”主要是我这边验证过前置已经点亮。 后置摄像也用同sensor, 但用这套相关资料就点不亮了。 kernel层确认已经PROBE, 同时在/dev下有media0 media1,请协助该如何完成后置的点亮. p.s: 1. 该板后置如果使用其他sensor,可以点亮前后置摄像头; 2. 将后置摄像头拆卸, 可点亮前置, 不拆卸后置,同样可以点亮前置; 3. 如果前置后置一样, 前后置都点不亮, 但kernel层确认都probe, dev下有camera0,camera1,camera2; 4. 拆卸前置,仅后置, 依然无法点亮, kernel已经probe,dev下有camera0,camera1 针对前后置同sensor, 在sensor_init.c增加2sensor, 分别命名为: sensor, sensor_rear,同时在sensor_Libs目录下增加sensor,sensor_rear目录,主要是针对lib部分, 同时对lib中camera_id和position做对应修改(前:CAMERA_1,1,后: CAMERA_0,0) 写的太多, 一句话说明下问题: 前后置同sensor如何同时点亮前后置sensor, 是否需要修改lib中的参数,如何修改?还是其他问题?
答:从现象描述看,可以从以下几点排查。 1,sensor的配置,通常后置sensor 4lanes,而前置sensor 2lanes。换不同型号的sensor可以点亮,说明这些配置可能没有修改 导致一些问题。 2,重点看下,“拆卸前置,仅后置, 依然无法点亮,dev下有camera0,camera1,”,对比下前后置不同型号 枚举dev也是这样,看看HAL层dumpimage检查图像是否正常。 3,camera id枚举冲突,无法区分两颗相同的sensor,tuning参数调用是否正确。
问:请教专家,UE 链路层怎么样才能主动和NODE B断开。 设备和基站没有OTA log,也不太清楚是什么原因导致的连接断开。
答:可以通过AT命令CREG可以离线和在线网络。不知道是否是您需要的情况。 http://blog.chinaunix.net/uid-149881-id-2780145.html
问:有没有懂高通平台root 和解网络锁的高手?
答:eng和userdebug版本上通过adb root。你是否需要如下的方法么, https://zhidao.baidu.com/question/557640730.html
Copyright ©2000-2015 ELECTRONIC ENGINEERING & PRODUCT WORLD. All rights reserved.
京ICP备12027778号-2 北京市公安局备案:1101082052