0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

数独、寄存器和相信的力量

Arm社区 ? 来源:Arm ? 2023-12-29 16:40 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

人工智能 (AI) 下沉到各式各样的应用当中,作为市场上最大量的物联网设备也将被赋予智能性。ArmHelium 技术正是为基于Arm Cortex-M 处理器的设备带来关键机器学习数字信号处理的性能提升。

在上周的 Helium 技术讲堂中,大家了解了 Helium 技术的核心“节拍式”执行。今天,我们将共同探讨一些复杂而又有趣的交错加载/存储指令。若您想要了解如何高效利用 Helium,千万别错过文末视频,通过 Arm 技术专家的实例演示,详解 Helium 如何为端点设备引入更多智能。

Arm Helium 技术诞生的由来

数独、寄存器和相信的力量

DSP 处理中一个重要部分就是对不同的数据格式进行高效处理,这些数据格式通常需要转换成不同的排列方式进行计算。图像数据就是一个很好的例子,它通常以红、绿、蓝和 alpha 像素值交错流的形式被存储。但是,为了将计算矢量化,就需要将所有红色像素放在一个矢量中,绿色像素放在另一个矢量中,以此类推。在 Neon 架构中,VLD4/VST4 指令可以执行这种转换,如下图所示。

9b2eabce-a625-11ee-8b88-92fbcf53809c.png

VST4 将四个 128 位寄存器交错排列,共存储 512 位数据。Neon 架构有多种交织/去交织运算,可支持不同的格式。例如,提供的 VST2 可用于交织立体声音频的左右声道。这些指令还支持从 8 到 32 位不等的元素大小。

MVE 的“节拍式”执行的主要优点之一,是它允许内存和 ALU 运算重叠,即使在单发射处理器上也是如此。如下图所示,基于此技术要实现性能的翻倍,所有指令必须执行相同的工作量。

9b4499f2-a625-11ee-8b88-92fbcf53809c.png

显而易见,重叠带来的性能提升会因 VST4 这样的宽存储指令而大打折扣。MVE 提供的解决方案是将存储空间分割成与 ALU 运算相平衡的块,每个块存储 128 位数据。MVE 允许由 VST40、VST41、VST42 和 VST43 这四条指令构成四路交织。但到此并未结束,仍有不少问题存在:

显而易见的拆分方法是让四条指令分别存储不同的数据流(例如 VST40 存储所有红色像素,VST41 存储绿色像素等)。对于 8 位像素数据,这意味着每条指令将存储 16 个非连续字节。这种访问模式对内存子系统来说非常复杂,会导致大量停滞。相反,指令需要生成大块连续请求。

要正确配合其他矢量指令,必须将寄存器文件端口设置为访问寄存器文件的行(即整个矢量寄存器),而不是列(即四个寄存器的第一个字节),如果要将数据交织存储到连续内存块中,则需要访问列。

为了避免我在上一篇内容中描述的时间跨越问题,我们需要将指令分成几个“节拍”,先读取寄存器的 [63:0] 位,然后在下一个周期读取 [127:64] 位。

解决方案必须同时适用于两路交织和四路交织,以及 8、16 和 32 位数据运算。

面对所有这些相互矛盾的限制,我们就像掉进了兔子洞,我不禁想起了《爱丽丝梦游仙境》中的情节:

爱丽丝:这是不可能的。

疯帽匠:只要你相信,一切皆有可能。

所以,让我们暂且放下怀疑的态度,仔细研究一下读取端口,看看会发生什么。

9b78b228-a625-11ee-8b88-92fbcf53809c.png

MVE 重复使用浮点寄存器文件,因此矢量寄存器(Q0 至 Q7)由每四个一组的若干组 “S” 寄存器组成。每个列多路复用器选择相同的行,然后将数据合并以访问整个 Q 寄存器(见上图)。但是,如果不能从一列中的任何寄存器中选择,而是将端口扭曲,从交替列中的寄存器中选择,如下图所示,会如何呢:

9b8268a4-a625-11ee-8b88-92fbcf53809c.png

如果 8:1 多路复用器上的控制输入设置为相同值,则可读取一行数据(例如 S0 和 S1)。但是,如果使用不同的值,则可以读取一列中的一对值(如 S0 和 S4)。现在看起来似乎可行,我们能够从列和行中读取数据。如果我们把图的下面放大,并将寄存器编号替换为它们所连接的多路复用器的编号,就会得到下图结果:

9b97d766-a625-11ee-8b88-92fbcf53809c.png

这类似于一道简单的数独谜题,在重复矩阵的每一行和每一列中,每个数字只会出现一次,只不过这个矩阵是 2 x 2 的,而不是平常的 9 x 9。由于只能从一列中读取两个值,并且只能处理 32 位值(多路复用器的宽度),因此这种模式只能提供两路交织的解决方案。由于我们需要一种可处理所有交错模式和数据宽度组合的模式,因此可想象将所有组合垂直堆叠起来,得到一个多分辨率的三维数独谜题。解决一层谜题轻而易举,但解决整个三维谜题的过程一定令人叹为观止。此外,我们还需要考虑上文提到的其他限制因素,如连续内存访问,以及在不同周期内拆分对寄存器上下 64 位的访问。

经过一番思索,我意识到可以将问题一分为二:一是确定一种可在单个统一的问题空间中表示全部约束的方法,二是解决这些约束的单调任务。由于该模式类似于一个非常复杂的数独问题,而许多数独程序都是基于 SAT 解算器的,因此我产生了使用 SAT 解算器来完成单调约束求解任务的想法。经过努力,我想出了一种能表示所有约束的方法,一番调试后,第一个可行的解决方案诞生了。虽然它不完善,而且会导致多路复用器的控制逻辑难以实施,但至少胜利在望了。由于不想对解决方案进行手动清理,我们添加了一些额外的约束条件,引入了一些对称性,并产出了最终的解决方案,它竟然是一对双嵌套四重螺旋结构:

9babc2e4-a625-11ee-8b88-92fbcf53809c.png

为了让大家看到嵌套的螺旋线,我在下图中标注了单个多路复用器的路径。如图所示,路径每行交替通过 32 位 “S” 寄存器(如左图所示),每两行交换通过 “S” 寄存器上下两半 16 位区域(如右图所示)。

9bc37560-a625-11ee-8b88-92fbcf53809c.png

直觉告诉我,这种扭曲的方法对于三路交织来说是行不通的,经证实我是对的,SAT 解算器正式证明无解。

这种扭曲方法意味着可以同时访问寄存器文件行和列中的数据。但问题在于,读取端口返回的字节可能顺序有误,而顺序取决于访问的寄存器。要纠正此情况,就需要使用一个交叉多路复用器,将一切交换回正确的位置。由于如 VREV 等其他指令和复数原生操作指令会用到交叉多路复用器,所以我们正好能免费使用它。这正印证了那句话:“如果你必须使用一个硬件,请物尽其用。”

下图显示了由读取端口扭曲模式衍生出的一些指令访问模式。第一种情况 (VST2n.S32) 显示从矢量寄存器 Q0 和 Q1 读取 32 位 (S32),并将其两路交织(如左右音频通道)。图中颜色代表两条指令分别读取的寄存器部分(即 VST20 读取橙色部分),元素中的文字表示内存中存储的字节偏移。

9bd50596-a625-11ee-8b88-92fbcf53809c.png

可以发现,上述 S8 和 S16 模式都将相同的数据放在寄存器的相同颜色区域内;唯一不同的是每节中字节的排列方式。这意味着,只需在交叉多路复用器中使用不同的配置,16 位模式也能支持 8 位。这些模式也适用于加载指令所使用的写入端口。除了可以建立寄存器文件端口外,这些模式还意味着内存访问始终是一对 64 位的连续块,这样可以提高内存访问的效率。另外,这些数据块地址的第 [3] 位总是不同的,因此可以在拥有两组交织 64 位内存的系统上并行发送。

研究团队从这些指令中积累了两条重要的经验。首先,要想在 gate 数量和效率方面取得突破式进展,就必须在设计架构的同时对微架构的细节同步思考设计。其次,要保持信念,相信一切皆有可能。

您是否想要更深入了解 Helium 技术?由 Arm 物联网事业部技术管理总监 Mark Quartermain 与 Arm 物联网事业部嵌入式工具集成高级经理 Matthias Hertel 共同为大家录制了 Helium 技术视频,通过实例演示详解如何高效利用 Helium。

我们将在下一篇 Helium 文章中继续探讨以内存访问为主题的相关内容,并介绍一些实现循环缓冲的技术知识。持续关注 Helium 技术讲堂,我们下期再见!

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • ARM
    ARM
    +关注

    关注

    134

    文章

    9395

    浏览量

    379951
  • 寄存器
    +关注

    关注

    31

    文章

    5447

    浏览量

    125441
  • 机器学习
    +关注

    关注

    66

    文章

    8514

    浏览量

    135117

原文标题:Helium 技术讲堂 | 数独、寄存器和相信的力量

文章出处:【微信号:Arm社区,微信公众号:Arm社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    使用寄存器点亮LED灯

    学习本章时,配合以上芯片手册中的“19. I/O Ports”章节一起阅读,效果会更佳,特别是涉及到寄存器说明的部分。本章内容涉及到较多寄存器方面的深入内容,对于初学者而言这些内容丰富也较难理解,但非常有必要细读研究、夯实基础。
    的头像 发表于 05-28 17:37 ?745次阅读
    使用<b class='flag-5'>寄存器</b>点亮LED灯

    TPS80032寄存器手册

    电子发烧友网站提供《TPS80032寄存器手册.pdf》资料免费下载
    发表于 12-21 09:08 ?0次下载
    TPS80032<b class='flag-5'>寄存器</b>手册

    LMX2820寄存器映射

    电子发烧友网站提供《LMX2820寄存器映射.pdf》资料免费下载
    发表于 11-26 15:18 ?11次下载
    LMX2820<b class='flag-5'>寄存器</b>映射

    Modbus协议的读取保持寄存器

    功能码用于读取从设备保持寄存器的内容,不支持广播模式。消息顿中指定了需要读取的保持寄存器的起始地址和数目。而保持寄存器中各地址的具体内容和意义则由设备开发者自行规定。
    的头像 发表于 10-30 10:54 ?4302次阅读

    详解寄存器模型镜像值

    DUT的配置寄存器的值是实际值,reg_model有镜像值、期望值的概念。
    的头像 发表于 10-23 09:43 ?1168次阅读
    详解<b class='flag-5'>寄存器</b>模型镜像值

    接口的控制与状态寄存器什么作用

    接口的控制与状态寄存器(Control and Status Registers,简称CSR)是计算机系统中用于控制和监控硬件设备操作的寄存器。它们是硬件设备与其驱动程序之间的桥梁,允许软件控制硬件
    的头像 发表于 10-17 10:42 ?1678次阅读

    什么是寄存器移位寻址

    寄存器移位寻址是一种特定的寻址方式,主要出现在某些处理架构中,如ARM指令集。这种寻址方式在处理数据移动和操作时提供了极大的灵活性和效率。下面将从定义、工作原理、特点、应用场景以及与其他寻址方式的对比等方面对寄存器移位寻址进行
    的头像 发表于 10-05 17:38 ?1156次阅读

    寄存器间接寻址和寄存器寻址的区别

    寄存器间接寻址和寄存器寻址是计算机体系结构中两种重要的寻址方式,它们在指令执行过程中起着关键作用。下面将从定义、原理、特点、应用场景以及区别等方面对这两种寻址方式进行详细阐述。
    的头像 发表于 10-05 17:13 ?3809次阅读

    微处理寄存器的作用

    微处理中的寄存器是计算机体系结构中的核心组成部分,它们扮演着至关重要的角色。寄存器是一种高速的存储单元,用于暂时存储数据、指令和地址等信息,以便微处理能够快速地访问和处理这些数据。
    的头像 发表于 10-05 15:07 ?1387次阅读

    ARM寄存器的分类及功能

    ARM寄存器是ARM处理内部的重要组成部分,它们在处理的运算、控制以及数据存储等方面发挥着至关重要的作用。下面,我们将从ARM寄存器的定义、结构、分类以及功能等多个方面进行详细阐述
    的头像 发表于 09-05 14:18 ?3173次阅读

    通用寄存器是什么意思

    在计算机体系结构中,通用寄存器是中央处理(CPU)内部最为核心和基础的组成部分之一。它们被设计为能够存储和传输各种类型的数据和指令,是CPU进行数据处理和运算的关键工具。通用寄存器不仅在程序的执行过程中起着至关重要的作用,还直
    的头像 发表于 09-05 14:13 ?2545次阅读

    寄存器的类型和作用

    在计算机科学中,寄存器(Register)是一种高速存储单元,它位于CPU内部,与CPU的运算单元和逻辑控制单元紧密相连。寄存器的主要作用是暂时存储指令、操作数和地址等临时数据,以便CPU快速访问和处理。由于寄存器直接集成在CP
    的头像 发表于 09-05 14:11 ?5117次阅读

    寄存器的输入输出方式

    寄存器的输入输出方式是数字电路设计中至关重要的部分,它决定了数据如何在寄存器中进出以及处理的效率。下面将详细探讨寄存器的几种主要输入输出方式,包括并行输入输出、串行输入输出以及双向输入输出,并会扩展到移位
    的头像 发表于 09-05 14:09 ?2756次阅读

    数字寄存器的原理和使用

    数字寄存器是计算机体系结构中至关重要的组成部分,其原理和使用对于理解计算机的工作原理和数据存储方式具有重要意义。
    的头像 发表于 09-05 14:08 ?1497次阅读

    寄存器故障分析

    寄存器故障分析是计算机硬件维护与系统稳定性保障中的重要环节。寄存器作为计算机中的关键组成部分,负责存储和传输数据,其稳定性和可靠性直接影响到整个计算机系统的性能。以下是对寄存器故障的全面分析,包括故障类型、故障现象、故障原因及诊
    的头像 发表于 08-29 11:26 ?2366次阅读