乐于分享
好东西不私藏

RuyiAI Triton-RISCV开源:在RISC-V上实现Triton原生编译

RuyiAI Triton-RISCV开源:在RISC-V上实现Triton原生编译

Triton-RISCV已在中国科学院软件研究所智能软件研究中心推出的RuyiAI系统软件栈中开源,欢迎大家体验和交流。相比现有的Triton项目,它有两个核心特点:

  • 原生支持RISC-V向量扩展(RVV)架构:可以在SG2044平台上直接原生构建与运行,无需交叉编译。

  • 复用buddy-mlir的向量化能力:在采用triton-sharedTriton转换成MLIRLinalg方言后,buddy-mlir通过自定义的中间表示和下降通路进行优化。在SG2044单线程评测中,相比triton-cpu,最高性能提升达到4.16x,整体平均提升1.57x

下面介绍我们做Triton-RISCV的动机、技术路线、以及当前的覆盖率和性能结果。

01
为什么要做Triton-RISCV

先从Triton本身说起。

在现有的算子编译优化方法中,Triton凭借结构清晰的分块编程模型和友好的Python接口,已经在GPU架构上得到了广泛应用,并且正在被越来越多的后端接入和完善。

RISC-V平台来说,支持Triton的意义不只是多支持一种前端语言,更是打开了一个生态入口:既可以复用Triton的编程模型和使用接口,也能够承接围绕Triton构建的算子库、优化框架等软件生态。

但要把Triton真正落地到RISC-V平台,现有方案仍存在一些不足。

triton-cpu默认会依据向量化维度的输入尺寸,生成相同向量长度的mask load/store。然而在实际场景中,当输入尺寸远超硬件支持的向量寄存器长度时,这种策略会导致严重的寄存器溢出,导致性能不佳。

triton-shared可以将Triton转换为基于Linalg方言,有利于后续的优化和扩展。但当前在下降到RISC-V平台时,主要依赖MLIR官方的convert-linalg-to-affine-loops等标量通路,仍缺少专门的向量化实现来保证可用性能。

此外,这两种方案都不支持在RISC-V平台上的原生编译。

因此,我们实现Triton-RISCV的思路是:前端尽量复用triton-shared的生态,将中间表示落到Linalg层;随后把核心向量化能力交给buddy-mlir,最终生成高效的RVV指令。

02
技术路线

Triton-RISCV的整体编译流程如下:

1. 首先将Triton算子转换成Triton官方的TTIR层中间表示;

2. 然后通过triton-shared转换到Linalg层中间表示;

3. 接下来在核心优化阶段接入buddy-mlir,基于自定义的VIR方言完成向量化;

4. 最后逐步下降到LLVM IR,最终完成RVV指令的代码生成。

目前主要在两个层级上做了优化。

1.Triton -> Linalg:减少不必要的数据搬运

这一部分基于triton-shared完成,我们重点优化了访存路径,目标是缩短访存链路,减少不必要的数据搬运。

原有实现中,输入和输出路径存在较多临时搬运,例如使用memref.copytensor.extract_slicebufferization.materialize_in_destination。现在改为更直接的向量访存形式:输入拷贝使用显式向量循环,并在尾部使用标量循环处理剩余元素;输出写回采用vector.transfer_readvector.store,并配合尾部标量处理。在缩短访存链路之后,后续向量化阶段也更容易获得性能收益。

2.Linalg -> VIR -> LLVM IR:提高向量化覆盖率

这一部分主要复用buddy-mlir的向量化能力。我们针对两类Linalg算子进行了优化:一类是粗粒度算子,如matmulconvreduce;另一类是linalg.generic算子,例如常见的arithcmp/selectmin/max、位运算和移位操作。

这些算子会被改写为对应的向量化形式,从而整体提升向量化覆盖率。完成VIR层优化后,Triton-RISCV会继续打通下游代码生成链路,将向量语义逐步下降到LLVM IR,并最终映射到RVV指令,在目标平台上执行。

03
覆盖率进展

目前我们从两个方面验证覆盖率。

一个是triton-sharedpython/examples中自带的25Triton测例。涵盖矩阵计算、规约、索引、掩码、访存等场景,目前已全部跑通。

另一个是FlagGems  src/flag_gems 中的代表性测例。由于原始测例与FlagGems自身实现的运行时接口强耦合,无法直接执行,因此我们从中挑选并改写了12个测例,涵盖blasnormdistributedattention4个类别。这些测例也已全部跑通,其类型和算子名称汇总如下:

类型

算子名称

attention

attention_flash

attention

attention_paged_varlen

attention

attention_sdpa

blas

addmm

blas

bmm

blas

mm

norm

batch_norm

norm

group_norm

norm

layer_norm

distributed

exponential

distributed

normal

distributed

uniform

04
性能结果
>>   

实验设置

我们将实验设置统一为以下六个部分。

  • 硬件平台

评测平台为SG2044riscv64),具备RVV原生执行环境。

  • 软件版本

  • Python版本:3.11.6

  • Triton-RISCV commitce741e2587c9b08c65b4663d1d3ed425170e5810

  • buddy-mlir commitceb66d1bef69d9cd7bfe1a0b94748e982902aca3

  • 优化对象

评测对象来自triton-shared提供的Triton测例,包括matmulsoftmaxlayernormreducemaskgather_scatternested_loops等。

  • 基线选择

基线为triton-cpu,对应版本是在官方提交基础上加入RISC-V原生编译补丁得到的实现。我们将该实现也放到了RuyiAI-Stack中。

  • 性能指标

性能指标定义为执行时间相对triton-cpu的加速比:

Speedup = triton-cpu Wall Avg / Triton-RISCV Wall Avg

当数值大于 时,表示Triton-RISCV具有性能优势。

  • 评估方法

所有case均在单线程下测量Wall time,每个benchmark使用warmup=5repeat=20,取Wall Avg作为最终结果。

>>   

实验结果

在上述统一设置下,Triton-RISCV在纳入统计的 15 个算子中,平均加速达到 1.57x,峰值达到 4.16x(对应算子为matmul)。

05
如何使用

仓库地址:https://github.com/RuyiAI-Stack/triton-riscv

RVV平台(如SG2044)上,可直接按照README进行原生构建与运行。

06
结语

Triton-RISCVRuyiAI-StackAI编译栈中的一块关键拼图。它基于triton-shared接入Triton生态,并复用buddy-mlir的向量化能力,将Triton算子真正放到RISC-V/RVV平台上原生执行。欢迎大家试用、复现和反馈!