SiFive 博客
来自 RISC-V 专家的最新洞察与深度技术解析

为您介绍 SKL:SiFive 算子库
我们非常高兴地宣布推出 SiFive 算子库(SiFive Kernel Library,简称 SKL,发音为 “skill”)。这是一个开源的高性能计算例程集合,专为 RISC-V Vector ISA (RVV) 及其各种扩展(包括 SiFive 的矩阵引擎)进行了深度优化。
SKL 中的算子是用于 SiFive 及其他厂商的 RISC-V 硬件上运行高性能应用程序的底层构建块。作为在 MIT license 下分发的独立源文件,这些性能原语专门设计用于集成到其他开源或专有项目和框架中。SiFive 已开始依赖 SKL 在保密协议下向客户展示 SiFive’s Intelligence™ 系列处理器的极致性能;现在,我们很高兴能将其分享给更广泛的 RVV 开发者社区。
RISC-V 若想持续崛起并成为优于其他架构的替代方案,将需要一个强大的软件基础,以稳定地从不同领域多样化的硬件产品中发挥出最高水平的性能。通过将 SKL 建设成为涵盖 AI 和机器学习等计算密集型领域核心算法的集中库,我们的目标是确保主流应用在 RVV 平台上永远不缺乏优化后的代码。本次首发产品主要侧重于 SiFive 的旗舰 IP,但我们的意图是让 SKL 能够以此为基础不断壮大,从而在当前及未来整个生态系统中,为所有高性能 RISC-V 系统发挥举足轻重的作用。
本文接下来的内容将深入探讨 SKL 的细节,包括其在 2026 年 8 月发布时的架构与特性。我们诚挚邀请读者前往 GitHub 访问其代码库,了解更多信息、关注最新动态,并积极使用和贡献 SKL: https://github.com/sifiveinc/skl
设计与特性
SKL 的核心功能以算子(Kernel)的形式提供。一个算子由单个源文件中的一个或多个 C 语言函数组成,例如矩阵乘法或 Softmax 等标准算法。每个算子都针对算法、数据类型、ISA 特性以及可能的微架构的具体组合进行了针对性优化。
SKL 的整体设计与核心特性可总结如下:
- 独立文件与可拆解性: 尽管算子可能会调用同一源文件中的其他函数,但每个算子均可通过单次函数调用来执行。在所有情况下,只需复制恰好三个文件即可从 SKL 中提取出一个算子:算子源文件
kernel.c、声明公共函数原型的头文件kernel.h,以及包含整个代码库所用最少通用定义共享头文件skl-common.h。 - 作为子模块的可组合性: 另一方面,某些项目可能会选择完整引入 SKL 的源码树,形式可以是标准的 Git 子模块,也可以是简单的目录克隆。SKL 算子的独立特性不强制绑定任何构建系统,从而极大地简化了这一过程:客户端项目只需直接访问
skl/src中的源文件,并通过其现有的构建机制进行编译即可。以此方式集成 SKL 的项目,只要仅依赖指定的公共 API,就能受益于算子的定期更新与底层性能优化。 - 极低的语言要求: 所有 SKL 算子均采用 C99 编写,并使用 RVV Intrinsics 或内联汇编。唯一的硬性要求是编译器需支持 RVV,不过使用自定义扩展指令的算子则需要相应的工具链支持。
- 无 libc 或其他库依赖: 使用 SKL 算子无需标准库 support,算子本身不执行内存分配、I/O 操作或系统调用。它们仅依赖如
stddef.h等定义性头文件,或如riscv_vector.h等 RVV 相关头文件,以获取对 vector Intrinsics 的访问权限。 - 针对流水线的特定优化与通用实现: SKL 既包含针对特定处理器流水线(如 SiFive 的 X390 微架构)进行人工精细调优的算子版本,也包含旨在作为关键算法规范化 RVV 向量化实现的通用版本。具有特定处理器优化的算子通常采用内联汇编编写,并在名称中注明其目标微架构;而更通用的函数则倾向于使用编译器 Intrinsics,并以所需的 ISA 后缀命名。
- 详尽的文档与测试配套: 所有 SKL 算子均通过每个头文件中的 Doxygen 注释提供 API 级别的文档。同时,多个 Markdown 格式的补充指南也伴随着相关算子库一同提供。代码库还在
skl/test/中包含了测试程序和基准测试定义,用于演示算子的预期用法并支持持续集成(CI)。 (一套基础的基于 CMake 的构建系统支持了此功能,但其初衷并非作为编译 SKL 算子的唯一甚至主要手段)。
功能领域
SKL 的核心内容可以按应用领域、ISA 需求和目标微架构进行拆分。
应用领域
功能扩展至以下领域:
- 矩阵乘法 (GEMM): 支持多种数据类型(16、32 和 64 位 IEEE 浮点数、BFloat16 以及从 8 位扩展至 32 位的四倍位宽整数)的 2D 矩阵乘法,以及特定的 4D 填充矩阵布局。
- 非线性函数: 覆盖同样广泛浮点数据类型的指数函数、softmax、sigmoid 线性单元 (SiLU) 和高斯误差线性单元 (GELU),主要用于激活函数或作为激活函数使用。
- 卷积: 许多卷积神经网络 (CNN) 都会使用通用 2D 卷积和深度可分离卷积(depthwise convolution)。前者可以通过 im2col 转换用 GEMM 实现,而后者需要特殊处理。SKL 包含了支持 HWC 数据布局的 2D 深度可分离卷积算子,并针对各种卷积核形状进行了优化。
- 数据搬移: 矩阵转置以及 packing/unpacking 函数,用于支持 GEMM 算子的使用。
- 数值计算: 发布时提供了来自 Open Compute Project 的各种低精度浮点格式之间的向量化转换函数。
我们预计,随着时间的推移,该列表将扩展到涵盖更多应用领域,并且每个领域内将包含更多算法。
架构支持
在上述算子系列中,提供了不同的实现,以利用 RISC-V “V” 扩展之外的广泛 ISA 特性,包括:
- Xsfmm{base, 32a8i, 32a16f, 32a32f}: SiFive 的矩阵引擎。
- Xsfvfexp{16,32}e: SiFive 的 16 位和 32 位指数函数指令。
- Xsfvfbfexp16e: SiFive 的 16 位 brain floating point 指数函数指令。
- Xsfvfexpa: SiFive 的指数近似指令。
- Xsfvfbfa: SiFive 的原生 brain floating point 算术指令。
- Xsfvqdotq: SiFive 的 8 位整数 4 元素部分点积指令。
- Zvfbfmin: 对 brain floating point 的最小支持(转换指令)。
- Zvfh: IEEE 半精度浮点算术。
- Zvfofp8min: 8 位 OFP 格式的转换指令。
- Zvfofp4min: 4 位 OFP 格式的转换指令。
虽然这些扩展中有很多都不是 RISC-V 标准,但随着新标准的批准,我们计划扩展此列表。
为 AI 做好准备
SKL 的首发功能经过精心挑选,旨在覆盖 AI 与机器学习(ML)工作负载中对性能最为关键的热点(Hotspots)。基于 Transformer 的大语言模型(LLM)受益于高吞吐量的矩阵乘法,以及在计算注意力分数时加速的 Softmax;而多层感知机(MLP)的计算则在结合硬件加速激活函数(如 SiLU)的同时,使用了相同的线性代数算子。这一切均由辅助算子提供支持,以便按加速指令的要求对张量数据进行打包和转置。这些操作共同构成了主流模型推理运行时间的大部分。
SKL 中的算子非常适合集成到模型服务框架中,作为其最底层、特定架构函数的即插即用替代方案。例如,PyTorch 的 ATen 张量库支持将张量算子的实现委托给自定义后端例程。vLLM 框架允许不同平台重新实现整个分页注意力(Paged Attention)算法,并将其余算子替换为原生库调用。此外,vLLM 和 ATen 已经验证了将整个算子库(例如 cuDNN 或 MKL BLAS)作为后端计算基底集成的可行性。SKL 已准备就绪,用于实现类似的功能。
未来展望
本次发布标志着 SKL 作为开源库的正式起点。只需快速浏览一下 GitHub 上的提交历史、开放的 Pull Request 列表以及社区讨论,即可确认这绝对是一个正在蓬勃推进的项目。然而,我们希望 SiFive 的初始贡献仅仅是这个故事的开端。SKL 的初衷不仅是供上游软件使用,更是为了拥抱来自整个 RISC-V 社区的贡献。
通过在统一的接口背后,将针对不同平台调优的核心算法集中于一处,SKL 能够加速重点应用对 RISC-V 的支持,并推进整个生态系统发展。随着 SKL 在其他库中的集成不断深化,RISC-V 硬件厂商会发现,通过 SKL 分发其针对特定处理器的优化代码将变得越来越有价值。同时,拥有庞大 RISC-V 用户群体的推理引擎也将看到向 SKL 添加新算子的巨大价值。SiFive 目前的焦点在于将 SKL 集成到 vLLM、PyTorch 及其他相关项目中,我们非常高兴能在此项持续性的工作中与开源社区深度合作。随着新模型的不断涌现,SiFive 将持续致力于添加对新兴算子和数据类型的支持,确保 SKL 在 RISC-V 平台上发挥出最佳性能。
随着本次发布,SKL 正式成为下一代 RISC-V 高性能计算的开源基石。我们期待看到社区利用这些精细调优的例程开发出更多创新项目,确保 RISC-V 能够满足每个新兴计算领域的高性能需求。













