RISC-V Vector 自动向量化及在 llvm 中的实现
本来想取一个爆炸的标题《可能是全球范围内最好的 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 甚至手撸汇编,提高底层函数库的可移植性以及降低函数库的维护成本。
OSDTConf2021演示文稿:
关于兆松:我们是一家专业做编译和仿真的初创公司,由前晶心科技研发副总王东华博士于 2019 年底创立。研发总监伍华林曾就职于晶心科技,S3 Graphics,Imagination,拥有 10 余年 CPU/GPU 编译器研发经验。