为什么要依靠编译器进行自动矢量化?
编写经过手动优化的汇编内核或包含Neon内部函数的C代码,可以对软件中的Neon代码进行高度控制。 但是,这些方法可能导致大量的可移植性和工程复杂性成本。
在许多情况下,高质量的编译器可以生成同样好的代码,但是所需的设计时间却少得多。 允许编译器自动识别代码中使用Advanced SIMD指令的机会的过程称为自动向量化。
在特定的编译技术方面,自动向量化包括:
循环矢量化:展开循环以减少迭代次数,同时在每个迭代中执行更多操作。
超字级并行(SLP)矢量化:将标量运算捆绑在一起,以使用全宽Advanced SIMD指令。
自动向量化编译器包括Arm编译器6,Arm C / C ++编译器,LLVM-clang和GCC。
依靠编译器自动向量化的好处包括:
只要没有特定于体系结构的代码元素(如内联汇编或内部函数),就可以使用高级语言实现的程序是可移植的。
现代编译器能够自动执行高级优化。
以给定的微体系结构为目标就像设置单个编译器选项一样容易,而优化汇编程序则需要对目标硬件有深入的了解。
使用编译器生成Neon代码适合大多数项目。 仅当生成的代码无法提供必要的性能时,或者高级语言不支持特定的硬件功能时,其他利用Neon的方法才有必要。 例如,必须在汇编代码中配置系统寄存器以控制浮点功能。