高通骁龙(Qualcomm Snapdragon)CDSP HVX HTP 芯片简介与开发入门

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领域应用的涌现和需求到SM8350DSP芯片内部封装了一块专门用于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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/366488.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构_1.0

一、数据结构概述 1.1 概念 在计算机科学中&#xff0c;数据结构是一种数据组织、管理和存储的格式 。它是相互之间存在一种或多种特定关系的数据元素的集合。通常情况下&#xff0c;精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技…

【C语言】typedef 关键字

在C语言中&#xff0c;typedef关键字用于给现有的数据类型起一个新的名字。它在提高代码可读性、简化复杂类型声明、增强可维护性方面非常有用。typedef通常用于定义结构体、指针、函数指针以及其他复杂类型。 基本用法 typedef int MyInt; MyInt x 10;在这个例子中&#xf…

wps linux node.js 加载项开发,和离线部署方案

环境准备 windwos 安装node.js 安装VSCode 安装wps linux 安装node.js 安装VSCode 安装wps 通过npm 安装wpsjs SDK 使用npm安装wpsjs npm install -g wpsjs 创建一个项目 wpsjs create WPS-Addin-PPT 创建项目会让你选择2个东西&#xff1a; 1&#xff1a;选择你的文…

SpringBoot实现图片添加水印(完整)

提示&#xff1a;昨天不是写了一个类似与图片添加水印的版本吗,今天来写一个带数据库&#xff0c;并且可以完整访问的版本 文章目录 目录 文章目录 引入库 配置文件 数据库配置 字段配置 索引配置 数据库表语句 启动文件 前端代码 整体代码目录 配置类AppConfig Contro…

五千元软考补贴,这个地区的人别错过!

软考合格者可享受一些补贴&#xff0c;最高可达25万&#xff1f;&#xff01;持有软考证书可领取哪些补贴&#xff1f;软考补贴详细信息 由于不同地区政策有时间限制&#xff0c;符合条件的人员应尽快领取哦~ 今天继续分享常德地区的补贴信息。 这里给大家总结一下和软考有关…

Java的日期类常用方法

Java_Date 第一代日期类 获取当前时间 Date date new Date(); System.out.printf("当前时间" date); 格式化时间信息 SimpleDateFormat simpleDateFormat new SimpleDateFormat("yyyy-mm-dd hh:mm:ss E); System.out.printf("格式化后时间" si…

ROS2 RQT

1. RQT是什么 RQT是一个GUI框架&#xff0c;通过插件的方式实现了各种各样的界面工具。 强行解读下&#xff1a;RQT就像插座&#xff0c;任何电器只要符合插座的型号就可以插上去工作。 2.选择插件 这里我们可以选择现有的几个RQT插件来试一试&#xff0c;可以看到和话题、参…

计算机公共课面试常见问题:线性代数篇

目录 1. 特征向量和特征值代表什么含义&#xff1f; 2. 矩阵的秩是什么&#xff1f;满秩代表什么&#xff1f;不满秩呢&#xff1f; 3. 奇异值分解是什么&#xff1f; …

【图像处理实战】去除光照不均(Python)

这篇文章主要是对参考文章里面实现一种小拓展&#xff1a; 可处理彩色图片&#xff08;通过对 HSV 的 V 通道进行处理&#xff09;本来想将嵌套循环改成矩阵运算的&#xff0c;但是太麻烦了&#xff0c;而且代码也不好理解&#xff0c;所以放弃了。 代码 import cv2 import …

Python 获取字典中的值(八种方法)

Python 字典(dictionary)是一种可变容器模型&#xff0c;可以存储任意数量的任意类型的数据。字典通常用于存储键值对&#xff0c;每个元素由一个键&#xff08;key&#xff09;和一个值(value&#xff09;组成&#xff0c;键和值之间用冒号分隔。 以下是 Python 字典取值的几…

数据结构-线性表的链式表示

目录 前言一、线性表的链式表示和实现1.1 线性表的表示1.2 基本操作的实现1.3 线性表的链式表示的优缺点 总结 前言 本篇文章主要介绍线性表的链式表示 一、线性表的链式表示和实现 1.1 线性表的表示 线性表的链式表示又称为链式存储结构或链式映像 链式存储定义&#xff1…

MATLAB将两个折线图画在一个图里

界面如图 输入行数和列数&#xff0c;点击开始填入数据&#xff0c;其中第一列为x值&#xff0c;后面几列&#xff0c;每一列都是y坐标值&#xff0c;填好后点击画在同一张图里即可。点击置零就把所有数变成0&#xff0c;另外也可以选择节点样式。 .mlapp格式的文件如下 夸克…

【MotionCap】ImportError: cannot import name ‘packaging‘ from ‘pkg_resources‘

ImportError: cannot import name ‘packaging’ from ‘pkg_resources’ 降低setuptools的版本 参考大神:(ai-mocap) zhangbin@ubuntu-server:~/proj/04_mocap/third-party$ pip install -e neural_renderer

C# 验证PDF数字签名的有效性

数字签名作为PDF文档中的重要安全机制&#xff0c;不仅能够验证文件的来源&#xff0c;还能确保文件内容在传输过程中未被篡改。然而&#xff0c;如何正确验证PDF文件的数字签名&#xff0c;是确保文件完整性和可信度的关键。本文将详细介绍如何使用免费.NET控件通过C#验证PDF签…

OpenCV 车牌检测

OpenCV 车牌检测 级联分类器算法流程车牌检测相关链接 级联分类器 假设我们需要识别汽车图像中车牌的位置&#xff0c;利用深度学习目标检测技术可以采取基于锚框的模型&#xff0c;但这需要在大量图像上训练模型。 但是&#xff0c;级联分类器可以作为预训练文件直接使用&…

C++ 106 之 list容器

#include <iostream> #include <string> using namespace std; // #include <vector> // 容器头文件 #include <algorithm> // 标准算法头文件 #include <list>void printList(const list<int> & list1){for(list<int>::const…

【ai】ubuntu18.04 找不到 nvcc --version问题

nvcc --version显示command not found问题 这个是cuda 库: windows安装了12.5 : 参考大神:解决nvcc --version显示command not found问题 原文链接:https://blog.csdn.net/Flying_sfeng/article/details/103343813 /usr/local/cuda/lib64 与 /usr/local/cuda-11.3/lib64 完…

【C++】string类的模拟实现

文章目录 string类的存储结构默认成员函数构造函数析构函数拷贝构造函数赋值重载 容量操作size()capacity()reserve()resize()clear() 遍历与访问operator[ ]迭代器范围与for 增删查改push_back()pop_back()append()operatorinsert()erase()c_str()find()substr() 非成员函数op…

VisualRules组件功能介绍-计算表格(二)

本章内容 1、计算表格数据回写数据库 2、计算表格数据更新 3、计算表格数据汇总 4、计算表格数据追加 一、计算表格数据回写数据库 计算表格数据回写数据库表。采用遍历计算表格逐条插入数据库表。在具体操作过程可以采用向导方式操作。 先在数据库表中创建tb_user_new表。…