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 指定优化类型,时间优先
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编译器会指定为内部默认处理器架构。这样的话编译出的程序可能会运行缓慢或者直接不能运行。
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
裸跑程序的意思是程序直接跑在硬件平台上,没有操作系统的支持。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
{
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
}
MSR FPEXC,r0 // Set EN bit in FPEXC
}
程序的编译如下:
armcc -c -O2 -Otime --cpu=Cortex-A8 --vectori