作者:Ashok Bhat2022年5月27日
Arm编译器Linux 22.0版现在提供了改进的编译器和库。Arm编译器Linux版(ACfL)是Arm C/C++编译器(armclang)、Arm Fortran编译器(armflang)和Arm性能库(ArmPL)的组合。在本博客中,我们将探讨此版本的新增功能。
Arm编译器现在基于LLVM 13
Arm编译器现在基于LLVM 13,这提高了性能。
我们看到SPEC CPU 2017的许多次级基准得到了改进,geomean总分比之前的21.1版本提高了2.2%。该基准测试在AWS c6g.metal(带Arm Neoverse-N1核心)上运行。
针对Neoverse-V1进行了更好的调整(AWS Graviton 3核心)
22.0版本的Arm编译器为Neoverse-V1提供了一个优化的成本模型,并提供了许多与SVE代码生成相关的改进。这包括(1)优化使用SVE的Gather/Scatter功能(2)将循环(loop)填充对齐,以更好地利用指令缓存(3)在将向量的一个元素插入另一个元素时,优化使用SVE拼接操作。
这些优化的累积效应可以在前面的图中看到。我们在这里将Neoverse-V1优化的SVE代码和为Neoverse-V1优化的Neon代码做一个对比。我们的基准是在开发SVE架构扩展时使用的一组具有代表性的微基准(micro-benchmarks)。您可以看到,22.0(橙色条)中的编译器优于21.1版(蓝色条)。通过这些改进,22.0版本已准备好在AWS Graviton 3上开发HPC应用程序。
GCC 11更新
该软件包现在提供GCC 11系列编译器,并有许多性能改进(https://community.arm.com/arm-community-blogs/b/tools-software-ides-blog/posts/performance-improvements-in-gcc-11)。
具有CPU运行时检测的单个ArmPL
Arm性能库不再为SVE和非SVE内核打包为单独的库。我们现在提供一个库,其中包含所有受支持内核(包括SVE)的优化版本。在运行时,库通过检测核的类型,来选择最佳的例程和配置。作为用户,您可以自动受益于库中最快的调整,而无需重新链接到特定于核的库。
更快的BLAS、LAPACK和FFT
ArmPL 22.0进一步改进了BLAS和LAPACK例程。
上图显示了22.0版本比21.0版本的改进(2021年初发布)。这些数据来自5000多个个案的基准测试,涵盖:广泛BLAS例程的基准测试,一系列重要的LAPACK例程,用于串行(1线程)和并行(8线程)执行中的小O(10)、中O(100)和大O(1000)不同的问题场景。
数学函数的改进
在22.0中,我们改进了许多数学函数的性能。其中包括标量函数(atan、atan2、atan2f、cos、exp、sin和erf)和向量函数(atanf、atan2f、cosf、erfcf、expo、logf、pow、sinf和tanf)的改进。在下图中,您可以看到Elefunt benchmark在AWS Graviton 2(Neoverse N1)系统上运行时的影响。
模块名称变更
该包提供模块文件,以便轻松加载所需的编译器或库。对于22.0版本,请使用以下模块命令。
结论
Arm编译器Linux 22.0版与前21.x系列版相比有许多改进和变化。我们将继续进行进一步的改进,并计划在2022年9月/10月发布下一版本22.1。
最新版本下载地址:https://developer.arm.com/downloads/-/arm-compiler-for-linux