性能优化-高通的Hexagon DSP和NPU

news2024/11/25 16:27:50

原文来自【  Qualcomm’s Hexagon DSP, and now, NPU 】

本文主要介绍Qualcomm Hexagon DSP和NPU,这些为处理简单大量运算而设计的硬件。

🎬个人简介:一个全栈工程师的升级之路!
📋个人专栏:高性能(HPC)开发基础教程
🎀CSDN主页 发狂的小花
🌄人生秘诀:学习的本质就是极致重复!

目录

一、前言

二、High Level

三、Frontend

四、Fetch and Decode

五、Scalar Integer Execution

六、Vector Execution (HVX)

七、Tensor

八、Final Words

九、参考


一、前言

手机必须处理电信和视听处理,同时最大限度地延长电池寿命。数字信号处理器 (DSP) 使用专用硬件从 CPU 卸载这些任务,从而降低功耗。

高通公司的 Hexagon 在公司 Snapdragon 产品中卸载信号处理方面有着悠久的历史。为了应对近期机器学习应用的兴起,高通正在为 Hexagon 添加矩阵乘法功能。

二、High Level

Hexagon 是一款有序、四宽超长指令字 (VLIW) 处理器,具有专门的信号处理功能。它使用 SMT 来利用线程级并行性并隐藏延迟。Hexagon 的矢量和张量单元使用协处理器模型,能够提供大量的每时钟吞吐量。

Hexagon 就像 CPU 一样支持虚拟内存和缓存,并且可以运行编译后的 C 代码。但是,它具有不同的执行模型,其中指令首先提交然后执行。该模型支持深度执行管道,但缺点是某些异常只能在提交后捕获,因此不精确。

在 Snapdragon 8 Gen 2 中,Hexagon 具有 6 路 SMT。因此,高通的 DSP 介于每个 SMSP/SIMD 具有 12/16 线程的 GPU 和很少超出 2 路 SMT 的 CPU 之间。默认情况下,每个 Hexagon 线程都会获取一个标量上下文,但必须请求访问才能使用向量或张量协处理器。

三、Frontend

分支预测通常与高性能 CPU 相关。然而,高通公司认为为 Hexagon 实现分支预测器是合适的,BTB 和返回堆栈命中的性能监控事件就证明了这一点。事件描述表明大多数分支可以通过两个周期的延迟来处理,不太常见的是 3 个周期的延迟。在 3 个周期的情况下,BTB 可能没有为分支缓存的目标,并且解码器计算目标地址。如果是这样,指令缓存将有 3 个周期的延迟。

方向预测可能是通过简单的双峰计数器提供的,其机制类似于原始奔腾。即使是一个简单的分支预测器也比没有预测器好,这使得 Hexagon 能够在不过度依赖线程级并行性的情况下表现良好。

四、Fetch and Decode

一旦分支预测器提供了目标地址,Hexagon 就会从指令缓存中获取 128 位 VLIW 包。高通没有指定 Hexagon 的指令缓存大小,但之前的版本有 16 KB。如果 Hexagon 保持相同的指令缓存大小,我不会感到惊讶,因为吞吐量受限的应用程序往往具有较小的指令占用空间。

每个 VLIW 捆绑包(bundle)最多包含四个指令,这让我想知道为什么高通选择“Hexagon”名称。“Qualcomm Quadrilateral”会更有意义,听起来也更好。VLIW 捆绑包允许使用简单的硬件进行超标量执行。解码器很便宜,因为特定的 VLIW 位置仅包含指令的子集。硬件先读后写和先写后写危险解决方案是不必要的,因为打包到 VLIW 包中的指令必须是独立的,并且不能写入相同的目标寄存器。执行管道选择逻辑也被简化,因为每个VLIW包位置对应于一个执行管道。

指令被获取和解码后,它们被发送到适当的单元或协处理器来执行。

五、Scalar Integer Execution

Hexagon 有一个 32 位标量单元,每个线程上下文有 32 个寄存器。与 AMD GCN 或 RDNA 上的标量单元主要从向量单元卸载控制流和地址生成操作不同,Hexagon 的标量单元非常强大,可以自行处理轻量级 DSP 任务。由于采用 VLIW 封装,每个周期最多可以完成 4 条指令,并且每条指令都可以代表大量工作。H.264 解码有针对绝对差和 (SAD)、位域操作和上下文自适应二进制算术编码 (CABAC) 的专用指令。“标量”单元甚至可以进行向量运算。字节或半字(16 位)元素可以打包到 32 位寄存器中。相邻的 32 位寄存器可以作为 64 位寄存器进行寻址,从而允许更长的向量宽度操作,包括 2 x 32 位寄存器。标量单元的两个管道也可以处理浮点运算。它类似于 Intel 的 MMX,只不过向量寄存器是通用寄存器的别名。

硬件循环和循环缓冲区处理有助于提高指令密度和寄存器利用率。两对循环启动和循环计数寄存器提供硬件循环支持,从而释放通用寄存器来保存其他数据。硬件循环可以辅助分支预测器,但对于迭代次数为 2 或更少的小循环,仍然可能会发生错误预测。循环缓冲区也获得硬件支持。CS0 和 CS1 寄存器存储缓冲区基址,缓冲区长度存储在 M0 或 M1 寄存器中。然后,程序可以使用循环缓冲区,而无需对每个指针增量进行边界检查。特殊的“全局指针”寄存器可以与全局指针相对寻址模式一起使用,帮助访问全局或静态数据。这些机制可以减少套准压力。

标量端内存访问由未指定大小的 L1 缓存提供服务,尽管 Hexagon 过去使用过 32 KB L1D。L1 数据缓存只有两个 64 位端口,专用于标量单元。Hexagon 的加载/存储单元通过重播解决内存依赖性、页面交叉、存储缓冲区填充和缓存组冲突等边缘情况。

L1 未命中由 L2 缓存处理。同样,高通没有给出缓存大小,但 Snapdragon 820 的 Hexagon DSP使用了 512 KB L2。较旧的 Snapdragon 800 使用 256 KB L2 1,因此高通当前的 DSP 可能具有 1 MB 或更大的 L2 。v73 PRM 指的是具有 32 个条目的 L2 记分板,因此 L2 缓存可能可以处理 32 个待处理请求。

六、Vector Execution (HVX)

Hexagon Vector Extensions为更繁重的 DSP 任务提供了更多支持。HVX 提供 32 个 1024 位向量寄存器和一组粗略映射到 VLIW 捆绑位置的执行管道。Hexagon DSP 的可用向量上下文通常少于标量上下文,因此线程必须请求 HVX 访问。Hexagon V73 PRM 给出了具有四个向量上下文的示例。四个上下文将有 16 KB 的向量寄存器。相比之下,Intel 的 Skylake-X 有 10.7 KB 的矢量寄存器来支持 AVX-512。让线程请求 HVX 功能而不是默认提供它,可以让 Hexagon 在没有 GPU 大小的寄存器文件的情况下运行,并关闭矢量协处理器以执行轻量级任务。

除了大型向量寄存器文件之外,HVX 还为每个线程提供四个 128 位谓词寄存器。谓词寄存器可以保存向量比较的结果,并且可以用作某些指令(例如条件累加)的掩码。

过去的 Hexagon 实现仅专注于向量整数运算,但高通添加了浮点功能以使 HVX 更加灵活。

由于矢量化应用程序往往会占用大量内存,因此 Qualcomm 甚至不会尝试在 L1 中缓存矢量访问。相反,向量单元使用 L2 缓存作为其第一级缓存。除了 L2 缓存外,Hexagon 还具有大型 TCM(紧耦合内存)。这是一个软件管理的暂存器,类似于 AMD GCN 的 LDS,但很大。Snapdragon 8 Gen 2 上的 Hexagon 具有 8 MB TCM。

TCM 对于 Hexagon 的高性能分散和聚集操作至关重要。聚集指令从内存中的非连续位置填充向量,而分散指令则在相反方向上执行相同的操作。分散和聚集对于缓存来说很困难,因为具有 128 字节大小元素的 1024 位向量可能需要 128 次内存访问。在集合关联高速缓存中查找行需要将地址与集合中的每个标记进行比较。从假设的 512 KB、8 路 L2 收集的最坏情况可能需要 128 * 8 = 1024 次标签比较。由于 TCM 不是缓存,因此它避免了标签检查的开销。Hexagon 甚至不会尝试在可缓存内存上执行分散和聚集操作,而仅在 TCM 上执行这些操作。

与标量侧一样,HVX 也有专门的 DSP 硬件。直方图指令有助于计算图像中亮度值的 256 箱直方图,并消耗四个 VLIW 包上的所有执行资源。其他向量指令与 AVX 上的指令类似,包括向量加法、最小/最大、绝对值和一些归约运算。

七、Tensor

HVX 在机器学习的矩阵乘法方面可以做得还过得去,但与 Nvidia、AMD 和英特尔一样,高通也看到了很多优化机会。专用矩阵乘法指令允许每条指令完成更多工作,从而降低功耗。累加器可以得到特殊处理,因为值会添加到它们中,但累加器值不会被读取太多(除了在写回内存之前进行下转换)。高通因此为Hexagon添加了张量协处理器。我很惊讶他们没有将其称为“高通矩形”,因为这就是矩阵的样子。

Hexagon 的 NPU 每个周期可以完成大量 16K 乘法累加运算,可能使用 4 位权重。相比之下,AMD Phoenix XDNA 上的 16 个 AIE-ML 块可以在每个周期以 4 位整数精度完成 8K 乘法累加运算,在 1.25 GHz 下实现 20 TOPS。XDNA 的运行时钟可能比 Hexagon 的 NPU 高得多。高通没有透露时钟目标,但我们可以通过查看前几代产品来推断这一点。

Snapdragon 855/865 的 Hexagon DSP 时钟频率为 576 MHz。如果 DSP 可以在张量单元处于活动状态时实现相同的时钟,那么它应该能够达到 18.8 TOPS,与 Phoenix 大致相当。如果 Hexagon 在张量负载下以较低的时钟运行,我也不会感到惊讶。但即使是这样,高通公司也有信心他们最新的 DSP 能够在机器学习应用中击败以前的 DSP。

八、Final Words

Hexagon 让您深入了解 DSP 的奇异世界。它位于 CPU 和 GPU 世界之间,将宽向量和张量单元与分支预测等 CPU 舒适性相结合。线程级并行能力也处于中间立场。Hexagon 使用 6 路 SMT,使其比典型的 CPU 内核具有更多的线程级并行性。但它缺乏 GPU 执行单元用来保持十几个或更多线程运行的大量寄存器文件。4 宽 VLIW 执行也旨在寻求中间立场。最近的 GPU 基本上是标量机器,偶尔具有双发射功能,而 CPU 则具有广泛的乱序执行功能。VLIW 不像乱序执行那么灵活,但可以为行为良好的代码提供更高的每线程性能。

因此,最终的处理器提供了一些 CPU 舒适性,同时仍然严重依赖指令集来简化硬件。它可能是音频解码等轻量级 DSP 任务的理想组合。这些应用程序应该具有足够的可预测性,以便 VLIW 能够表现良好,但并行性不足以证明在 GPU 上运行是合理的。有一段时间,海克斯康只需要一个“标量”单元。

随着处理需求的增长,Qualcomm 添加了 HVX 以提高 DSP 吞吐量。并非所有 DSP 任务都会受益于宽向量执行,因此让线程获取和释放 HVX 协处理器非常有意义。高通公司称图像处理是 Hexagon 的关键应用之一,而手机摄像头分辨率的提高可能证明了 HVX 的合理性。

现在,机器学习推动了高通为Hexagon添加了张量单元。与 HVX 一样,张量单元是线程必须请求访问的协处理器。高通没有提供有关寄存器文件大小的详细信息,他们的 Hot Chips 演示重点是使用不同数据类型的权衡。但张量单元的加入显示了Hexagon的可扩展性,以及高通扩大Hexagon作用的决心。

因此,高通最新的 Hexagon 型号覆盖了很大的区域。标量、矢量和张量单元使 DSP 能够处理从音频播放到图像处理再到机器学习的所有事务。然而,挖掘这种潜力将会很困难。

然而,众所周知,Hexagon DSP 很难编程。虽然 Snapdragon CPU 和 GPU 可以分别使用 OpenMP 和 OpenCL 来定位,但 DSP 不存在这样的模型。此外,DSP 是 VLIW 处理器,编写高效的代码来针对此处理范例需要 DSP 架构的特定知识。

除了没有 CPU 甚至 GPU 所享受的软件生态系统之外,Hexagon 最先进的功能还需要特定于架构的编码。分散/聚集和张量计算只能访问 TCM,不能对全局内存进行操作。软件必须承担沉重的负担并管理 TCM 和内存之间的数据移动。直方图计算和 CABAC 解码有专门的指令,但程序员可以通过内在函数或汇编来访问它们。

但如果开发人员付出必要的努力并牺牲理智,Hexagon 可以提供高每时钟吞吐量,同时避免一些 GPU 陷阱。它可能是许多手机任务的正确解决方案。

九、参考

  1. Martin Saint-Laurent et al, “A 28 nm DSP Powered by an On-Chip LDO for High-Performance and Energy-Efficient Mobile Applications”
  2. Qualcomm Hexagon V73 Programmer’s Reference Manual
  3. Qualcomm Hexagon V73 HVX Programmer’s Reference Manual
  4. Anthony Cabrera et al, “Toward Performance Portable Programming for Heteogeneous System-on-Chips: Case Study with Qualcomm Snapdragon SoC”
  5. Lucian Codrescu et al, “Hexagon DSP: An Architecture Optimized for Mobile Multimedia and Communications”

🌈我的分享也就到此结束啦🌈
如果我的分享也能对你有帮助,那就太好了!
若有不足,还请大家多多指正,我们一起学习交流!
📢未来的富豪们:点赞👍→收藏⭐→关注🔍,如果能评论下就太惊喜了!
感谢大家的观看和支持!最后,☺祝愿大家每天有钱赚!!!欢迎关注、关注!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[足式机器人]Part2 Dr. CAN学习笔记- 最优控制Optimal Control Ch07-2 动态规划 Dynamic Programming

本文仅供学习使用 本文参考: B站:DR_CAN Dr. CAN学习笔记 - 最优控制Optimal Control Ch07-2 动态规划 Dynamic Programming 1. 基本概念2. 代码详解3. 简单一维案例 1. 基本概念 Richoard Bell man 最优化理论: An optimal policy has the …

Python + Selenium —— 常用控制方法!

Selenium 体系中用来操作浏览器的 API 就是 WebDriver,WebDriver 针对多种语言都实现了一套 API,支持多种编程语言。 Selenium 通常用来做自动化测试,或者编写网络爬虫。 通常我们说的 Selenium 自动化操作,指的就是 WebDriver …

LLM:RoPE - 开源代码中的实现 (下)

本文着重学习一下开源代码中关于RoPE的实现:ChatGLM-6B、ChatGLM2-6B、LLAMA 回顾一下RoPE位置编码: 1:对于 token 序列中的每个词嵌入向量,首先计算其对应的 query 和 key 向量 2:然后对每个 token 位置都计算对应的旋转位置编码 3:接着对每个 token 位置的 query 和 …

聊聊呼声较高的向量过滤搜索及其优化

向量过滤搜索是一种基于条件的向量搜索方法,常用于推荐系统和信息检索等领域,能够帮助用户快速找到在给定条件下与其查询相关的内容。 在 Milvus 社区中,这也是呼声比较高的功能。为满足广大用户的需求,Milvus 在 Knowhere 2.x 版…

通过Stable Diffusion生成虚假的遥感影像

简介 这两天玩了一下stable diffusion,是真的好玩! 然后我在想遥感有没有相关的生成模型,找了一下,还真找到了(https://github.com/xiaoyuan1996/Stable-Diffusion-for-Remote-Sensing-Image-Generation/tree/main&a…

COT元素

论文首先定义了思维链中的两种核心元素 Bridge Object: 模型解决问题所需的核心和必须元素。例如数学问题中的数字和公式,QA问题中的实体,有点类似把论文1中pattern和symbol和在了一起,感觉定义更清晰了 Language Template:除去B…

跨平台实用软件推荐

现代工作环境下,每个人都需要高效管理时间、任务和信息流来提高生产力和实现目标。为了帮助您更有效地管理工作流程,我们为您推荐了以下几款实用的跨平台软件。 1.亿可达:是一款连接不同应用功能的超级软件连接器。它可以将不同的应用程序进行…

《WebKit 技术内幕》学习之九(1): JavaScript引擎

1 概述 1.1 JavaScript语言 说起JavaScript语言,又要讲一个典型的从弱小到壮大的奋斗史。起初,它只是一个非常不起眼的语言,用来处理非常小众的问题。所以,从设计之初,它的目标就是解决一些脚本语言的问题&#xff…

常用界面设计组件 —— 按钮组件、布局组件

2.4 按钮组件2.5 布局组件 2.4 按钮组件 QPushButton、QRadioButton 、QCheckBox都从 QAbstractButton,拥有一些共同的属性,如下图所 示: 图标使用setIcon()来设置,文本可以在构造函数或通过 setText()来设置。 可以使用 isCheck…

Spring第一天

学习目标 能够说出Spring的体系结构 能够编写IOC入门案例 能够编写DI入门案例 能够配置setter方式注入属性值 能够配置构造方式注入属性值 能够理解什么是自动装配 一、Spring简介 1 Spring课程介绍 问题导入 我们为什么要学习Spring框架? 1.1 为什么要学 Spri…

【数据结构】从顺序表到ArrayList类

文章目录 1.线性表1.1线性表的概念2.顺序表2.1顺序表的概念2.2顺序表的实现2.3接口的实现(对数组增删查改操作)3.ArrayList简介4. ArrayList使用 4.1ArrayList的构造4.2 ArrayList的方法4.3 ArrayList的遍历 1.线性表 1.1线性表的概念 线性表(linear list&#xf…

VsCode容器开发 - VsCode连接远程服务器上的docker

VsCode容器开发 - VsCode连接远程服务器上的docker 前言 之前在服务器上的Docker内开发,文件编辑起来就很不爽。不如使用VsCode直接打开远程服务器上的Docker,这样就能在VsCode里直接无缝编辑Docker里的文件了。 但是百度和必应得到的中文结果都很奇葩…

【数学笔记】集合及简要逻辑

集合 基础简要逻辑集合间的关系与运算 基础 集合定义:把一些能够确定的不同对象组成的整体叫做一个集合,每个对象叫做元素。集合记法:一般用大写字母 A , B , C . . . . . . A,B,C...... A,B,C......表示集合,小写字母 a , b ,…

Python __repr__()方法:显示属性

先看下面程序: class Item:def __init__ (self, name, price):self.name nameself.price price # 创建一个Item对象,将之赋给im变量 im Item(鼠标, 29.8) # 打印im所引用的Item对象 print(im) 上面程序创建了一个 Item 对象,然后使用 prin…

Linux中NFS服务器的搭建和安装

1.介绍: 网络文件系统即将本地系统放在网络上某一个位置的系统,基于UDP/IP使用nfs能够在不同计算机之间通过网络进行文件共享,能使使用者访问网络上其他计算机中的文件就像在访问自己的计算机一样,也就是说放在一个开发板上&#…

8.Gateway服务网关

3.Gateway服务网关 Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等响应式编程和事件流技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式…

python random.randint方法底层分析及其逆向

本文主要解释了python random模块中的randint方法的底层原理,并做了简单的逆向,能还原出所使用的随机数的部分,这在对random模块逆向的时候会有一些帮助。 文章目录 random模块底层原理概述randint分析逆向 random模块底层原理概述 python的…

C++版QT:鼠标事件

鼠标常用的事件可以说有一下几种&#xff1a;鼠标按下、鼠标移动、鼠标移动、鼠标双击和鼠标滚轮事件。 当你想使用他们&#xff0c;需要包含头文件&#xff1a;#include <QMouseEvent> 需要对鼠标事件进行处理时&#xff0c;通常要重新实现以下几个鼠标事件处理函数&a…

一文教你写出高效的软件测试用例!微信朋友圈动态发送为例

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

单元测试报Command line is too long. Shorten command line for XXXXX.XXX

文章目录 前言单元测试报Command line is too long. Shorten command line for XXXXX.XXX1. 问题原因:2. 解决方案 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的…