RA8Cortex-M85Helium入门指南(2)

原创 瑞萨MCU小百科 2024-05-15 12:02



前篇回顾

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


Helium指令集

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

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

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

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


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


Helium指令格式如下:


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] 


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


Helium指令分类如下:


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原语函数。


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


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


Keil MDK 5(5.38以上版本)


在图标“Options for target”中选择“Target”页面中的“Vector Extensions”,通过下拉列表选择

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

  • “Integer”(宏ARM_MATH_HELIUMARM_MATH_MVEI被定义,使用整型Helium)。

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


IAR EWARM(v9.40.1以上版本)


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

  • 勾选(即选中,ARM_MATH_HELIUMARM_MATH_MVEIARM_MATH_MVEF被定义,使用整型和浮点型Helium)。

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


e2 studio


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


自动矢量化

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


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

左右滑动查看完整内容

点击可查看大图


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


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


原语函数(intrinsics)编程

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


ACLE文档

https://github.com/ARM-software/acle/releases/tag/r2023Q2


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

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

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

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

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


完整的指令列表详见:

https://developer.arm.com/architectures/instruction-sets/intrinsics/


原语函数中,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]。


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


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


汇编语言编程

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


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


需要技术支持?

如您在使用瑞萨MCU/MPU产品中有任何问题,可识别下方二维码或复制网址到浏览器中打开,进入瑞萨技术论坛寻找答案或获取在线技术支持。

https://community-ja.renesas.com/zh/forums-groups/mcu-mpu/



未完待续


推荐阅读

“芯” 高度 • “芯”赋能——瑞萨电子RA8高算力MCU产品介绍

解决方案 | 瑞萨RA8D1&RA8M1产品方案分享

解决方案 | 基于RT-Thread&OpenMV的RA8人机交互方案

更多精彩,敬请关注

评论
  •  在全球能源结构加速向清洁、可再生方向转型的今天,风力发电作为一种绿色能源,已成为各国新能源发展的重要组成部分。然而,风力发电系统在复杂的环境中长时间运行,对系统的安全性、稳定性和抗干扰能力提出了极高要求。光耦(光电耦合器)作为一种电气隔离与信号传输器件,凭借其优秀的隔离保护性能和信号传输能力,已成为风力发电系统中不可或缺的关键组件。 风力发电系统对隔离与控制的需求风力发电系统中,包括发电机、变流器、变压器和控制系统等多个部分,通常工作在高压、大功率的环境中。光耦在这里扮演了
    晶台光耦 2025-01-08 16:03 75浏览
  • 「他明明跟我同梯进来,为什么就是升得比我快?」许多人都有这样的疑问:明明就战绩也不比隔壁同事差,升迁之路却比别人苦。其实,之间的差异就在于「领导力」。並非必须当管理者才需要「领导力」,而是散发领导力特质的人,才更容易被晓明。许多领导力和特质,都可以通过努力和学习获得,因此就算不是天生的领导者,也能成为一个具备领导魅力的人,进而被老板看见,向你伸出升迁的橘子枝。领导力是什么?领导力是一种能力或特质,甚至可以说是一种「影响力」。好的领导者通常具备影响和鼓励他人的能力,并导引他们朝着共同的目标和愿景前
    优思学院 2025-01-08 14:54 80浏览
  • 村田是目前全球量产硅电容的领先企业,其在2016年收购了法国IPDiA头部硅电容器公司,并于2023年6月宣布投资约100亿日元将硅电容产能提升两倍。以下内容主要来自村田官网信息整理,村田高密度硅电容器采用半导体MOS工艺开发,并使用3D结构来大幅增加电极表面,因此在给定的占位面积内增加了静电容量。村田的硅技术以嵌入非结晶基板的单片结构为基础(单层MIM和多层MIM—MIM是指金属 / 绝缘体/ 金属) 村田硅电容采用先进3D拓扑结构在100um内,使开发的有效静电容量面积相当于80个
    知白 2025-01-07 15:02 145浏览
  • 本文介绍编译Android13 ROOT权限固件的方法,触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。关闭selinux修改此文件("+"号为修改内容)device/rockchip/common/BoardConfig.mkBOARD_BOOT_HEADER_VERSION ?= 2BOARD_MKBOOTIMG_ARGS :=BOARD_PREBUILT_DTB
    Industio_触觉智能 2025-01-08 00:06 100浏览
  • 每日可见的315MHz和433MHz遥控模块,你能分清楚吗?众所周知,一套遥控设备主要由发射部分和接收部分组成,发射器可以将控制者的控制按键经过编码,调制到射频信号上面,然后经天线发射出无线信号。而接收器是将天线接收到的无线信号进行解码,从而得到与控制按键相对应的信号,然后再去控制相应的设备工作。当前,常见的遥控设备主要分为红外遥控与无线电遥控两大类,其主要区别为所采用的载波频率及其应用场景不一致。红外遥控设备所采用的射频信号频率一般为38kHz,通常应用在电视、投影仪等设备中;而无线电遥控设备
    华普微HOPERF 2025-01-06 15:29 172浏览
  • 根据环洋市场咨询(Global Info Research)项目团队最新调研,预计2030年全球无人机锂电池产值达到2457百万美元,2024-2030年期间年复合增长率CAGR为9.6%。 无人机锂电池是无人机动力系统中存储并释放能量的部分。无人机使用的动力电池,大多数是锂聚合物电池,相较其他电池,锂聚合物电池具有较高的能量密度,较长寿命,同时也具有良好的放电特性和安全性。 全球无人机锂电池核心厂商有宁德新能源科技、欣旺达、鹏辉能源、深圳格瑞普和EaglePicher等,前五大厂商占有全球
    GIRtina 2025-01-07 11:02 127浏览
  • 故障现象一辆2017款东风风神AX7车,搭载DFMA14T发动机,累计行驶里程约为13.7万km。该车冷起动后怠速运转正常,热机后怠速运转不稳,组合仪表上的发动机转速表指针上下轻微抖动。 故障诊断 用故障检测仪检测,发动机控制单元中无故障代码存储;读取发动机数据流,发现进气歧管绝对压力波动明显,有时能达到69 kPa,明显偏高,推断可能的原因有:进气系统漏气;进气歧管绝对压力传感器信号失真;发动机机械故障。首先从节气门处打烟雾,没有发现进气管周围有漏气的地方;接着拔下进气管上的两个真空
    虹科Pico汽车示波器 2025-01-08 16:51 86浏览
  • 彼得·德鲁克被誉为“现代管理学之父”,他的管理思想影响了无数企业和管理者。然而,关于他的书籍分类,一种流行的说法令人感到困惑:德鲁克一生写了39本书,其中15本是关于管理的,而其中“专门写工商企业或为企业管理者写的”只有两本——《为成果而管理》和《创新与企业家精神》。这样的表述广为流传,但深入探讨后却发现并不完全准确。让我们一起重新审视这一说法,解析其中的矛盾与根源,进而重新认识德鲁克的管理思想及其著作的真正价值。从《创新与企业家精神》看德鲁克的视角《创新与企业家精神》通常被认为是一本专为企业管
    优思学院 2025-01-06 12:03 161浏览
  • 大模型的赋能是指利用大型机器学习模型(如深度学习模型)来增强或改进各种应用和服务。这种技术在许多领域都显示出了巨大的潜力,包括但不限于以下几个方面: 1. 企业服务:大模型可以用于构建智能客服系统、知识库问答系统等,提升企业的服务质量和运营效率。 2. 教育服务:在教育领域,大模型被应用于个性化学习、智能辅导、作业批改等,帮助教师减轻工作负担,提高教学质量。 3. 工业智能化:大模型有助于解决工业领域的复杂性和不确定性问题,尽管在认知能力方面尚未完全具备专家级的复杂决策能力。 4. 消费
    丙丁先生 2025-01-07 09:25 122浏览
  • By Toradex 秦海1). 简介嵌入式平台设备基于Yocto Linux 在开发后期量产前期,为了安全以及提高启动速度等考虑,希望将 ARM 处理器平台的 Debug Console 输出关闭,本文就基于 NXP i.MX8MP ARM 处理器平台来演示相关流程。 本文所示例的平台来自于 Toradex Verdin i.MX8MP 嵌入式平台。  2. 准备a). Verdin i.MX8MP ARM核心版配合Dahlia载板并
    hai.qin_651820742 2025-01-07 14:52 113浏览
  • 在智能家居领域中,Wi-Fi、蓝牙、Zigbee、Thread与Z-Wave等无线通信协议是构建短距物联局域网的关键手段,它们常在实际应用中交叉运用,以满足智能家居生态系统多样化的功能需求。然而,这些协议之间并未遵循统一的互通标准,缺乏直接的互操作性,在进行组网时需要引入额外的网关作为“翻译桥梁”,极大地增加了系统的复杂性。 同时,Apple HomeKit、SamSung SmartThings、Amazon Alexa、Google Home等主流智能家居平台为了提升市占率与消费者
    华普微HOPERF 2025-01-06 17:23 211浏览
  • 这篇内容主要讨论三个基本问题,硅电容是什么,为什么要使用硅电容,如何正确使用硅电容?1.  硅电容是什么首先我们需要了解电容是什么?物理学上电容的概念指的是给定电位差下自由电荷的储藏量,记为C,单位是F,指的是容纳电荷的能力,C=εS/d=ε0εrS/4πkd(真空)=Q/U。百度百科上电容器的概念指的是两个相互靠近的导体,中间夹一层不导电的绝缘介质。通过观察电容本身的定义公式中可以看到,在各个变量中比较能够改变的就是εr,S和d,也就是介质的介电常数,金属板有效相对面积以及距离。当前
    知白 2025-01-06 12:04 227浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦