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

    文章

    5249

    浏览量

    119155
  • 编程
    +关注

    关注

    88

    文章

    3518

    浏览量

    93236

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

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

收藏 人收藏

    评论

    相关推荐

    远心镜头优点和缺点对比

    远心镜头各有优缺点,根据实际所用场景领域。
    的头像 发表于 09-03 16:38 186次阅读
    远心镜头优点和<b class='flag-5'>缺点</b><b class='flag-5'>对比</b>

    直流稳压电源串并联优缺点对比

    直流稳压电源串并联 的工作原理是扩大开关电压和电流,实现电压和电流的宽范围调节,在实际应用中,串联稳压电源和并联稳压电源都有其优缺点。   串并联直流稳压电源的优点和缺点 一、并联稳压电源的优点
    的头像 发表于 07-17 17:59 919次阅读

    AI大模型与小模型的优缺点

    在人工智能(AI)的广阔领域中,模型作为算法与数据之间的桥梁,扮演着至关重要的角色。根据模型的大小和复杂度,我们可以将其大致分为AI大模型和小模型。这两种模型在定义、优缺点及应用场景上存在着显著的差异。本文将从多个维度深入探讨AI大模型与小模型的特点,并分析其各自的优缺点
    的头像 发表于 07-10 10:39 1442次阅读

    plc和单片机的优缺点对比

    在自动化控制系统中,PLC(可编程逻辑控制器)和单片机(Microcontroller,MCU)是两种常见的控制器。它们在许多方面有所不同,各有优缺点。 定义与原理 PLC(Programmable
    的头像 发表于 06-06 14:07 988次阅读

    nbiot和lora的优缺点是什么?

    nbiot和lora的优缺点
    发表于 06-04 06:37

    请问数字(硬件)I2C和模拟I2C的优缺点

    请教哈各位同仁: 1. 数字(硬件)I2C和模拟I2C的优缺点? 2.他们在正常模式下的功耗对比,哪个较好?
    发表于 05-13 06:10

    日本大带宽服务器优缺点分析

    日本大带宽服务器是很多用户的选择,那么日本大带宽服务器优缺点都是什么?Rak部落小编为您整理发布日本大带宽服务器优缺点分析。
    的头像 发表于 03-22 10:08 331次阅读

    滤波电容不同补偿方式优缺点对比

    滤波电容不同补偿方式优缺点对比  滤波电容是电子电路中常用的元件,用于对信号进行滤波处理。不同的补偿方式可以帮助提高滤波电容的性能和稳定性。本文将详细介绍几种常见的滤波电容补偿方式的优缺点。 首先
    的头像 发表于 01-04 16:00 782次阅读

    电动机调速方式的优缺点

    电动机调速方式的优缺点  电动机调速是指根据负载的要求调整电动机转速的过程,可分为机械调速和电子调速两种方式。机械调速主要使用机械装置来调整电动机的速度,而电子调速则利用电子器件对电动机进行精确
    的头像 发表于 01-04 11:26 837次阅读

    出现输入浪涌电流的原因 多种限制浪涌电流方案优缺点对比

    出现输入浪涌电流的原因 多种限制浪涌电流方案优缺点对比 输入浪涌电流是指在电器设备启动或关闭时出现的瞬时高电流。这种浪涌电流可能会对设备和电路产生不利影响,因此需要采取一些措施来限制和控制浪涌电流
    的头像 发表于 01-03 11:00 530次阅读

    常见开关电源优缺点对比

    常见开关电源优缺点对比
    的头像 发表于 12-07 15:30 528次阅读
    常见开关电源<b class='flag-5'>优缺点</b><b class='flag-5'>对比</b>

    ARM NEON在矩阵&amp;向量计算中的加速概述

    NEON是ARM上使用的一种SIMD(Single Instruction Multiple Data – 单指令多数据)指令集。
    的头像 发表于 12-01 10:37 1639次阅读
    ARM <b class='flag-5'>NEON</b>在矩阵&amp;向量计算中的加速概述

    请问C语言和汇编语言在开发单片机时各有哪些优缺点

    C语言和汇编语言在开发单片机时各有哪些优缺点
    发表于 10-30 06:32

    请问C语言和汇编语言在开发单片机时各有哪些优缺点

    C语言和汇编语言在开发单片机时各有哪些优缺点
    发表于 10-26 07:47

    电阻式触摸屏的原理及优缺点

    电子发烧友网站提供《电阻式触摸屏的原理及优缺点.pdf》资料免费下载
    发表于 10-08 10:16 1次下载
    电阻式触摸屏的原理及<b class='flag-5'>优缺点</b>