麦斯科技 · 2021年05月15日

LLVM12中有何Arm新功能

https://community.arm.com/developer/tools-software/tools/b/tools-software-ides-blog/posts/llvm12-for-arm

Ashok Bhat 2021年4月28日

LLVM-12-post-image-_2800_2_2900_.jpg_2D00_900x506x2.jpg

LLVM 12 现已提供改进的Arm支持。它提供了Windows下的原生Arm工具链上,为新Arm 内核增加了支持,新增SVE/2 应用程序调试支持,并将性能改进为关键 CPU 基准。

Windows on Arm本机64位Arm工具链

LLVM12发行版在ARMLLVM二进制文件上提供了本机64位Arm Windows,这要感谢Linaro的努力(有关更多详细信息,请参阅本博客)。LLVM现在在Linaro托管的Arm buildbots上有64位Arm Windows。计划对即将发布的LLVM版本进行进一步的改进,包括更好的调试支持。

新的处理器支持

LVM 12增加了对Arm Neoverse内核、Neoverse V1和Neoverse N2、Arm Cortex-A78C、Arm Cortex-R82和Fujitsu A64FX的mcpu支持。当提供了相关的CPU标志时,编译器会自动为目标处理器选择正确的体系结构特性和调优。

下表描述了每个目标处理器的标志:

微信图片_20210515180258.png

用于LSE部署的Out-of-line atomics

AArch64 大型系统扩展 (LSE) 在 Armv8.1-A 中引入。这些为大型多核系统提供了更高效的原子指令。

LLVM 12 增加了对新标志"-moutline-atomics"的支持,该标志可在运行时检测处理器是否支持 LSE。然后,如果可能,它使用这些新的原子指令,在没有 LSE 支持的情况下,返回到处理器上的 Armv8.0-A LL/SC 循环。此选项行为反映了 GNU 项目系列中的类似支持。我们正在努力使此选项在即将发布的 LLVM13 版本中默认启用。

更好的 SVE/SVE2 内在支持

LLVM11是第一个添加向量长度无关SVE内部函数(也称为ACLE)支持的LLVM版本。LLVM12增加了矢量长度特定的ACLE支持,并改进了矢量长度不可知的支持。

SVE 代码生成基础结构

在LLVM中实现SVE自动矢量化是一个漫长的过程,我们在LLVM12中取得了重大进展。LLVM现在第一次能够使用宽度无关的SVE自动矢量化对某些循环进行矢量化。例如,考虑以下循环,它改编自TSVC_2 循环:

void s000(double * __restrict a, double * __restrict b) {
  unsigned LEN_1D = 1024;
#pragma clang loop vectorize_width(2, scalable) interleave(disable) unroll(disable)
  for (int i = 0; i < LEN_1D; i++) {
    a[i] = b[i] + 1;
  }
}

启用SVE自动矢量化的关键是 #pragma clang loop vectorize_width(2, scalable)。这告诉LLVM尝试使用2个lanes的可伸缩矢量化宽度来矢量化循环。有了这个支持,我们现在可以朝着在LLVM中默认启用SVE自动矢量化的最终目标努力。

关于这个功能的更多信息可以在我们最近关于LLVM中SVE的Linaro虚拟连接讨论中找到。

规格 CPU 2017 CPU 基准改进

LLVM12添加了新的通用矢量化相关优化,改进了SPEC CPU 2017 Integer 525.x264_r基准测试。在Arm Neoverse N1硬件上,我们看到这个单独的基准测试提升了25%,SPEC CPU 2017 INT分数整体提升了2%。LLVM现在识别SAD模式并结合UDADDV指令生成vector add。LLVM还支持尾声矢量化。下面的图表显示了相对于LLVM11的各种基准改进。

llvm 12 graph.png-1040x0.png

MVE 的改进

MVE是Armv8.1-M体系结构的扩展。它的设计目的是在嵌入式设备(如arm cortex-M55)的cpu上为机器学习和数字信号处理工作负载提供显著的性能提升。

LLVM12改进了MVE的矢量化和代码质量,显著提高了一系列工作负载的性能和代码大小。一个特别的亮点是能够充分利用MVE的功能,允许归约循环的尾部谓词矢量化。

在 LLDB 中 支持SVE/2

LLDB现在完全支持调试SVE/2应用程序,包括SVE寄存器的动态大小更新。LLDB中支持指针认证(PAuth)、内存标记扩展(MTE)和顶级字节忽略(TBI)体系结构特性的工作正在进行中,这些特性有望成为LLVM13版本的一部分。

展望

llvm12对基于Arm的硬件有重大改进,包括支持较新的cpu、Windows on Arm原生二进制文件等。我们(Arm和我们的合作伙伴)正在为即将到来的LLVM13(预计2021年9月/10月)开发更多功能,您可以期待激动人心的新功能和性能改进。

了解本机LLVM工具链 https://community.arm.com/developer/tools-software/tools/b/tools-software-ides-blog/posts/native-llvm-toolchain-on-windows-on-arm

了解Arm on Windows

https://developer.arm.com/solutions/os/windows-on-arm?_ga=2.140856378.924737745.1621072476-418006553.1606625914

推荐阅读
关注数
5845
内容数
525
定期发布Arm相关软件信息,微信公众号 ArmSWDevs,欢迎关注~
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息