1. Hexagon DSP/HVX/HTP 硬件演进
说到高通骁龙芯片大家应该不会陌生,其作为最为广泛的移动处理器之一,几乎每一个品牌的智能手机都会使用高通骁龙的处理器。
高通提供了一系列骁龙芯片解决方案。根据性能强弱分为了5个产品系列:从最高端的SM8xxx和SDM8XX系列,到中低端的SDM7XX, SDM6XX, SDM4XX系列。这些SOC上具有的信号处理芯片称为Hexagon DSP。低端系列可能只包含一个Hexagon DSP, 而高端系列通常有多个Hexagon DSP子系统。
各SOC上,相比于主控CPU而言, DSP具有典型的低主频(low clock)更高的指令级并行度(SIMD)。这使得DSP相比CPU具有更低的功耗和更高的计算能力。因此适合于将尽可能多的高计算密集型任务offload到DSP, 来减少整体的设备功耗。
随着Hexagon DSP的更新与发展,其在软硬件架构、主频和指令级上都有提升。下图一览表描述了Hexagon DSP/HVX/HTP 硬件架构的演进历史:
芯片代号 | 微架构 | 硬件演进(组成及命名变化) |
MSM8996(SDM820) | v60 | 3 个 Hexagon DSPs: application, modem, and sensor: Application DSP, Modem DSP, Sensor DSP 其中aDSP是Audio/Voice and Compute applications共享 |
MSM8998(SDM835) | v62 | |
SDM660 | v60 | 4 个 separate DSP, 每个都用于一个特定的应用领域: sensor (sDSP), modem (mDSP), audio (aDSP), and compute (cDSP, dedicated for Compute applications, scalar core + HVX) |
SDM670/SDM710 | v65 | Compute DSP + HVX |
SDM845 | v65 | Computer subsystem: Compute DSP + HVX |
SM6150 | V66 | Computer subsystem: Compute DSP + HVX (64-byte/512-bit mode will no longer be supported from Hexagon version v66 onwards) |
SM8150 | V66 | Computer subsystem: Compute DSP + HVX |
SM8250 | V66 | Computer subsystem: Compute DSP + HVX |
SM8350 | V68 | Computer subsystem:Hexagon Tensor Processor with Hexagon core + HVX + HMX |
SM8450 | V69 | ..... |
【注】
1.客户在查阅相关文档的时候经常看到有aDSP, cDSP, HTP这三个名词, 对其较为迷惑。实际上,在SDM660之前,Audio/Voice 和 Compute application是共有的一块DSP芯片叫aDSP 。从SDM660开始aDSP这个名字就让给了audio DSP, 而我们的CDSP则作为Computer DSP的缩写。随着AI领域应用的涌现和需求,到SM8350,DSP芯片内部封装了一块专门用于AI MAC计算的协处理器HMX,专门面向深度卷积神经网络 (DCNN) 模型而打造。 添加了HMX之后的CDSP芯片更名为HTP(Hexagon Tensor Processor)。
本专栏文章围绕高通骁龙较新的平台,对其软硬件架构特性和如何在其上进行开发讲述。
2. HTP(Hexagon Tensor Processor)介绍
HTP hardware Architecture包含4个模块:
(1)Scalar Processing V68 core with six hardware threads
(2)Hexagon ISA is extended with HVX instructions: 4 x HVX vector tightly coupled coprocessors
(3)HMX, 1x matrix tightly coupled coprocessor
(4)CDSP memory
通常我们将Hexagon Core特指Hexagon DSP里面的scalar 硬件处理线程。而 HVX(Qualcomm Hexagon eXtensions)则 是 Hexagon DSP 的向量处理单元。 目前高通骁龙Hexagon DSPs中只有CDSP(HTP)芯片上有HVX:
•添加宽向量(512 位或 1024 位)SIMD 支持
•Hexagon v6x 处理器架构的指令扩展支持在协处理器中实现向量操作
•适用于高性能成像、计算和机器学习应用
HMX作为HTP上专门用于深度学习MAC计算的硬件模块暂时不对客户开放进行可编程。客户只能通过QNN等高通提供的软件库接口进行调用。
HTP上客户可编程的只有Hexagon CDSP scalar core + HVX。而其中Scalar由于最多只能同时处理64bit数据,因 而最大并行度只有8 。HVX支持128Byte的向量寄存器(Vector Register)可以同时处理128Byte数据,而作为我们HTP上开发的重点。本专栏及在后续的文章中,将仍旧使用CDSP来作为Hexagon core + HVX的统称。用scalar代表标量thread以及scalar指令。 用HVX代表Vector thread以及Vector指令。
我们在进行CDSP开发的时候,除了学会使用具体的指令完成自己想要的功能之外,还有一个重要的点就是对数据进行读写。因此有必要理解CDSP开发中的数据通路。
CDSP 内存模块框图:
标量寄存器(Scalar registers):
Hexagon 标量处理核心包括32个32bit的通用寄存器 R0-R31. 32个32bit的控制寄存器C0-C31.
向量寄存器:
HVX处理核心包括32个1024bit的数据向量寄存器 V0-V31. 4个128bit的 预测寄存器Q0-Q31.
将CDSP的内存存储结构总结如下:
Level | Type | Description |
0 | 标量寄存器;向量寄存器 | Hexagon core: 6个硬件标量线程; Hexagon Vector eXtensions: SIMD 处理单元有4个向量硬件线程 |
1 | 数据L1; 指令L1; | 数据L1用于标量指令寄存器获取数据; 指令L1用于获取标量、向量线程指令. |
2.1 | 统一的L2 | L2 cache 可以配置一部分成为L2TCM用于用户直接使用 |
2.2 | VTCM | HVX片上内存,适合于Vector线程,速度比DDR快 |
3 | DDR(Ion-mem) | DDR使用AXI协议与L2进行数据存取 |
3. CDSP编程开发入门——手机端运行一个独立程序
为了开始使用骁龙SOC上的CDSP进行算法移植功能模块的开发,高通给出了如下的开发总体流程。
步骤1:首先第一步就是需要安装Hexagon SDK软件开发包。Hexagon SDK可以从高通的Qualcomm Developer Network (QDN)网站上下载。
[注]对于早期的SDK版本,开发者可以从高通开发者网站上下载到。由于高通的骁龙硬件平台更新后,相应的编译工具也必须要更新到指定的SDK版本。 因此建议客户尽可能安装最新的SDK版本。
安装完成以后,可以从如下的路径获取到入门相关文档和示例:
(1). SDK说明文档入口:C:\Qualcomm\Hexagon_SDK\<Latest_Version>\docs\index.html
(2). CDSP开发指令与工具文档:C:\Qualcomm\Hexagon_SDK\<Latest_Version>\tools\HEXAGON_Tools\x.x.xx\Documents\Hexagon_Document_Bundle.pdf
(3). SDK示例:
C:\Qualcomm\Hexagon_SDK\<Latest_Version>\examples
对于新版本的SDK, 还提供了如下功能更为丰富以及体现新特征的示例以及文档:
C:\Qualcomm\Hexagon_SDK\<Latest_Version>\addons\compute\examples。
C:\Qualcomm\Hexagon_SDK\<Latest_Version>\addons\compute\docs\index.html.
步骤2:安装好CDSP开发的SDK之后,要编译运行一个SDK自带的example用以确保本地完整的开发工具都已经准备妥当。下面以SDK3.5.4例讲解如何运行一个example的步骤。 这些步骤在上面列出的说明文档中也有介绍:
2.1. 打开一个windows DOS界面. 运行环境配置脚本完成一些环境变量的配置:C:\Qualcomm\Hexagon_SDK\3.5.4>setup_sdk_env.cmd
2.2. 编译example benchmark。由于ARM作为主控芯片,CDSP是作为子系统计算芯片。他们具有不同的ISA,因此需要分别编译安卓端和CDSP端的库。 而作为一个可独立运行的示例,安卓端也同时应当准备一个可执行文件,去调用安卓端的库:
编译安卓端库以及可执行文件:
C:\Qualcomm\Hexagon_SDK\3.5.4\examples\common\benchmark>make tree V=android_ReleaseG_aarch64
编译完成之后应当得到如下的文件夹路径以及编译结果:
C:\Qualcomm\Hexagon_SDK\3.5.4\examples\common\benchmark\android_ReleaseG_aarch64\ship\libbenchmark.so ----->android端库
C:\Qualcomm\Hexagon_SDK\3.5.4\examples\common\benchmark\android_ReleaseG_aarch64\ship\benchmark ------->可执行文件
编译CDSP端库:
C:\Qualcomm\Hexagon_SDK\3.5.4\examples\common\benchmark> make tree V=hexagon_Release_dynamic_toolv83_v66
编译完成之后应当得到如下的文件夹路径以及编译结果:
C:\Qualcomm\Hexagon_SDK\3.5.4\examples\common\benchmark\hexagon_Release_dynamic_toolv83_v66\ship\libbenchmark_skel.so ----->DSP端库
步骤3:准备好手机跑example需要的代码文件之后,我们还需要准备好手机运行环境。高通设置了安全机制,使得所有CDSP的程序在骁龙手机上运行的时候都需要进行签名, 否则会出现.so库签名失败的log。高通提供了多种签名方式。在这里,我们讲解一种在进行算法模块指令代码开发阶段采用的测试签名方式。
客户做测试签名的手机必须是开发机型,即no-fused device。如果从市场门店购买的手机,通常已被开启了secure boot, 因此无法使用测试签名。 如何查看手上的手机是否fused, 每个手机厂商都有自己的快捷键码。同时下面也提供了一种方式:
C:\adb_fastboot_drivers>fastboot getvar secure
secure: no
Finished. Total time: 0.002s
拿到测试机之后,用下面的步骤进行给手机签名。被签名的手机则可以跑任意的CDSP库:
3.1. C:\Qualcomm\Hexagon_SDK\ 3.5.4>adb push C:\Qualcomm\Hexagon_SDK\3.5.4\tools\elfsigner\getserial\CDSP\android_Release\getserial /data/local/tmp
3.2. C:\Qualcomm\Hexagon_SDK\3.5.4>adb shell chmod 777 /data/local/tmp/getserial
3.3. C:\Qualcomm\Hexagon_SDK\3.5.4>adb shell /data/local/tmp/getserial
####################Serial number (see below)###########################
Serial Num : 0x5d9a2fe3
####################Serial number (see above)###########################
注释:stdout会出现一串手机序列号。这里以我的手机为例
3.4.C:\Qualcomm\Hexagon_SDK\3.5.4\tools\elfsigner>python elfsigner.py -t 0x5d9a2fe3
Logging to C:\Qualcomm\Hexagon_SDK\3.5.4\tools\elfsigner\output\Elfsigner_log.txt
Attention:
Use of this tool is conditioned upon your compliance with Qualcomm
Technologies'(and its affiliates') license terms and conditions;
including, without limitations, such terms and conditions addressing
the use of such tools with open source software.
Agree? [y/n]:
y
Signing a file may take up to 3 minutes due to network connectivity. Please wait patiently.
------------------------------------------------------------
Signing complete! Output saved at C:\Qualcomm\Hexagon_SDK\3.5.4\tools\elfsigner\output\testsig-0x5d9a2fe3.so
3.5. C:\Qualcomm\Hexagon_SDK\3.5.4\tools\elfsigner>adb push C:\Qualcomm\Hexagon_SDK\3.5.4\tools\elfsigner\output\testsig-0x5d9a2fe3.so /vendor/lib/rfsa/adsp
步骤4:将编译好的库用adb推送到手机端,运行。
4.1在C:\Qualcomm\Hexagon_SDK\3.5.4\examples\common\benchmark路径下新建一个windows bat脚本,命名为runv.bat,填入如下的命令行:
adb root
adb remount
adb shell rm -rf /data/local/tmp/runtime
adb shell mkdir /data/local/tmp/runtime
adb shell mkdir /data/local/tmp/runtime
adb push ./android_ReleaseG_aarch64/ship/benchmark /data/local/tmp/runtime
adb push ./android_ReleaseG_aarch64/ship/libbenchmark.so /data/local/tmp/runtime
adb push ./hexagon_Release_dynamic_toolv83_v66/ship/libbenchmark_skel.so /vendor/lib/rfsa/adsp
adb shell mkdir /data/local/tmp/runtime/data
echo chmod 755 /data/local/tmp/runtime/benchmark > tmp
echo cd /data/local/tmp/runtime >> tmp
echo export LD_LIBRARY_PATH=./ >> tmp
echo ./benchmark -f epsilon -w 256 -h 64 -P 255 -L 10 -l 10 -s >> tmp
echo exit >> tmp
adb shell < tmp
:del tmp
4.2运行脚本C:\Qualcomm\Hexagon_SDK\3.5.4\addons\compute\examples\benchmark>runv66.bat。 如果前面的步骤一切正常的话,此处运行完之后终端窗口会有类似如下的success提示:
C:\Qualcomm\Hexagon_SDK\3.5.4\examples\common\benchmark>
setting clocks to power level 255, Deprecated power level NOT used 1
src - allocated 16384
dst - allocated 16384
ref - allocated 16384 (via malloc)
calling epsilon on a 256x64 image...
run time of epsilon: 10319 microseconds for 10 RPC iterations, each with 10 iterations inside the DSP.
Last iteration DSP-measured time (for 10 iterations): 157 uSec, 220417 cycles (RPC overhead 641 uSec), apparent clock rate 1403 MHz
Average DSP execution time = 157 uSec, Average RPC overhead = 874 uSec
return value from epsilon: 0
- success
4. 术语表
术语 | 解释 |
CDSP | Compute Digital Signal Processor |
HVX | Hexagon Vector eXtension |
HMX | Hexagon Matrix eXtension |
作者:sallyISshanli