跳到主要内容

RISC-V Vector 自动向量化及在 llvm 中的实现

· 阅读需 22 分钟

本来想取一个爆炸的标题《可能是全球范围内最好的 RISC-V Vector 自动向量化器的实现》,但是本着科学严谨的态度,以及对未知事物的敬畏,还是取了这个没有吸引力的标题,这样即使被打脸了,也还有挽回的余地。

RISC-V Vector 与目前市面上大部分 SIMD 的向量指令集是不同的,它有点类似于 ARM 的 SVE 和 SVE2 可变长向量指令,但又不完全一样。比如在 ARM 中 SVE/SVE2 变长向量指令集可以在程序启动的时候配置向量寄存器大小,运行时动态设置元素宽度,而 RISC-V Vector 扩展更加灵活,可以使用 vsetvl 指令,在运行时动态调整寄存器大小,组数,元素数据宽度,以及掩码操作等等。这样的架构对于指令集来说好处是解决了对未来的兼容性,并且可以让同一份可执行文件,在不同架构的向量处理器中充分利用各种不同宽度的向量处理器,实现一份代码,兼容不同硬件架构,从而大大降低了软件的维护成本。

不过,由于目前主流的编译器框架 llvm,gcc 只支持 SIMD 类型的自动向量化,EPI(European Processor Initiative 欧洲超算中心的一个项目) 虽然基于 llvm 做了一些初步的 RISC-V 可变长自动向量化的工作,但是实现的非常粗糙,并且产生的 RVV 代码质量比较差。据悉,目前上游 RISC-V 相关的维护团队已经放弃了在 gcc 当中实现 RVV 自动向量化的想法,llvm 上游也迟迟未动工。

所以兆松科技基于 llvm 框架,实现了一套高质量的 RVV 自动向量化器。据当下可获取的信息,可以说我们实现的自动向量化器,是目前业内最完整,质量最好的自动向量化器。目前使用 zcc 编译我们自研的 DSP 函数库,大部分循环均可以产生高质量的 RVV 指令,对于一些更复杂的循环,我们也正在研发更好的自动向量化机制,目标是降低高性能函数库优化的门槛,坚决避免手撸 RVV intrinsic 甚至手撸汇编,提高底层函数库的可移植性以及降低函数库的维护成本。

文后提供了兆松团队成员晏明参加 OSDT2021 的视频和 PPT,其中包括 zcc 编译器当中所实现的 RVV 自动向量化器,以及对 RVV 架构的简介,横向对比了 EPI 以及 llvm 上游的实现质量(其实上游只对 RVV 简单的做了一些 intrinsics 实现而已)。

OSDTConf2021演示文稿

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片



关于兆松:我们是一家专业做编译和仿真的初创公司,由前晶心科技研发副总王东华博士于 2019 年底创立。研发总监伍华林曾就职于晶心科技,S3 Graphics,Imagination,拥有 10 余年 CPU/GPU 编译器研发经验。

图片