
这两年做芯片的人聚在一起话题绕不开两件事AI算力从哪来以及整个行业被少数几家指令集生态锁得太死。RISC-V这个词在这种讨论里出现的频率越来越高不是因为它能直接对标英伟达的CUDA生态而是因为它提供了一条完全不同的切入路径——指令集开源、可裁剪、可扩展意味着做AI芯片这件事第一次可以在指令集层面掌握主动权。这篇文章就聊聊我看到的RISC-V切入AI芯片的三种典型姿势以及每种姿势背后的技术账、设计取舍和落地经验。三种姿势说白了一句话RISC-V想在AI芯片里站住脚要么让通用核本身能算要么去给专用加速器当管家要么干脆把自己堆成AI算力本身。这三条路不是谁替代谁的关系现实中很多芯片会把它们组合起来用。下面逐个拆开讲。1. 先看大势RISC-V凭什么切进AI芯片这摊事1.1 为什么偏偏是现在AI芯片的格局过去很清楚训练看英伟达推理看各种专用ASIC剩下边缘端的活儿各家自己做NPU。但这两年情况在松动原因有三。第一AI芯片的部署场景开始碎片化。云端还能靠统一架构硬顶但端侧、边缘侧、车侧、iot侧的模型大小和算子结构千差万别再用一套固定架构去套所有场景面积和功耗都受不了。这种碎片化恰好是RISC-V的舒适区——指令集可以根据场景裁剪加什么扩展、去掉什么指令全由自己做主。第二RISC-V的软件生态已经过了“刚能跑Hello World”的阶段。Linux主线支持、GCC/LLVM官方后端、QEMU模拟器、各类RTOS该有的基础设施都齐了。做AI芯片最怕的就是流片回来没有工具链兜底而现在RISC-V在这块已经基本能用。第三AI任务的计算特征从单一走向混合。一个大模型里既有矩阵乘这种规整算子也有大量动态shape、控制流、稀疏处理逻辑。传统上矩阵乘交给NPU剩下的活交给CPU而RISC-V作为一个可编程且可灵活扩展指令集的CPU天然适合承接这种混合负载。这也是为什么它能在AI芯片里找到生态位。1.2 三种姿势本质是三种算力组织方式我看了这么多RISC-V做AI的案例最终可以归成三种打法。第一种叫算力内化核心是给RISC-V核本身升级通过标准向量扩展RVV、自定义指令集、矩阵扩展等手段让一个通用处理器直接具备AI加速能力。你不需要额外挂NPU处理器自己就能把卷积、矩阵乘算起来。第二种叫算力外挂核心是异构SoC架构。RISC-V核不去死磕重算力而是作为主控CPU或者边核指挥一个或多个专用AI加速器干活。这种路线最务实短期内最容易出产品。第三种叫算力聚合核心是干脆把RISC-V核本身当作AI计算单元集成几十上百个甚至上千个核组成大规模并行阵列用可编程的方式逼近专用NPU的算力密度。这是最激进也最被低估的一条路。这三条路线各自适合谁、难点在哪我需要展开聊。2. 姿势一指令集扩展让RISC-V自己动手算2.1 向量扩展RVVAI计算的基本盘RISC-V切入AI最顺理成章的方式就是利用标准的向量扩展规范RVVRISC-V Vector Extension。RVV 1.0版本在2021年正式冻结这意味着软件生态可以围绕一个稳定规范来开发对做芯片和做工具链的人来说都是极大的利好。要理解RVV为什么适合AI计算先得理解几个核心参数。VLEN表示整个向量寄存器的位宽芯片设计时可选128位、256位、512位甚至更高。ELEN是单条向量元素的最大位宽一般做到64位就有足够通用性。LMUL是向量寄存器组的倍率控制着单条指令能同时处理的元素个数。最有意思的机制是vsetvl它可以在运行时动态设置向量长度让同一份二进制代码在不同的硬件实现上自适应地跑起来。这套设计跟AI计算的结合点在数据并行。矩阵乘、卷积、归一化、激活函数本质都是对张量做重复的同构运算这正是向量指令最擅长的场景。比如你要做一个卷积的im2col加矩阵乘用RVV可以把通道维度的累加分成多个向量组每个周期打多条数据吞吐远比普通标量循环高。我在实际测试中一个很深的感受是RVV的寄存器堆配置直接影响AI算力的上限。VLEN做到128位和512位同样的卷积循环性能可以差出好几倍。但VLEN做大也有代价寄存器堆面积、中断保存恢复的开销都跟着涨芯片设计时需要在并行度和面积功耗之间找平衡。2.2 自定义指令和矩阵扩展差异化竞争的关键RVV是标准化的但真正让RISC-V在AI领域拉开差距的是它允许在标准指令之外添加自定义指令和协处理器扩展。这是x86和Arm指令集给不了的自由度因为这两家都不允许你随便在指令集层面动刀。常见的做法有几类。一类是针对特定AI算子做专用指令融合比如把“取数-乘加-累加”压缩成一条复杂指令降低指令发射开销。还有一类是做矩阵扩展RVV处理一维向量很顺手但矩阵乘不可避免地涉及二维数据搬移和行/列访问于是有些芯片会在向量单元旁边增加矩阵寄存器文件。我见过一些芯片把激活函数也做成了硬件指令ReLU、GELU这类在AI模型里高频出现的非线性函数以往要写好几条指令处理现在一条自定义指令直接搞定。对最终性能影响未必巨大但对流水线的流畅度和代码密度的提升是很明显的。但这里要泼盆冷水自定义指令是把双刃剑。你加了私有扩展性能是上去了可编译器、调试器、算力库全得跟着适配做大了就形成一个封闭的小生态。很多团队做到一半才发现花在工具链适配上的时间比硬件设计还多。所以我一直建议自定义扩展之前先想清楚这个指令真的非加不可吗能不能用标准RVV拼出来2.3 一套能跑的RVV代码长什么样光说有RVV不做点代码读者可能没概念。这里贴一段我实际验证过的SAXPY向量代码就是向量版“y a*x y”这是AI里最基础也最常用的一类操作。#include riscv_vector.h void saxpy(size_t n, float a, const float *x, float *y) { size_t vl; for (; n 0; n - vl, x vl, y vl) { vl vsetvl_e32m1(n); vfloat32m1_t vx vle32_v_f32m1(x, vl); vfloat32m1_t vy vle32_v_f32m1(y, vl); vy vfmacc_vf_f32m1(vy, a, vx, vl); vse32_v_f32m1(y, vy, vl); } }这段代码的核心逻辑是循环每次先计算当前还能处理多少个元素然后从内存加载x和y的向量做一次融合乘加再存回去。vfmacc是一条典型的融合指令把乘法和加法压成一个操作既减少指令数又提高精度因为中间结果不截断。用这种方式写矩阵乘思路就是对输出矩阵的行做向量化切分然后在内层循环里连续累加。编译时需要用-marchrv64gcv这样的参数打开向量指令工具链会自动把intrinsics映射到对应指令上。一个很关键的点是RVV的代码一定要写成“运行时自适应VL”的形式千万别写死VLEN。同一种芯片有128位VLEN和512位VLEN两个版本代码写死之后就只能在一个版本上高效运行那RVV最值钱的可移植性就废了。这也是RVV规范和x86的AVX这类固定向量长度指令集最本质的区别之一。3. 姿势二异构SoC里当主控和边核3.1 主从架构AI算力还是交给专核如果是想快速做出一个能打的AI芯片很多人不会选择让RISC-V硬扛算力而是采用异构SoC架构主控CPU用RISC-VAI计算交给专门的NPU/DSP/加速器。这种设计里RISC-V核的角色是熟练工不是大力士。这么做的理由非常现实。专用NPU在单位面积和单位功耗下能给出的AI算力短时间内通用向量处理器追不上。你看一款边缘AI芯片NPU部分动辄几TOPS的算力如果只用CPU核的向量单元去算光一个几十兆的模型就得跑几秒钟完全没法商用。所以让专业的人干专业的事RISC-V做控制和管理NPU做重活。这种架构在市场上已经有不少落地案例。比如平头哥的TH1520就是一个多核RISC-V SoC集成了玄铁C910系列处理器同时带有专门面向AI应用的NPU。这类芯片拿来跑端侧视觉、语音识别、智能交互都很合适。结合当前的行业背景来看这类产品正好踩中了AI应用从云端下沉到边缘的大趋势。3.2 RISC-V在SoC里到底干什么活主控RISC-V在SoC里的任务可以说比单纯算AI还要复杂。它首先要跑Linux或者一个完整的RTOS负责整个系统的调度、内存管理、中断控制和外设驱动。AI这块它需要做三件事任务分解、数据搬运调度、算力资源分配。任务分解是指把一个大模型推理拆成算子在NPU上的执行序列比如先做卷积再做池化再做全连接每个算子在NPU里对应一小段可执行代码。数据搬运调度是指通过DMA或者专门的硬件搬运引擎把输入图片、权重、中间特征图在DDR和NPU的片上SRAM之间来回倒腾。这块如果做得不好NPU再快都会被数据搬运卡死。算力资源分配则涉及同一颗SoC上可能有多个NPU核怎么把不同的推理任务分配到不同的核上保证整体延迟和吞吐的平衡。这些活看起来不起眼但实际开发的工作量非常巨大。我见过很多团队花三个月把NPU本身设计完成结果在驱动和runtime层面耗了快一年。主控CPU的执行效率、操作系统调度的实时性、DMA链路的规划这些系统级指标最终决定NPU实际能不能跑满标称算力。3.3 CPU如何指挥NPU干活一条任务链的完整流程为了让读者有个具体认知我把CPU指挥NPU做一次推理的完整流程梳理一遍。第一步CPU初始化NPU。上电后通过寄存器访问或者固件加载把NPU从复位状态拉到正常模式配置好中断控制器、时钟、电源域。第二步CPU准备任务描述符。这个描述符相当于一纸说明书里面写了要执行哪种算子、权重和输入数据的内存地址、输出放在哪里、长度是多少。它会被放在一块CPU和NPU共享的内存区域并且在物理地址上要连续或者符合NPU的地址映射要求。第三步CPU通过一个叫“门铃”的寄存器通知NPU。把任务描述符的地址写入NPU的某个寄存器然后写入一个起始命令。NPU会立刻通过DMA去读取任务描述符然后开始执行内部指令流水线。第四步NPU执行完毕后产生中断。中断控制器把信号传给CPUCPU的中断服务程序里回收这片内存读取输出结果然后交给上层应用。看上去只有四步每一个环节都有讲究。任务描述符的格式要是设计得不好CPU填充成本就会很高门铃寄存器的MMIO地址要不是配置好了内存屏障CPU写入顺序错了NPU可能读到半份描述符中断频繁来了CPU大部分时间都在处理中断而不是调度新任务。这些细节在真实芯片上都是坑而且每个坑都会反映到AI模型的端到端延迟上。4. 姿势三把RISC-V自己变成AI算力4.1 用数量堆算力大规模核阵列的路线第三种姿势是最激进的直接放弃“CPU加NPU”的主从模式把RISC-V核心当作AI计算的基本单元在芯片上集成几十、几百甚至上千个RISC-V核把它们连成一个大规模并行计算阵列。这条路线的基本逻辑是在相同面积和功耗预算下大量简单核心的聚合算力可以媲美一个重型的专用NPU同时保有指令集层面的可编程性。专用NPU一旦流片回来算子功能基本就固定了遇到新算子只能靠上层算法绕。但如果是RISC-V核阵列新的算子可以通过软件编程灵活支持这种可重构性是很多团队押注的重要理由。业界已经有真实的探索。Esperanto的ET-SoC-1芯片集成了超过一千个RISC-V核心主打推荐系统推理场景走的就是大规模核阵列路线。Tenstorrent也把RISC-V核心作为自己AI加速方案中的控制与可编程部分并且不断推进采用RISC-V架构的系统开发。这些尝试都说明RISC-V核心阵列在特定AI场景下确实有机会形成战斗力。4.2 这类架构要过哪几道设计关但大规模RISC-V核阵列不是把核心简单复制粘贴放到芯片上就能成事至少有四道关要过。第一道关是核间互联拓扑。核多了之后数据怎么在核之间流动是决定性因素。常见的mesh网格拓扑、ring环形拓扑各有优劣mesh带宽高但布线复杂ring布线简单但延迟随核数增长。对于AI推理这种数据局部性很强的负载核和核之间的数据交换模式必须在架构设计阶段就充分分析清楚。第二道关是存储层级设计。每个核配多少私有的L1多少个核共享一个L2内存访问延迟怎么控制直接影响计算单元能不能吃饱。重量级模型通常跑在DDR上片上SRAM容量又极其有限数据预取和缓存策略稍有问题核心就大量时间在等待内存。第三道关是编译和映射工具。这一点可能是最难的。要让上千个核协同工作得把模型的计算图切分并映射到核阵列的空间分布上还要自动编排数据通信。这类工具链的开发量堪比做一个新编译器而且五个核心做到很顺畅不代表五百个核心还能顺畅。第四道关是功耗和热设计。大量核心同时工作带来的功耗密度非常高近阈值计算技术虽然能压低能耗但对工艺偏差和电压噪声很敏感芯片设计复杂度大幅上升。做核阵列芯片的团队如果对功耗管理没有经验流片回来大概率面临散热噩梦。说到底这条路适合资金和团队实力都很充足的玩家不是小团队能轻易啃下来的方向。5. 三种姿势怎么选从团队和场景倒推5.1 一张表看懂差异我把三种姿势的特点整理成一张对比表方便读者按图索骥。对比维度姿势一指令集扩展姿势二异构SoC主控姿势三大规模核阵列核心思路提升通用核自身算力CPU与专用加速器分工用大量核聚合算力算力实现向量/矩阵指令并行NPU/DSP提供主要算力核间协同并行计算硬件设计难度中等集中在向量单元中等难点在系统集成高难点在互联与工具链软件工作量较大需优化算子库最大驱动与runtime为主极大需要完整编译映射工具产业成熟度中高RVV规范成熟高已有大量落地产品较低仍在探索验证期适用场景边缘轻量AI、嵌入式端侧AIoT、车载、视觉推荐系统、云端推理等特定场景这张表只是帮大家快速建立直觉具体到真实项目还得结合团队自己的能力来定。5.2 按团队基因和落地场景来选如果你是软件背景团队想做一套AI计算方案落地到端侧产品里优先考虑姿势二。原因是这个方案里RISC-V核基本可以用现成的IP授权硬件风险小主要投入在驱动、runtime和应用适配层面软件团队有活干也能发挥优势。我最常给的忠告是别一上来就自己设计编译器先靠现成工具链把整条链路跑通。如果你是有处理器设计经验的团队想在AI领域建立差异化姿势一值得投入。通过定义私有扩展指令你可以沉淀出别人拿不走的算子加速能力。但前提是有编译器团队跟着配合否则指令做得再漂亮上层程序编不出来也白搭。如果你是研究型或者资金充裕的项目组对极致能效比或新计算模型感兴趣可以关注姿势三。这类项目的核心价值不是推出一款产品而是在可编程AI架构上积累经验属于长线布局。选型的三个关键问题团队离硅片更近还是离软件更近产品要在一年内落地还是可以布局三年五年目标场景是通用模型还是高度定制模型把这几个问题想清楚答案基本就出来了。6. 想动手从这几条路径切入RISC-V AI6.1 模拟器先行零成本认识RVV工具链对大多数人来说第一块RISC-V AI开发板不一定要真金白银去买先在QEMU模拟器里把代码跑起来成本最低反馈也最快。QEMU支持riscv64架构同时也支持RVV指令模拟你可以把上一篇文章里那套SAXPY代码在QEMU上编译运行。要启用RVV需要不同的配置方法例如以qemu-system-riscv64加上对应的CPU配置参数或者使用qemu-riscv64用户态模拟直接指定-cpu rv64,vtrue这样的参数具体版本细节可以查阅对应发行版的QEMU文档。编译工具链建议用官方提供的GCC工具链记得加上-march参数。在模拟器里跑通向量代码最大的价值是让你快速理解VL、LMUL、vsetvl这些抽象概念在运行时到底怎么工作。你在模拟器里写的代码核心逻辑基本可以平移到真实开发板上因为RVV规范是固定的只是性能和运行行为有差异。6.2 选一块合适的开发板如果项目逻辑已经跑通下一步就是上板验证选板的时候要重点关注三样东西主控RISC-V核心的算力、是否带NPU或向量扩展、以及Linux生态的成熟度。市面上主流的选择有搭载TH1520芯片的LicheePi 4A它集成了玄铁C910系列核心并且带NPU适合想体验“RISC-V CPUNPU异构”的开发方式。还有搭载JH7110芯片的VisionFive 2平台四核RISC-V核心跑Linux比较流畅虽然没有强NPU但用RVV跑轻量模型也够了。如果你只是想把RISC-V当作一个普通的Linux计算机来用它也能实现整套体验已经接近传统的ARM开发板。我个人的建议是除非你想专门研究NPU驱动否则第一块板子选带向量扩展、Linux生态成熟的最好别一上来就陷入NPU驱动调试的深水区。6.3 在开发板上跑通一个AI推理demo跑AI推理demo的完整路径大概是先准备一个PyTorch或者TensorFlow训练好的模型导出成ONNX格式然后通过RVV算子库或者推理框架的RISC-V后端去做推理优化。实际执行的时候如果板子带的NPU有官方工具链流程会比较顺类似量化、编译部署。如果是纯CPU方案就得看RVV的软件生态支持程度。第一步把依赖库交叉编译到目标板第二步写一个简单的图像分类主程序第三步对比同一模型在RVV向量优化开启和关闭下的推理延迟观察性能差异。实测下来卷积层的算子在RVV优化后有明显收益但全连接层和动态shape算子可能收益有限这也符合直觉。这个demo能跑通你就把RISC-V AI开发的基础链路串起来了剩下的就是针对具体模型做算子级优化。7. 踩坑清单RISC-V AI路上的高频雷区7.1 工具链细节的雷RISC-V工具链目前最大的坑就是版本和配置参数的不统一。同一个GCC版本不同分支对RVV的支持程度可能完全不同-marchrv64gcv0p7和-marchrv64gcv1p0两套参数对应不同的RVV版本编出来的二进制不兼容。我见过不止一次开发者在GitHub上找到一段很好的RVV代码编译的时候报出一堆非法指令错误最后发现是工具链默认不启用向量扩展或者CPU模拟器的配置没打开RVV支持。遇到这类问题第一反应不要怀疑代码先检查三个地方交叉编译器版本及配置、-march编译参数、用户的CPU模拟配置是否匹配。尤其是模拟器相关的配置很多人会忽略它的默认特性集其实是比较保守的。7.2 性能调优的思路偏差很多团队在拿到RISC-V AI芯片后一上来就死磕算力指标结果性能上不去就开始怀疑指令集架构不行。实际上大部分AI推理性能问题出在内存带宽而不是计算单元本身的吞吐能力。如果你的模型权重已经超过片上缓存容量那每次读取权重都要走DDR访存带宽很快成为瓶颈。调优的正确姿势是先剖析瓶颈在计算还是访存。方法也不复杂算一下运行卷积时理论所需的数据搬运量再对比芯片实际访存带宽如果数据搬运时间远超计算时间那再怎么优化计算指令都没用得从数据复用、算子融合、减少中间张量搬运这些角度入手。算子融合就是把多个算子的中间结果留在片上寄存器或缓存里不往返DDR这在AI推理优化里是最立竿见影的手段。7.3 生态适配的现实问题RISC-V AI生态现在最客观的短板是主流深度学习框架对RVV后端支持不够深入。PyTorch官方对RISC-V的支持还处在比较初级的阶段你要么自己改框架源码要么通过ONNX转换到推理引擎要么手写算子改框架之后遇到新版本又得重新适配。这部分工作很多时候比优化算子本身更耗时。另外一个现实问题是调试体验。RISC-V的调试工具链虽然有OpenOCD、GDB等支持但跟主流平台的成熟度相比还是有差距。多核调试、向量寄存器的查看、性能计数器的可视化这些工具都不如其他主流平台顺手。所以开发RISC-V AI项目建议在设计阶段就把日志和可观测性考虑进去否则上了板子之后查起问题来会很痛苦。还有一点值得注意指令集虽然统一但各家自定义扩展之间有差异导致代码在不同RISC-V平台之间移植时需要抽象好指令层。合理的方式是在应用层代码和指令集细节之间加一个适配层把RVV内置函数和自定义指令包一层换平台时只改这一层而不是全员大改。这个设计经验能帮你避免很多后期的维护噩梦。结合我自己的体会来看RISC-V做AI芯片这件事已经从“能不能做”进入到了“怎么做更好”的阶段。三种姿势分别代表不同的风险偏好和资源禀赋没有绝对的最优解。如果你有靠谱的工具链人手姿势一可以在边缘AI站稳脚跟如果团队想快速出产品姿势二是最稳妥的起点如果眼光放得够远姿势三在未来的高能效AI场景里会有惊喜。不管选哪条路早点上手跑代码、跑模型、趟坑永远比停留在路线讨论里有价值。