LLVM 中 RISC-V 向量代码生成的改进

主要观点:本月初 Alex 在巴黎的 RISC - V 峰会欧洲会议上介绍了“LLVM 中 RISC - V 向量代码生成的改进”,本文总结了该演讲。重点关注编译器优化的高层次目标和遇到的问题,包括 RISC - V 向量代码生成的现状、改进措施(如非 2 的幂次方向量化、vl 尾折叠、库调用扩展、新的 RVV 扩展等)以及相关测试和未来工作。

关键信息

  • RISC - V 向量代码生成的实施现状分为基本启用、默认启用、扩展实现和性能分析调优等阶段。
  • 编译器优化的目标主要是生成代码的性能,同时考虑盈利性、避免不必要的控制状态寄存器切换、减少溢出以及充分利用可用指令等因素。
  • 介绍了非 2 的幂次方向量化、vl 尾折叠、库调用扩展等具体改进措施及其示例。
  • 新的 RVV 扩展让编译器能做以前做不到的事情,需要教会编译器选择指令和估计成本。
  • 展示了 SPEC CPU 2017 基准测试的结果,多数基准测试有明显改进,且还有更多工作在进行。
  • 强调了测试的重要性,感谢 RISE 的支持并提供了相关仪表盘。
  • 提及未来工作方向,如默认调度模型等。

重要细节

  • 编译器在进行成本建模时,有时会认为向量化不盈利,可能是模型不够详细或编译器当前工作不到位。
  • 非 2 的幂次方向量化在 LLVM 中由 SLP 向量器处理,示例中展示了对像素值的处理改进。
  • vl 尾折叠使编译器能在 RISC - V 向量中处理非整数倍向量长度的情况,提高性能和代码大小。
  • 库调用扩展使编译器能利用向量扩展实现 memcpy 和 memcmp 操作,避免函数调用和溢出。
  • 测试方面,有 CI 覆盖新功能以确保生成的代码工作正常,并有相关仪表盘。
  • 未来工作包括研究默认调度模型等,以进一步提高编译器性能。
阅读 15
0 条评论