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

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

3天内不再提示

对比NEON汇编与NEON Intrinsics编程的优缺点

安芯教育科技 来源:安谋科技学堂 作者:安谋科技学堂 2022-12-14 09:20 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群


本文选自极术专栏《Infrastructure开源软件 on Arm》的Arm NEON学习系列。前面我们学习了如何快速上手开始NEON编程以及ArmNEON优化技术本篇我们将对比NEON汇编与NEON Intrinsics编程的优缺点

1.简介

ARMNEON编程主要有两种最常用的方式手写汇编和Intrinsics。本文将对比NEON汇编与NEON Intrinsics编程的优缺点。

2.NEON汇编与Intrinsics

NEON汇编与Intrinsics各有优缺点:

47ea516c-7b4b-11ed-8abf-dac502259ad0.png

NEON汇编与Intrinsics各有优缺点:但实际情况远远比这些复杂很多,特别是涉及到ARM v7-A/v8-A跨平台的时候。下面我们结合实例做一些更深入的分析。

2.1 编程

对于初学者来说,Intrinsics比较易学易用。但是对于有汇编经验的开发者来说,可能更熟悉NEON汇编编程,切换到Intrinsics反倒需要有个适应过程。下文列出了实际开发中的一些问题。

2.1.1 指令灵活性

从指令使用角度来说,汇编指令比Intrinsics指令更灵活,主要体现在数据加载/存储上,比如下例:

  • Intrinsics指令

    • 加载数据到一个64位寄存器 vld1_s8/u8/s16/u16/s32…etc

    • 加载数据到一个128位寄存器vld1q_s8/u8/s16/u16/s32…etc

  • ARM v7-A汇编

VLD1 { Dd}, [Rn]
VLD1 { Dd, D(d+1) }, [Rn]
VLD1 { Dd, D(d+1), D(d+2)}, [Rn]
VLD1 { Dd, D(d+1), D(d+2), D(d+3) }, [Rn]
  • ARM v8-A汇编

LD1 { .]
LD1 { ., .}, []
LD1 { ., ., . }, []
LD1 { ., ., ., . }, []

这个问题主要针对现在,相信随着编译器的升级这些问题会逐渐解决的。

在一些情况下,有的编译器已经能把两条指令解析成一条汇编指令,比如:


48055d4a-7b4b-11ed-8abf-dac502259ad0.png
因此,我们有理由由相信,随着ARM v8-A编译器的不断升级,intrinsics指令会完善到跟汇编指令一样灵活的。

2.1.2 寄存器分配

NEON汇编编程时,需要自己分配寄存器,用户必须清楚寄存器的使用情况。而Intrinsics编程的一个好处就是,用户只需要定义变量即可,编译器会自动分配寄存器。这是优点,但有时也会变成弱点。实践证明,因为ARMv7-A只有16个128位NEON寄存器,在Intrinsics编程时,如果用户同时使用过多的NEON寄存器,会导致gcc编译器的寄存器分配问题。主要表现是编译器会把很多数据存储到堆栈中,这样会极大的影响程序性能。因此用户在使用Intrinsics编程时要注意这个问题。在性能出现异常时(比如C程序的性能比NEON程序的性能要好),检查反汇编,看是否有寄存器分配的问题出现。在ARM64中,有32个128位NEON寄存器,这个问题的影响大大减弱。

2.2 性能与编译器

在同一平台下,NEON汇编的性能与编译器无关,只由NEON的实现方式决定。好处是用户在调整代码时,用户可以预测、控制自己程序的性能,但没有惊喜。

NEON Intrinsics 的性能则极大的依赖于编译器,不同的编译器,性能可能有极大的差别。一般来说,越老版本的编译器,性能越差。如果用户需要保留对老版本编译器兼容性时,需要慎重考虑使用Intrinsics。此外,当用户优化代码细节的时候,编译器的介入,使用户很难预测程序性能的变化,但有时候会有惊喜,有时Intrinsics的性能会比汇编的性能要好。尽管很少见,但确实存在。

编译器主要对优化NEON程序造成影响。下图是NEON实现及优化的一般流程:

481e5a48-7b4b-11ed-8abf-dac502259ad0.png

对于NEON汇编或是Intrinsics来讲,实现流程是一样的,编程——调试——测试。但是调优的步骤是不一样的。

NEON汇编的调优方式主要有:

• 改变实现方式,比如改变所用指令,调整并行方式。

• 调整指令顺序,以降低数据依赖性

• 上文第二章所介绍的方式都可以尝试

在汇编调优时,最精细方式是:

• 确定汇编指令数目和指令的时序

• 使用PMU (Performance Monitoring Unit)测量程序执行的周期数

• 根据使用指令的时序,调整程序,尽量减少指令延时

这种方式的缺点是,针对指定微架构的调整,换到另外的平台性能不一定会好。经常花费很大的工作量而只能取得很小的性能提升。

NEON intrinsics的调优则比较困难,

• 尝试NEON汇编所用的调优方式,然后

• 观察反汇编,看看数据依赖性、寄存器使用等情况

• 判断优化效果是否达到预期, 如果符合预期则工作结束。此时,需要测试多种编译器,检查性能的异同。

在使用intrinsics转换ARMv7-A的汇编时,优化效果判断比较简单,只要Intrinsics性能接近汇编性能即可。但是,在使用Intrinsics优化ARM v8-A的代码时,我们没有性能参考的对象,较难判断代码是否调整到最优状态了。可能会有疑问,会不会汇编实现的性能会更好?但随着整个ARM v8-A环境的成熟,这个问题带来的影响会越来越小。另外,如果更看重Intrinsics的其它优点,对性能也不是锱铢必较的话,这个问题的影响也不大。

2.3 跨平台与可移植性

现在,现有的大部分NEON汇编代码只能运行在ARM v7-A或是ARM v8-A AArch32模式的平台上。想要运行在ARM v8-A AArch64模式的平台,我们必须重写代码,这带来了很大的工作量。这时,NEON Intrinsics代码的好处就体现出来了,在ARM v8-A AArch64模式下,我们可以直接运行这些代码,减少了重写代码的工作量。同时,我们可以只维护一套代码,这样也减少了维护的工作量。

然而,由于ARMv7-A/ARMv8-A的硬件资源不同,即使用Intrinsics,有时我们也需要两套代码。Ne10中FFT实现就是一个例子:

// radix 4 butterfly with twiddles
scratch[0].r = scratch_in[0].r;
scratch[0].i = scratch_in[0].i;
scratch[1].r = scratch_in[1].r * scratch_tw[0].r - scratch_in[1].i * scratch_tw[0].i;
scratch[1].i = scratch_in[1].i * scratch_tw[0].r + scratch_in[1].r * scratch_tw[0].i;
scratch[2].r = scratch_in[2].r * scratch_tw[1].r - scratch_in[2].i * scratch_tw[1].i;
scratch[2].i = scratch_in[2].i * scratch_tw[1].r + scratch_in[2].r * scratch_tw[1].i;
scratch[3].r = scratch_in[3].r * scratch_tw[2].r - scratch_in[3].i * scratch_tw[2].i;
scratch[3].i = scratch_in[3].i * scratch_tw[2].r + scratch_in[3].r * scratch_tw[2].i;

上述代码描述了32位浮点复数FFT算法的基本元——基4蝶形运算。从代码中我们可以看出:

• 如果在一次循环中,两个基4蝶形运算并行,需要20个 64位寄存器。

• 如果在一次循环中,四个基4蝶形运算并行,需要20个 128位寄存器。

由于ARM v7-A只有16个128位寄存器,因此,该平台的FFT实现仅能一次循环两个基4蝶形运算并行。而ARM v8-A有32个128位寄存器,该平台的FFT实现能一次循环四个基4蝶形运算并行。因此,即使用Intrinsics,我们也需要两套代码。

上例可以说明,在实现一套代码跨ARM v7-A/v8-A平台时,我们需要注意一些类似的特例。

2.4 将来

上面已经分析了NEON汇编与Intrinsics的很多问题,但是这些问题都是暂时的。长远来看,使用intrinsics还是更好。Intrinsics能带来硬件以及编译器发展的好处。经典算法只要实现一次即可,不用随着硬件的升级而重新编程,大大减少了工作量。

2.5 总结

结合实例,上文对NEON汇编和Intrinsics做了一些分析。总体来说,使用intrinsics利大于弊。特别是与汇编相比,Intrinsics更容易编程,且能够更好地兼容ARMv7-A/ARMv8-A。

下面再总结一下NEON Intrinsics使用时的一些注意事项:

• 使用的寄存器数量

• 编译器选择

• 查看反汇编

3.总结

本文通过实际程序分析了NEON汇编与Intrinsics的优缺点。希望能对用户在NEON实际开发中有些借鉴意义。

审核编辑 :李倩


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

    关注

    31

    文章

    5617

    浏览量

    130386
  • 编程
    +关注

    关注

    90

    文章

    3723

    浏览量

    97427

原文标题:Arm NEON学习(三)NEON 汇编与Intrinsics编程

文章出处:【微信号:Ithingedu,微信公众号:安芯教育科技】欢迎添加关注!文章转载请注明出处。

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    导热凝胶材料对比:硅基 vs 非硅基 vs 复合材料

    导热凝胶作为高效热界面材料,主要分为硅基、非硅基和复合材料体系。本文对比三者热导率、稳定性、适用场景及优缺点,帮助您选择最适合消费电子、新能源汽车和5G设备的导热解决方案。
    的头像 发表于 04-09 00:35 117次阅读
    导热凝胶材料<b class='flag-5'>对比</b>:硅基 vs 非硅基 vs 复合材料

    永磁式抱闸与电磁式抱闸优缺点对比

    永磁式抱闸与电磁式抱闸作为工业自动化领域的关键制动装置,广泛应用于电梯、起重机械、机床等设备中。两者的核心差异在于励磁方式和工作原理,进而衍生出性能、成本、适用场景等多方面的区别。以下从技术原理、性能表现、经济性及适用性四个维度展开深度对比
    的头像 发表于 02-27 17:09 720次阅读
    永磁式抱闸与电磁式抱闸<b class='flag-5'>优缺点</b><b class='flag-5'>对比</b>

    三防漆稀释剂替代品对比优缺点+环保选择 |铬锐特实业

    铬锐特实业|东莞厂家|三防漆稀释剂能用什么替代?本文对比原装稀释剂、环保无苯型、醋酸丁酯、PMA等常见替代品的优缺点、成本与性能影响,附行业数据和选择建议,助您兼顾品质与成本。
    的头像 发表于 02-26 00:12 355次阅读
    三防漆稀释剂替代品<b class='flag-5'>对比</b>:<b class='flag-5'>优缺点</b>+环保选择 |铬锐特实业

    对比分析电能质量在线监测装置支持的断点续传文件传输协议的优缺点

    优缺点对比分析: 一、各协议优缺点逐一拆解 1. FTP(文件传输协议) 优点 断点续传机制成熟 :依托REST命令可精准定位字节偏移量,支持大文件分块续传,且内置 CRC 校验保障数据完整性,是装置的基础标配功能,适配性强。
    的头像 发表于 12-05 17:49 3652次阅读
    <b class='flag-5'>对比</b>分析电能质量在线监测装置支持的断点续传文件传输协议的<b class='flag-5'>优缺点</b>

    UV三防漆的优缺点大起底!是效率神器还是局限陷阱?

     UV三防漆以其“秒干”的黑科技闻名于电子制造圈,但它真的是完美无缺的吗?任何材料的选择都是一场权衡。本文将彻底剖析UV三防漆的优缺点,帮助您精准判断:它究竟是提升您生产效率的利器,还是可能带来麻烦的“娇气”选手?
    的头像 发表于 11-15 17:22 629次阅读
    UV三防漆的<b class='flag-5'>优缺点</b>大起底!是效率神器还是局限陷阱?

    不同类型的电能质量在线监测装置数据存储方式有哪些优缺点

    不同类型的电能质量在线监测装置数据存储方式,核心差异体现在 数据控制权、实时性、运维成本、扩展性 上,主要分为 本地存储、云端存储、混合存储 三类。每类方式的优缺点需结合电能质量数据特征(时序性
    的头像 发表于 10-30 10:00 420次阅读

    工业级SLC SD NAND存储的优缺点

    工业级 SLC 存储卡与存储芯片的优缺点: ​ 核心特点与适用场景 ​ ​ 可靠性与寿命 ​:SLC(单层单元)每单元仅存1 bit,典型P/E 擦写寿命约 10 万次,远高于 MLC/TLC,适合
    的头像 发表于 10-17 11:09 933次阅读
    工业级SLC SD NAND存储的<b class='flag-5'>优缺点</b>

    IAR下全志T113-S3 ARM Cortex-A7开启FPU后异常怎么解决?

    初始化,汇编中调用 void rt_low_level_init(void) { unsigned int cpacr, fpexc; cpacr = __get_CPACR
    发表于 10-14 06:18

    不同类型的自动化工具在评估数据缓存效果时有哪些优缺点

    在评估数据缓存效果时,不同类型的自动化工具(实时监控类、性能测试类、深度分析类、云原生专属类)因设计目标和技术特性不同,存在显著的优缺点差异。以下结合工具类型与具体场景,系统对比其核心优劣势,并给出
    的头像 发表于 09-25 17:48 845次阅读
    不同类型的自动化工具在评估数据缓存效果时有哪些<b class='flag-5'>优缺点</b>?

    无线局域网的优缺点和使用要点

    近年来,无线局域网 已普遍应用于我们生活的方方面面。本文将介绍无线局域网的基础知识、优缺点、与 Wi-Fi 及有线局域网的区别,以及有效使用的要点。全球领先的短距离无线模块供应商 KAGA FEI
    的头像 发表于 08-14 16:04 3352次阅读
    无线局域网的<b class='flag-5'>优缺点</b>和使用要点

    超级电容对比锂电池的优缺点

    本文探讨了超级电容和锂电池在储能领域的优缺点。超级电容以高能量密度著称,但充电速度较慢;锂电池则具有快充和寿命长的优势,但成本较高。在新能源汽车和电网调频等高频次应用中,两者可以互补。
    的头像 发表于 06-30 09:37 2997次阅读
    超级电容<b class='flag-5'>对比</b>锂电池的<b class='flag-5'>优缺点</b>

    商业云手机核心优缺点分析

    商业云手机核心优缺点分析,综合技术性能、成本效率及场景适配性等多维度对比: 核心优势‌ 成本革命‌ 硬件零投入‌:免除实体手机采购(旗舰机均价6000元),企业百台规模可省60万+ CAPEX
    的头像 发表于 06-16 08:11 1178次阅读
    商业云手机核心<b class='flag-5'>优缺点</b>分析

    在IAR Embedded Workbench for Arm中使用Arm Cortex-R52 NEON

    随着嵌入式系统变得越来越智能,对嵌入式处理器的要求也越来越高。为了更好应对汽车、医疗和工业机器人等领域对嵌入式处理器的要求,Arm推出了采用Armv8-R架构的Cortex-R52。Cortex-R52相对之前的处理器引入了很多新的特性,其中一个就是NEON
    的头像 发表于 06-05 09:57 2047次阅读
    在IAR Embedded Workbench for Arm中使用Arm Cortex-R52 <b class='flag-5'>NEON</b>

    PCBA 表面处理:优缺点大揭秘,应用场景全解析

    一站式PCBA加工厂家今天为大家讲讲PCBA加工如何选择合适的表面处理工艺?PCBA表面处理优缺点与应用场景。在电子制造中,PCBA板的表面处理工艺对电路板的性能、可靠性和成本都有重要影响。选择合适
    的头像 发表于 05-05 09:39 1572次阅读
    PCBA 表面处理:<b class='flag-5'>优缺点</b>大揭秘,应用场景全解析

    3D打印耗材种类有哪些?各有什么优缺点

    这篇文章将为你详细介绍3D打印耗材的基础知识,帮助你了解这些材料的特性、优缺点以及它们适合的应用场景。
    的头像 发表于 04-29 09:40 5.4w次阅读
    3D打印耗材种类有哪些?各有什么<b class='flag-5'>优缺点</b>?