先说明一点:RISC-V 这几年在 AI 芯片圈子里热度确实高,但很多人对它的理解还停留在“又一个开源 CPU 架构”这个层面。真正上手做 AI 芯片的人会知道,RISC-V 切入 AI 的方式远不止“在 SoC 里挂个核”这么简单。它背后是一整套如何把开放指令集的灵活性转化成 AI 算力优势的方法论。这篇文章我就结合自己摸过的一些板子、跑过的一些工具链、看过的一些设计,把开源指令集切入 AI 芯片的三种主流姿势掰开揉碎讲清楚,给你一条可以直接参考的落地路径。
在 AI 芯片的语境下,指令集架构的选择本质上是在回答三个问题:算力从哪来、控制逻辑谁来管、软件生态怎么接。x86 有庞大的存量生态但不开放,Arm 授权费高且路线图受制于人,而 RISC-V 作为开源指令集,最大的价值在于“可修改、可裁剪、可扩展”。这意味着 AI 芯片公司可以不只把它当一个 CPU 核用,还能基于它长出属于自己的 AI 指令体系。这篇文章适合三类人看:正在做 AI 芯片产品规划的人、想评估 RISC-V 方案的系统架构师、以及在学校或实验室想用 RISC-V 做 AI 加速研究的同学。
1. 先把一件事说清楚:RISC-V 拿什么跟 AI 芯片扯上关系
1.1 开源指令集不是“免费 CPU”,而是算力定义的起点
很多人一听到 RISC-V,第一反应是“免费的 Arm”,这个理解偏差很致命。Arm 和 x86 是固化的指令集架构,你拿到的是设计和授权的二进制接口,指令集本身你改不了。RISC-V 的定位完全不同,它是一套开放的指令集规范,基础指令只有几十条,剩下的空间全部留给使用者自己定义。
放到 AI 芯片的场景里,这个差异一下就被放大了。AI 计算的核心操作是矩阵乘法和卷积,如果指令集是固定的,你就只能依赖 CPU 的 SIMD 指令或 GPU 的向量指令去表达这些计算,效率天花板是被别人定死的。但在 RISC-V 体系里,你可以为矩阵运算重新设计指令编码,定义向量寄存器宽度,甚至增加专用的算子和数据搬运指令。这种“算力由我定义”的能力,是 RISC-V 和 AI 芯片天然契合的底层逻辑。
我自己在接触 RISC-V 的 AI 方案时,最喜欢拿一个类比去解释这件事:x86 和 Arm 像是连锁餐厅,菜单是固定的,你只能从里面选菜;RISC-V 像是给你一个开放式厨房,基础调料免费,但你想做什么菜、怎么配比,完全自己说了算。AI 芯片又是一个极度需要“菜谱定制”的领域,因为不同场景对量化的精度要求、对矩阵形状的偏好、对数据流的组织方式都不一样,固定菜单很难同时讨好所有人。
1.2 AI 芯片需要的不只是“能算”,而是“算得对路子”
AI 芯片和普通计算芯片一个很大的不同在于,它的计算模式高度规律但极度消耗带宽。以卷积神经网络为例,一次推理可能有几十层卷积,每层都要做“数据搬进来、乘加、累加、激活、搬出去”这个循环。如果指令集层面不能高效表达这种数据流,芯片面积再大也白搭。
这里的核心指标有两个,一个是 MAC(乘累加)利用率,另一个是数据搬运效率。MAC 利用率取决于指令能不能把计算单元铺满,数据搬运效率取决于指令能不能让数据在正确的时机出现在正确的位置。
RISC-V 的可扩展性正好能在这两个指标上做文章。它允许你在基础指令之外新增自定义指令,这些新指令可以直达专用的矩阵计算单元,跳过传统指令的译码和调度开销。同时,RISC-V 的向量扩展指令可以配置较长的向量长度,一次性搬运大量数据进入向量寄存器,减少反复存取带来的功耗浪费。这些能力在我看来,比“CPU 跑得快”重要得多,因为这直接决定了 AI 芯片在真实 workload 上的能效比。
2. 姿势一:直接在指令集层做 AI 扩展,最硬核的一条路
2.1 什么是指令集级的 AI 扩展
所谓指令集级的 AI 扩展,就是不在芯片里单独塞一块 AI 加速器,而是把 AI 计算直接“翻译”成 CPU 流水线里的特殊指令。这类指令通常会操作专用的向量寄存器文件,由硬件直接完成矩阵乘、向量点积、激活函数计算等操作。
在 RISC-V 体系里,这个过程有两条路径。一条是拥抱官方标准,也就是 RISC-V Vector Extension(RVV)。RVV 1.0 在 2021 年冻结,定义了从 128 位到 1024 位可选的向量寄存器长度,提供了向量加载存储、向量算术、向量归约等完整指令。另一条是厂商自定义扩展,RISC-V 规范在指令编码里预留了大量 Custom Opcode 空间,芯片公司可以定义自己的私有指令,专门服务于自家 AI 引擎。
我见过不少团队在这两条路径之间犹豫。切入点其实很明确:如果你们的 AI 算法比较通用,要用主流的 PyTorch/TensorFlow 模型,那就优先跟进 RVV,因为生态工具链支持相对成熟;如果你们只做某一类专用模型(比如特定的人脸识别网络或者语音唤醒模型),自定义扩展能拿到更极致的效率。
2.2 RVV 向量扩展:通用 AI 计算的第一张门票
RVV 是目前 RISC-V AI 计算里最值得关注的标准。它解决了 SIMD 架构的老问题:固定向量长度导致代码在不同芯片间无法移植。RVV 将真正的硬件向量长度(VLEN)与程序可见的向量长度解耦,软件可以根据硬件实际能力动态调整参与计算的元素数量。
这个设计在 AI 推理里的意义很大。比如你在跑一个 batch size 较小的模型,向量宽度 128 位的芯片和 512 位的芯片都可以跑同一份代码,RV V 会自动把数据按可用的向量通道切分,不会因为硬件不同而改代码。我在测试一些开源的 RVV 算子库时发现,当 Vector Length 从 128 提升到 256,矩阵乘的性能基本能跟着翻倍,这种扩展性正是 AI 工作负载需要的。
但 RVV 也不是没有坑。第一个坑是版本兼容性。早期芯片用的是 v0.7.1 草案版本,后来标准冻结到 v1.0,两者指令编码差异很大,老的汇编和编译器无法直接兼容。如果你选用的芯片还停留在老版本 RVV,那新版本的推理框架基本跑不起来。我现在选型会直接要求硬件必须支持 RVV 1.0,否则后面软件适配的成本会高出好几个量级。
2.3 自定义 AI 指令:不做通用化,只做极致效率
自定义指令扩展是 RISC-V 相对 Arm 最有吸引力的地方,没有之一。你可以发明一条指令叫MATMUL_M8,操作数直接指向片上 SRAM 里的两个矩阵块,硬件在几个周期内算出整个 8x8 矩阵乘的结果。这类指令一旦定义好,编译器、汇编器、反汇编器、调试器都要跟着支持,所以不要轻易做,但做对了收益极大。
我看到过的成功案例里,自定义 AI 指令通常都集中在这几类操作上:低比特矩阵乘(INT8/INT4)、特殊激活函数(GELU、SiLU)、数据重排(transpose/pack/unpack),以及压缩稀疏数据的加载。这些操作在通用指令集上非常啰嗦,要写很多条指令才能完成,但定制成一条专用指令后,芯片里的控制逻辑和运算单元都能高度定制,能效比直接提高一个档次。
需要注意一点:自定义指令意味着你们团队的编译器能力必须跟得上。指令设计得再好,如果 GCC/LLVM 的后端没有对应的模式匹配,程序员就只能写汇编,这在实际项目里是不可持续的。所以我的建议是,自定义指令要控制在“少而精”的范围内,并且要和工具链团队从一开始就绑定开发。
3. 姿势二:协处理器架构,相当于给 RISC-V 请了个 AI 外援
3.1 “主控核 + AI 引擎”的分工逻辑
如果说指令集扩展是把 AI 计算塞进 CPU 的流水线里,那协处理器架构就是给 RISC-V 核配一个“专职外援”。这个外援通常是一片独立的 AI 引擎,拥有自己的控制逻辑、计算阵列和存储层次。RISC-V 核主要负责任务调度、数据预处理和结果解析,AI 引擎则干最重的矩阵运算。
这种架构的流行程度其实比很多人想象的高。市面上大量标注“RISC-V AI 芯片”的产品,内部基本都是一颗 RISC-V 控制核加上一个 NPU 或者 DSP 协处理器。控制核跑 RTOS 或 Linux,负责人机交互、网络协议栈;NPU 协处理器通过内存映射寄存器接口或多个 AXI 通道与主核通信。两边隔着一条总线谈生意,互联协议就是它们的“合同”。
选择这种方案的理由很现实:AI 引擎(NPU/DSP)是成熟的 IP,可以直接购买授权或者复用公司内部验证过的模块,RISC-V 核只需要做好控制和生态兼容。相比完全自主定义 AI 指令,协处理器架构的软件开发难度低很多,因为 AI 引擎有独立的编译器和驱动,不用去碰 CPU 后面那套复杂的指令调度逻辑。
3.2 协处理器设计里最容易被低估的三个环节
别看协处理器架构听起来简单,实际做起来有三个环节特别容易被低估。
第一个是缓存一致性。如果 RISC-V 主核和 AI 协处理器同时访问同一片内存,必须保证数据一致。最简单粗暴的方案是不做硬件一致性,通过软件屏障指令和驱动层的 flush 操作来保证,这个方案实现简单但性能打折。更高级的做法是接入系统总线的一致性端口,让异构计算单元共享同一份 L2 缓存视图,这会在流片验证上增加不少工作量。
第二个是数据搬运开销。有些团队设计的协处理器算力很高,但没注意数据在内存和 AI 引擎之间搬运的耗时。一个很典型的比喻是:你请了十个世界级大厨来切菜,结果食材从仓库运到厨房要一天,那大厨再快也没用。解决思路通常是在协处理器旁边配一个大容量的紧耦合 SRAM,并设置双缓冲机制,让数据搬运和运算可以重叠执行。
第三个是中断和同步机制。AI 推理是一个多个阶段串行的过程:前处理、算卷积、后处理。如果每一阶段完成都要主核轮询或者中断一次,中断延迟和上下文切换开销会吃掉不少性能。更聪明的做法是让 AI 协处理器支持“链式中断”,一个任务完成后直接触发下一个任务的开始,整个过程主核只在最后拿到结果。这个细节在评估 RISC-V 协处理器方案时最好跟 IP 厂商确认清楚。
3.3 什么场景适合选协处理器架构
协处理器架构特别适合两类场景。
第一类是端侧 AI 推理芯片,比如智能摄像头里的 NPU、耳机里的语音唤醒芯片。这些芯片的 TDP 可能只有几十毫瓦,没法跑一个复杂的乱序多发射 CPU 去做所有事,定制化的 AI 协处理器反而是效率最高的形态。RISC-V 主核在这里做“大脑中枢”,AI 协处理器做“肌肉”,分工非常明确。
第二类是车规芯片或工业控制领域的 AI 控制器。这类场景对实时性和功能安全要求高,RISC-V 主核可以跑经过认证的 RTOS,AI 协处理器专门做感知算法。两者物理隔离,互不干扰,天然符合安全隔离的设计要求。我在和做车规芯片的朋友聊的时候发现,他们反而对“AI 指令直接融入 CPU 流水线”这个方案非常谨慎,因为这会增加 CPU 核的安全认证难度,协处理器架构在这类领域更有优势。
4. 姿势三:从软件生态切入,轻资产但壁垒极高
4.1 指令集是入口,软件栈才是护城河
前面两种姿势都是偏硬件的玩法,但 RISC-V 切入 AI 芯片还有一个很多人忽略的维度:软件生态。原因是任何指令集架构最终都要靠编译器、算子库、运行时框架来承接上层 AI 框架的工作负载。没有软件,指令集就是一堆干巴巴的 0 和 1。
RISC-V 软件生态这几年进步非常快,LLVM 和 GCC 对 RISC-V 后端的支持已经比较成熟。我这里重点想说的不是工具链的基本适配,而是 AI 算子库的适配深度。比如 Intel 的 oneDNN 已经有针对 RISC-V RVV 的优化版本,阿里平头哥也开源了适配玄铁处理器的 AI 算子库。这些库做了大量的指令级优化,比如循环展开、向量寄存器复用、内存对齐访问,调用它们的算子比直接编译朴素 C 代码能快好几倍。
这就带来一个有意思的切入方式:你不是芯片公司,不设计硬件,但你可以做一款基于 RISC-V 的 AI 推理运行时,帮现有模型跑得更快更好。这种公司虽然不流片,但掌握了 RISC-V AI 生态的入口,商业价值同样很高。上游的芯片公司会主动来跟你做适配,因为他们的硬件需要成熟的软件栈才有意义。
4.2 编译器与自动向量化:把 AI 代码翻译成 RISC-V 指令的关键环节
软件切入的核心技术栈之一是编译器后端。RISC-V 在编译器上的特殊之处在于它的向量扩展很新,很多细节厂商和社区还需要打磨。
以 LLVM 为例,它对 RISC-V Vector 的自动向量化支持正在快速完善,但目前还不能完全替代手工优化的算子库。我自己实际跑下来,LLVM 的自动向量化可以处理很规整的循环数组计算,比如逐元素相加、逐元素相乘,这类代码的加速效果非常明显。但是一旦涉及卷积这种多维循环嵌套且带有复杂边界处理的算法,自动向量化生成的质量就不稳定,有时候生成的代码甚至比标量版还慢。
这里有一个实实在在的操作建议:如果在做 RISC-V AI 框架的算子移植,不要指望编译器替你解决所有性能问题。手写汇编或者使用内建函数(intrinsics)来编写热点算子,仍然是目前最可靠的性能来源。RVV 的 intrinsics API 在设计上比裸汇编友好很多,既保留了显式控制向量的能力,又能被编译器优化寄存器分配,是性能与开发效率之间的不错折中。
4.3 运行时与推理框架:AI 应用落到 RISC-V 的“最后一公里”
模型训练基本绕不开 PyTorch 或者 TensorFlow,但推理阶段的选择非常多。RISC-V 平台常见的推理框架包括 TVM、ONNX Runtime、Tengine、NCNN 等。它们对 RISC-V 后端支持程度各不相同,选型之前一定要做充分调研。
如果你们的部署环境是 Linux + 64 位 RISC-V,Tengine 和 ONNX Runtime 的 RISC-V 后端体验相对成熟,特别是有 RVV 优化的算子。如果是裸机或者 RTOS 环境,那更推荐用 TVM 或自研的极小化推理引擎,通过代码生成的方式把模型翻译成目标指令。我在评估这些框架时,有一个屡试不爽的方法:直接把目标框架交叉编译到 RISC-V 模拟器(比如 QEMU)里,跑一个最小的 ResNet-18 模型,看编译链路是否顺畅、算子是否都正确映射到了 RVV 指令。
不要小看这一步。很多团队把硬件设计的纸面性能吹得很高,但实际把 PyTorch 模型完整跑通的软件流程都还不健全。软件生态切入这个姿势,本质上是在帮行业补齐这一块,谁的软件栈能最快、最稳地承接现有 AI 模型,谁就赢得了 RISC-V AI 的“最后一公里”。
5. 三种姿势的选型对比与踩坑实录
5.1 横向对比:指令扩展、协处理器和软件生态该怎么选
三种姿势不是对立的,很多公司会组合使用。为了帮你快速判断,我在实战角度上把它们放在一个表里横向对比。
| 维度 | 指令集扩展(含 RVV 与自定义指令) | 协处理器架构 | 软件生态切入 |
|---|---|---|---|
| 算力上限 | 高,指令直达计算单元,延迟低 | 高,可独立优化计算阵列 | 受限硬件本身,重点在发挥已有硬件 |
| 软件复杂度 | 高,需要 GCC/LLVM 后端、调试器配合 | 中,NPU 工具链通常与 CPU 分离 | 中高,需要对接多种 AI 框架和算子库 |
| 硬件设计复杂度 | 高,需要改流水线和寄存器堆 | 中,主要是总线与存储互连 | 低,不需要碰硬件设计 |
| 生态兼容性 | 中,自定义指令越多越需要自维护工具链 | 高,主核跑标准 Linux/RTOS | 高,本身就是生态的一部分 |
| 适合团队 | 有 CPU/编译器背景的芯片原厂 | 大部分 AI 芯片公司,成熟 NPU 方案 | 软件公司、AI 框架团队、算法团队 |
| 典型风险 | 工具链割裂、生态分裂 | 数据搬运开销、缓存一致性问题 | 算子覆盖不全、性能优化难度大 |
从我观察到的情况看,商业上最成功的 RISC-V AI 芯片设计,往往是组合拳:主核用 RVV 跑通用任务,同时挂一个协处理器跑重负载卷积,软件层则提供从 PyTorch 到自家硬件的无缝迁移体验。这三种姿势互为补充,而不是互相替代。
5.2 实操中常踩的坑:指令集会“骗人”,理论算力不等于实际性能
无论你选哪种姿势,有几条经验都是从实际项目中踩出来的,这里单独列一下。
第一个坑是 RVV 版本兼容。前面提过,RV V 0.7.1 和 1.0 之间不兼容。很多芯片 IP 仍然声称支持“RVV”,但不说明是哪个版本,导致你的编译器无法生成正确代码。我在一个项目的初期就被这事坑过,拿到一块开发和测试板后,发现板子的 vector 指令编码和 LLVM 默认生成的不一致,最后花了一周多才用汇编补齐关键算子。强烈建议在选型时把“RVV spec version”写进采购合同的验收条款里。
第二个坑是自定义指令生态的“孤岛效应”。RISC-V 的自定义扩展一旦做出去,编译器、调试器、反汇编器、模拟器、性能分析工具都要跟随更新。如果团队没有编译器能力,宁可选择 RVV 标准加上协处理器的路线,也不要贸然发明自定义指令,否则你会发现自己被绑定在一个只有内部工具才能支持的小岛上,招人难、调试难、升级更难。
第三个坑是高估计算单元利用率。指令集扩展的初衷是让 AI 计算就地完成,但真实流水线的瓶颈往往不在运算单元而在数据供给上。向量寄存器需要从内存加载数据,这个过程如果缓存命中率不够,再强的 MAC 阵列也会空转。我习惯在一开始就做一次内存访问模式分析,看看模型的权重和激活值在片上能不能复用。如果发现复用率很低,就应该重新考虑数据布局,甚至调整指令设计,而不是盲目堆算力。
5.3 给不同背景团队的实在建议
如果你是芯片公司的架构师,我的建议是从“目标 workload”倒推指令集设计。先把你们要跑的模型量化、剪枝后的参数规模和数据流特征列出来,再决定哪些计算留给 CPU 流水线里的 AI 指令,哪些交给协处理器。站位高一点说,RISC-V 给了你一张足够宽的白纸,画错一笔的成本可比在 Arm 上买错授权高多了。
如果你是做 AI 应用的工程师,不需要从零理解硬件细节,但值得花时间了解 RISC-V 平台的推理框架差异,学会交叉编译和性能分析工具。你们当前最容易切入 RISC-V AI 生态的方式,就是为一个成熟的 RISC-V 平台适配几个常用算子并开源,这个动作虽然小,但很容易被社区和芯片厂商注意到,后续的职业空间会打得很开。
我自己在实际项目中体会最深的一件事是:RISC-V 和 AI 芯片的结合,真正比拼的从来不是单一指令的执行效率,而是从指令集定义到编译器适配再到模型部署的整条链路能否跑通。三种姿势里,最难的往往不是一开始做选择,而是选完之后能否坚持把工具链、算子库、驱动一层层补完。我见过太多项目在纸面上做了一个很漂亮的 AI 指令扩展,最后卡在没人愿意为它写编译器优化而烂尾。反过来,那些老老实实先把软件流程跑顺畅、再把硬件能力逐步做进去的团队,反而更容易在市场上站稳脚。所以,如果你正在考虑 RISC-V 切入 AI 芯片的路径,我的真实建议是:先选一个足够简单的模型,把它从端到端完整跑通,再去谈复杂的指令设计和高性能优化。步子大了容易扯到工具链,这是一个过来人的最朴素建议。