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

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

3天内不再提示

RA8 Cortex-M85 Helium入门指南(2)

瑞萨MCU小百科 来源:瑞萨嵌入式小百科 2024-05-15 14:31 次阅读

Helium指令集

这里介绍的是Helium的汇编语言指令集,虽然大部分程序员不会直接使用这些指令,而是通过C语言或者高级语言编程实现,但是了解汇编语言指令集,可以有如下收获:

在优化C代码时,为了确定其是否被充分地矢量化,能够审视编译器的输出以及熟悉指令集是非常有帮助的。

当调试不能正常工作的代码时,通过阅读反汇编代码去理解每一行发生了什么,对于寻找代码的问题是非常有用的。

了解指令集可能有助于编写高效的代码,甚至节省功耗,尤其是在使用原语函数的情况下。

Helium指令结构和其他Cortex-M处理器中的VFP(浮点)指令结构是相似的。

Helium指令格式如下:

abc3fc8e-1284-11ef-a297-92fbcf53809c.png

Helium指令都是以字母V开始的,然后跟着如下符号,符合中的{}是可选的,<>是必须出现的:

mod:指令修饰符,可能没有,也可能是Q(saturating)饱和,H(halving)减半,D(doubling)加倍,R(rounding)四舍五入中的一个。

op:具体操作,例如ADD(相加),SUB(相减),CMP(比较)等。

shape:有些指令中,可以选择性的指定L(long)或N(narrow),这是 “形态” 相关的修饰符。

- L:Long表示输入元素在操作前会被扩宽。1个8位的元素可能会被扩宽为16位或32位,或者1个16位元素被扩宽为32位。

- N:Narrow表示输入元素在操作前会被压缩。

extra:有些指令中的特定修饰符,可能是T(top),B(bottom),A(accumulate),X(exchange)或者V(across)中的一个。

cond:此处指定的条件仅适用于VPT(Predication)模块。可能是T(Then)或者E(Else)。

.dt:数据类型,可能是F(float)浮点,I(integer)整数,S(signed)有符号,U(unsigned)无符号。

dst:目标寄存器,可以是通用寄存器(R)或者矢量寄存器(Q)。

src:源寄存器,可以是通用寄存器(R)或者矢量寄存器(Q)。

rot:旋转,用于一些操作复数的指令。

下面给出一条指令示例展示:

VLDRW.U32 Q0, [R0]

abef041a-1284-11ef-a297-92fbcf53809c.png

该指令中的首字母是V,表示这是一条Helium(或是Neon,或者浮点)指令,LDR表示寄存器从内存加载内容,W表示按字大小操作,都为空,数据类型是U32,无符号32位整数。加载的目标是128位寄存器Q0(矢量寄存器),源是标量寄存器R0指向的内存地址。该指令表示将从R0存储的地址中加载4个32位宽的数据到Q0寄存器中。

Helium指令分类如下:

ac12e772-1284-11ef-a297-92fbcf53809c.png

Helium编程方式

Helium编程方式目前来说,一共4种。

矢量库

自动矢量化

原语函数(intrinsics)编程

汇编指令编程

矢量库

目前,ARM CMSIS DSP和NN是已经对Helium优化好的Helium矢量库。使用矢量库来进行Helium编程,是最简单的方法。

CMSIS DSP是数字信号处理函数库,具有针对8位整数,16位整数,32位整数和32位浮点数的不同函数,提供了丰富的函数,包括基本数学函数,复数数学函数,滤波器函数,变换函数,矩阵操作函数,电机控制函数,插值函数,统计函数等。该库包含了这些函数的Helium优化版本,并不断更新迭代中。

CMSIS NN是神经网络函数库,以最小的内存开销针对Cortex-M处理器优化的软件内核,同样地,这些函数也可以利用Helium得到最优性能。

CMSIS矢量库中的函数代码有3个C预处理器定义来选择Helium版本。

#define ARM_MATH_HELIUM
#define ARM_MATH_MVEI    //支持整型Helium
#define ARM_MATH_MVEF    //支持浮点型Helium

比如CMSIS DSP中的 arm_clip_f32函数,可以看到该函数已经使用了Helium原语函数。

ac23090e-1284-11ef-a297-92fbcf53809c.png

比如CMSIS NN中的arm_nn_lstm_update_cell_state_s16函数,可以看到该函数使用了Helium原语函数。

ac6828fe-1284-11ef-a297-92fbcf53809c.png

当使用矢量库的时候,不同编译器中的MVE设置

Keil MDK 5(5.38以上版本)

在图标acc11d7e-1284-11ef-a297-92fbcf53809c.png“Options for target”中选择“Target”页面中的“Vector Extensions”,通过下拉列表选择

“Not Used”(不使用helium,即宏ARM_MATH_HELIUM没有被定义,使用标量相关函数)。

“Integer”(宏ARM_MATH_HELIUM和ARM_MATH_MVEI被定义,使用整型Helium)。

“Integer + Floating Point” (宏ARM_MATH_HELIUM,ARM_MATH_MVEI和ARM_MATH_MVEF被定义,使用整型和浮点型Helium)。

ace0969a-1284-11ef-a297-92fbcf53809c.png

IAR EWARM(v9.40.1以上版本)

通过右键选择项目名称后,在 “Options”中的“General Options”页面下的“32-bit”中的“Advanced SIMD(NEON/HELIUM)”。

勾选(即选中,ARM_MATH_HELIUM,ARM_MATH_MVEI和ARM_MATH_MVEF被定义,使用整型和浮点型Helium)。

不勾选(即不选中),编译的时候会报“MVE support not enable”错误。

e2 studio

e2 studio中可以使用LLVM或者GCC工具链,在使用矢量库的时候,不需要设置,默认是启用的。如果通过设置编译参数来禁用,编译的时候会报“MVE support not enable”错误。

自动矢量化

自动矢量化就是编译器在C/C++代码中自动检测到可以使用Helium指令并执行优化的过程。优化后的代码在速度和尺寸方面可能与手工优化的汇编代码或包含原语函数的C代码一样高效,这只需要很少的时间去编写和调试代码,而且无须对目标微架构有详细了解。C代码也更有可移植性。

如下面的代码,这是一种很常见的普通写法,一个for循环里面做一些逻辑判断处理。

ad3d3968-1284-11ef-a297-92fbcf53809c.png

点击可查看大图

通过使用自动矢量化后的反汇编代码如下,红色框部分的代码里面已经出现了Helium的汇编指令。

ad4d4aec-1284-11ef-a297-92fbcf53809c.png

自动矢量化和编译器的优化等级设置有关,当Arm Complier 6和LLVM编译器的优化等级为-O2或者更高时,自动矢量化默认使能,在MDK ArmComplier 6中可以使用“-fno-vectorize”选项可以禁止自动矢量化。当优化等级为-O1时,自动矢量化默认禁止,使用“-fvectorize”选项可以使能自动矢量化,当优化等级为-O0时,自动矢量化总是被禁止。其他编译器的行为可能不同,具体可以查阅对应的文档。

原语函数(intrinsics)编程

原语函数是允许利用Helium而不必直接编写汇编代码的一组C/C++函数。ACLE文档中包括Helium原语规范。目前最新的文档为mve-2021Q4。原语函数的实现包含在arm_mve.h文件中。函数包含简短的汇编语言部分,它们被内联到调用的代码中。

使用原语函数有如下优点:

程序员能够直接访问Helium指令集,这允许编写充分优化的代码,利用所有Helium特性。

C/C++可用于大多数代码,只有当需要优化而矢量化C编译器无法执行优化时,才会使用Helium原语。这就意味着只有在必要时才使用底层代码。

相比于采用汇编语言编写的代码,含有Helium原语的C和C++代码可以移植到一个新的平台,仅需要少量修改,甚至无须修改。

使用原语避免了很多与直接使用汇编语言编码相关的难点。

原语函数中,Helium矢量数据类型名字模式如下所示,这在“arm_mve.h”中有详细定义和描述。

x_t

type:元素类型,可能是int整形,uint无符号整形,float浮点。

size:元素大小,可能是8位,16位,32位。

number_of_lanes:通道总数。可以是16通道,8通道,或者4通道。

如:

uint8x16_t是一个描述16个无符号8位的矢量。

int16x8_t是一个描述8个16位的矢量。

float16x8_t是一个描述4个16位浮点数(半精度)的矢量。

float32x4_t是一个描述4个32位浮点数(单精度)的矢量。

注:Helium是128位寄存器,它的元素大小和通道总数相乘的结果只能是128,不能是64,也就是说,不支持int8x8_t/uint8x8_t/int16x4_t/uint16x4_t/float16x4_t/float32x2_t数据类型。这点和Neon是不同的。Neno可以支持64和128。

Helium矢量数组结构体类型如下:

xx_t

可以发现,矢量数组结构体名字只比单个矢量数据类型多了一个length_of_array。它表示一共有几个helium寄存器组成,即helium寄存器的数量。在该结构体中,包含一个名为val的元素,此结构体类型映射Helium加载和存储操作访问的寄存器,Helium可以用一条指令加载/存储多达4个寄存器。结构定义示例如下:

struct int16x8x2_t

{

int16x8_t val[2];

};

此结构类型仅由加载、存储、转置、交织和去交织指令使用;要对实际数据执行操作,请从各个寄存器中选择元素。如:.val[0] 和.val[1]。

下图代码片段是使用原语函数进行矢量相乘的例子。

ad734c92-1284-11ef-a297-92fbcf53809c.png

原语编程里面还涉及原语预测,原语尾部处理等知识,本处不在展开说明,详细信息可以访问arm官网查阅相关文档了解和学习。

汇编语言编程

在汇编代码中直接编写Helium指令是很没有必要的,通常只会在特殊的场景下才会这样做。即当编程人员可以比编译器更好地分配寄存器时,比如有太多重写变量和输入输出变量。

下图所示为复数矢量点积的汇编语言代码。

ada6b50a-1284-11ef-a297-92fbcf53809c.png


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

    关注

    68

    文章

    18443

    浏览量

    222972
  • 电机控制
    +关注

    关注

    3474

    文章

    1716

    浏览量

    264920
  • C语言
    +关注

    关注

    180

    文章

    7539

    浏览量

    130453
  • LDR
    LDR
    +关注

    关注

    0

    文章

    93

    浏览量

    7465
  • Cortex-M85
    +关注

    关注

    0

    文章

    13

    浏览量

    495

原文标题:RA8 Cortex-M85 Helium入门指南(2)

文章出处:【微信号:瑞萨MCU小百科,微信公众号:瑞萨MCU小百科】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    RA8 Cortex-M85 Helium技术入门指南(1)

    瑞萨电子在2023年10月底推出强大的RA8系列MCU,具备突破性的3000 CoreMark,并可满足客户应用所需的完全确定性、低延迟及实时操作要求。
    的头像 发表于 05-14 14:30 324次阅读
    <b class='flag-5'>RA8</b> <b class='flag-5'>Cortex-M85</b> <b class='flag-5'>Helium</b>技术<b class='flag-5'>入门</b><b class='flag-5'>指南</b>(1)

    【Vision Board创客营连载体验】RA8D1 Vision Board初体验

    1 RA8D1 Vision Board简介 Vision-Board 开发板是 RT-Thread 推出基于瑞萨 Cortex-M85 架构 RA8D1 芯片,拥有Helium和Tr
    发表于 04-23 21:53

    Arm Cortex-M处理器—Cortex-M85介绍

    Arm发布了新一代的Cortex-M处理器,Cortex-M85。简单粗暴的打个比方:Cortex-M85Cortex-M7TrustZoneHelium(
    发表于 07-15 14:59

    Arm Cortex-M85在安全设计上除了*** 还有哪些提升吗?

    Arm Cortex-M85在安全设计上除了*** 还有哪些提升吗?
    发表于 09-20 14:46

    请问一下Arm Cortex-M85性能的提升是对总线进行了优化吗?

    请问一下Arm Cortex-M85性能的提升是对总线进行了优化吗?
    发表于 09-21 11:28

    请问Arm Cortex-M85内核相对于M7内核有哪些提升

    请问Arm Cortex-M85内核相对于M7内核有哪些提升?有没有哪位大神科普一下
    发表于 09-22 10:37

    IAR为瑞萨RA8系列MCU开发提供支持

    嵌入式开发软件和服务的全球领导者IAR今日宣布,其最新发布的IAR Embedded Workbench for Arm 9.40.2版本中无缝集成了对瑞萨(Renesas)RA8系列MCU的支持,为基于Arm Cortex-M85R
    的头像 发表于 11-02 17:08 702次阅读

    业界首款基于Arm Cortex-M85的超高性能MCU

    瑞萨电子重磅发布了业界首款基于Arm Cortex-M85处理器的全新超高性能MCU:RA8M1系列微处理器。 RA8系列产品具备业界卓越的6.39 CoreMark/MHz测试分数,缩小了MCU与MPU之间的性能差距。
    发表于 11-10 09:44 294次阅读

    新品发布 | 瑞萨推出面向图形显示应用和语音/视觉多模态AI应用的全新RA8 MCU产品群

    的各类图形显示和语音/视觉多模态AI要求。 所有RA8系列MCU均利用Arm Cortex-M85处理器和Arm的Helium 技术所带来的高性能
    的头像 发表于 12-15 16:00 387次阅读
    新品发布 | 瑞萨推出面向图形显示应用和语音/视觉多模态AI应用的全新<b class='flag-5'>RA8</b> MCU产品群

    瑞萨电子推出全新RA MCU家族产品RA8

    瑞萨电子推出的全新RA MCU家族产品RA8,是业界首款搭载Arm Cortex-M85内核超高性能MCU,可满足工业自动化、家电、智能家居、消费电子、楼宇/家庭自动化、医疗和AI领域的各种计算密集型应用。
    的头像 发表于 12-20 12:25 559次阅读
    瑞萨电子推出全新<b class='flag-5'>RA</b> MCU家族产品<b class='flag-5'>RA8</b>

    AMEYA360 | 皇华:瑞萨面向电机控制应用推出性能卓越的RA8 MCU

    AMEYA360 | 皇华:瑞萨面向电机控制应用推出性能卓越的RA8 MCU:全球半导体解决方案供应商 瑞萨 电子今日宣布推出基于Arm® Cortex®-M85处理器的RA8T1微控
    的头像 发表于 02-02 16:02 259次阅读

    瑞萨电子发布业界首款基于Cortex-M85处理器的全新超高性能MCU

    去年10月,瑞萨电子重磅发布了业界首款基于Cortex-M85处理器的全新超高性能MCU:RA8M1系列微处理器。 今年,瑞萨将举办RA8巡回技术研讨会。
    的头像 发表于 02-26 10:27 271次阅读
    瑞萨电子发布业界首款基于<b class='flag-5'>Cortex-M85</b>处理器的全新超高性能MCU

    Cortex-M85内核单片机如何快速上手

    2022年4月,Arm推出了全新的MCU级内核Cortex-M85。截止目前(2024年2月),Cortex-M85是最新、最强的Cortex-M内核。
    发表于 02-29 09:35 268次阅读
    <b class='flag-5'>Cortex-M85</b>内核单片机如何快速上手

    瑞萨电子RA家族推出RA8系列高算力通用MCU

    瑞萨电子RA家族推出RA8系列高算力通用MCU,是业界首款基于Arm® Cortex®-M85(CM85)内核的32位MCU,主频高达480
    的头像 发表于 04-02 14:14 383次阅读
    瑞萨电子<b class='flag-5'>RA</b>家族推出<b class='flag-5'>RA8</b>系列高算力通用MCU

    RA8 Cortex-M85 Helium入门指南(3)

    我们将通过一个RGBA图像数据中的R(红色),G(绿色),B(蓝色)3种色彩通道数据分离的例子,介绍使用helium原语函数的解交织(deinterleaving)功能。
    的头像 发表于 05-16 14:33 94次阅读
    <b class='flag-5'>RA8</b> <b class='flag-5'>Cortex-M85</b> <b class='flag-5'>Helium</b><b class='flag-5'>入门</b><b class='flag-5'>指南</b>(3)