ARM NEON编译优化

本文详细介绍了如何利用ARM NEON进行编译优化,包括使用DS-5和GCC编译工具自动矢量化,裸跑时手动启用NEON,以及在Linux kernel中启用NEON的方法。此外,还讨论了向量化编程的要求和限制,并提到了支持NEON的第三方库。
摘要由CSDN通过智能技术生成
        NEON被设计为附加的加载/存储架构,以提供良好的矢量化, 编译器对c/c++等语言有良好的支持,这样可以实现很高水平的并行性。开发者可以为需要高性能的应用程序编写NEON指令来实现相应功能,最重要的是它实现了访问交叉存储在内存中的多个数据流并组织成想要的数据格式。NEON指令代码的编写可以看成是ARM普通编程的一部分,这使得NEON与外部硬件加速器相比,编程更简单、更高效;他还包括用于读取和写入外部存储器的NEON指令,在NEON寄存器和ARM寄存器之间移动数据并执行SIMD操作。

        一个向量化的编译器可以让你的C/C++的代码以某种方式对其进行矢量化能有效地利用NEON硬件,这意味着你可以写基于C的可移植代码并通过NEON指令获得很高的性能。借助于向量化,使得大量的循环迭代计算成倍的缩短。GCC和ARM编译工具链提供使能自动向量化的NEON技术的功能,但由于C和c++标准不包括并发性方面,你可能需要为编译器提供额外的信息以使NEON功能得到更大的发挥,所需的代码需改全部是代码语言标准的一部分,所以不会对代码的跨平台移植造成影响。当编译器能确定程序员的意图时,编译器能很好的进行矢量化编译,前提是你必须对编译器指定恰当的参数,下面就分各种情况来说明NEON的使能方式:

1.  ARM编译工具自动矢量化
        DS-5专业版支持向量化编译器。为了使能自动化矢量必须指定当前处理器支持NEON且说明处理器指令集版本:
        --vectorize          使能矢量化
        --cpu 7-A/Cortex-A8  指定支持NEON功能的处理器架构
        -O2/-O3              指定优化级别
        -Otime               指定优化类型,时间优先

2.  GCC编译工具自动矢量化
        GCC编译器支持自动矢量化设置,如下:
        -ftree-vectorize
        -mfpu=neon
        -mcpu            指定支持NEON功能的处理器架构
        若优化级别设定为-O3则意味着-ftree-vectorize被设定;如果你没有指定-mcpu选项,GCC编译器会指定为内部默认处理器架构。这样的话编译出的程序可能会运行缓慢或者直接不能运行。

3.  裸跑时怎样使能NEON:
        裸跑程序的意思是程序直接跑在硬件平台上,没有操作系统的支持。NEON在reset之后是disable的,需要手动来enable,下面列举了如何手动来enable NEON指令的支持:
         #include <stdio.h>
         // Bare-minimum start-up code to run NEON code
        __asm void EnableNEON(void)
        {
            MRC p15,0,r0,c1,c0,2 // Read CP Access register
           ORR r0,r0,#0x00f00000 // Enable full access to NEON/VFP by enabling access to
           // Coprocessors 10 and 11
           MCR p15,0,r0,c1,c0,2 // Write CP Access register
           ISB
           MOV r0,#0x40000000 // Switch on the VFP and NEON hardware
           MSR FPEXC,r0 // Set EN bit in FPEXC
       }
       程序的编译如下:
              armcc -c -O2 -Otime --cpu=Cortex-A8 --vectori
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值