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

    文章

    9027

    浏览量

    366448
  • 寄存器
    +关注

    关注

    31

    文章

    5292

    浏览量

    119802
  • 机器学习
    +关注

    关注

    66

    文章

    8347

    浏览量

    132294

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

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

收藏 人收藏

    评论

    相关推荐

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

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

    寄存器的类型和作用

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

    寄存器故障分析

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

    寄存器是什么意思?寄存器是如何构成的?

    在计算机科学中,寄存器(Register)是一个高速存储单元,它位于中央处理(CPU)内部,用于存储计算机程序执行过程中所需要的数据、指令地址或状态信息。寄存器是计算机体系结构中至关重要的组成部分,对计算机的运算速度和性能有着
    的头像 发表于 08-02 18:23 2895次阅读
    <b class='flag-5'>寄存器</b>是什么意思?<b class='flag-5'>寄存器</b>是如何构成的?

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

    寄存器寻址和直接寻址是计算机指令系统中的两种基本寻址方式。它们在指令的执行过程中起着至关重要的作用,决定了指令操作数的来源和目标。下面我们将介绍这两种寻址方式的特点、区别以及在实际应用中的优缺点
    的头像 发表于 07-12 10:42 1145次阅读

    寄存器寻址的实现方式

    在计算机体系结构中,寄存器寻址是一种常见的寻址方式,它允许程序直接访问CPU内部的寄存器寄存器寻址可以提高程序的执行效率,因为它避免了对内存的访问。 寄存器寻址的基本概念
    的头像 发表于 07-12 10:36 504次阅读

    寄存器分为基本寄存器和什么两种

    寄存器是计算机中用于存储数据的高速存储单元,它们是CPU内部的重要组成部分。寄存器可以分为基本寄存器和扩展寄存器两种类型。 一、基本寄存器
    的头像 发表于 07-12 10:31 1005次阅读

    干货满满:ARM的内核寄存器讲解

    内核寄存器与外设寄存器: 内核寄存器与外设寄存器是完全不同的概念。内核寄存器是指 CPU 内部的寄存器
    发表于 04-17 11:47 2723次阅读
    干货满满:ARM的内核<b class='flag-5'>寄存器</b>讲解

    寄存器属于时序逻辑电路吗 寄存器是什么逻辑电路

    寄存器是一种用来存储数据的数字电路组件。它可以存储一个或多个位的二进制,并且能够在时钟信号的控制下将数据从输入端复制到输出端。寄存器通常用于存储和操作计算机系统中的数据,是计算机的基本组
    的头像 发表于 02-18 09:37 1394次阅读

    CPU的6个主要寄存器

    CPU寄存器是中央处理内的组成部分,是有限存贮容量的高速存贮部件。寄存器是CPU内部的元件,包括通用寄存器、专用寄存器和控制
    的头像 发表于 02-03 15:15 3687次阅读

    移位寄存器可降低LED设计的尺寸和成本

    在使用 LED 的设计中,移位寄存器非常有用。例如,如果系统包括七段显示、单个指示或形成网格或面板的 LED 阵列,则可以使用标准 8 位移位寄存器来允许低引脚
    发表于 01-30 15:14 535次阅读
    移位<b class='flag-5'>寄存器</b>可降低LED设计的尺寸和成本

    移位寄存器的工作原理 移位寄存器左移和右移怎么算

    移位寄存器是一种用于在数字电路中实现数据移位操作的基本电路元件。它由多个触发以及相关控制电路组成,具有存储、接受和移动数据的功能。移位寄存器可以分为两种类型:串行移位寄存器和并行移位
    的头像 发表于 01-18 10:52 6871次阅读

    寄存器阵列低功耗设计方案

    寄存器写操作的时候会改变寄存器内容,需要时钟锁入新的数据。但是,对寄存器进行读操作的时候,寄存器内容不改变,寄存器不需要时钟。这个特点工具是
    的头像 发表于 12-08 11:19 562次阅读
    <b class='flag-5'>寄存器</b>阵列低功耗设计方案

    寄存器查看的功能和使用

    对于搞嵌入式底层开发的软件或者硬件工程师来说,经常会涉及到查看芯片手册,比如某个芯片的串口控制寄存器值,需要知道这个值对应寄存器的哪些位,微软计算的程序员模式虽然可以查看
    的头像 发表于 11-28 12:26 1763次阅读
    <b class='flag-5'>寄存器</b>查看<b class='flag-5'>器</b>的功能和使用

    UVM寄存器模型的常规方法有哪些呢?

    在应用寄存器模型时, 除了利用它的寄存器信息, 还可以利用它来跟踪寄存器的值。
    的头像 发表于 11-25 09:27 1673次阅读
    UVM<b class='flag-5'>寄存器</b>模型的常规方法有哪些呢?