资讯动态

AI芯片软硬件协同设计:从算力焦虑到性能落地的关键技术与实践

发布时间:2026/10/20 7:23:54 来源:尧图企业网站定制
1. 从算力焦虑说起为什么AI芯片的软硬件协同设计成了必答题这两年跟做芯片和做算法的朋友聊天绕不开的一个词就是算力焦虑。模型参数从亿级飙到万亿级训练集群的规模从几百张卡扩到几万张卡可大家发现一个尴尬的现实硬件峰值算力年年翻倍但真正跑业务时能榨出来的有效算力往往连标称值的一半都不到。问题出在哪就出在软硬件之间那道看不见的墙。AI芯片的软硬件设计本质上不是先设计硬件再写软件的串行流程而是一个反复拉扯、互相妥协的协同过程。硬件决定了算力的天花板软件决定了你能摸到天花板的哪个位置。我见过太多团队硬件指标做得漂漂亮亮流片回来一跑真实模型性能直接打骨折最后发现是数据搬运路径没设计好或者编译器压根没法把算子高效映射到那套自定义的指令集上。这篇内容适合三类人看一是刚入行做AI加速器设计的工程师想搞清楚软硬件协同到底协同在哪二是做算法部署的开发者想知道自己写的模型为什么在特定芯片上跑不快三是技术管理者需要理解这个领域的核心权衡点好做技术选型和团队搭建。我会从计算架构、数据通路、编译映射、精度与能效这几个维度把AI芯片软硬件设计里那些真正决定成败的细节拆开讲穿插一些实际项目中踩过的坑和总结出来的经验。需要先说明的是AI芯片这个领域分支极多从云端训练大芯片到边缘推理小芯片从通用GPGPU到专用ASIC设计取舍差异巨大。我下面讲的内容尽量覆盖共性原理同时在关键分叉点上说明不同路线的选择逻辑。你如果是做某一特定方向的可以重点看跟你相关的章节。2. 计算架构的取舍MAC阵列、脉动阵列与可重构数据流2.1 为什么矩阵乘法单元是AI芯片的绝对核心要理解AI芯片的硬件设计先得理解AI计算到底在算什么。无论是卷积神经网络还是Transformer拆到最底层超过九成的计算量都落在矩阵乘法和卷积上。卷积本质上也可以展开成矩阵乘法所以硬件设计的核心命题就一个怎么用最快的速度、最低的能耗把两个矩阵乘起来。矩阵乘法的硬件实现最基础的单位是MAC单元也就是乘累加器。一个MAC单元在一个时钟周期内完成一次乘法和一次加法。如果芯片里有N个MAC单元并行工作理论上每个周期就能完成N次乘累加运算。这就是为什么AI芯片的算力指标通常用TOPS或者TFLOPS来表示——它直接正比于MAC单元的数量和运行频率。但这里有个反直觉的地方堆MAC单元并不等于线性提升有效算力。原因在于数据供给。每个MAC单元每个周期都需要两个操作数输入如果数据从外部内存搬进来带宽根本喂不饱这么多MAC。这就引出了AI芯片设计里最核心的矛盾——计算密度和内存带宽的匹配问题。行业里有个粗略的经验比例每1 TOPS的算力大约需要配10到20 GB/s的内存带宽才能让MAC阵列保持较高的利用率具体数值取决于模型的计算强度。2.2 脉动阵列的设计哲学与它的软肋说到矩阵乘法加速绕不开脉动阵列这个经典结构。它的核心思想很优雅让数据像水流一样在计算单元阵列中有节奏地流动每个计算单元从邻居那里拿数据算完再传给下一个邻居而不是每个单元都去访问中央内存。这样做的好处是极大地减少了内存访问次数数据复用率非常高。脉动阵列的典型代表就是那类把权重固定在阵列里、让激活值流过阵列的设计。权重预加载之后在推理阶段可以反复使用不需要每个周期都从内存读取。这个设计在早期的卷积网络推理上表现非常出色能效比极高。但脉动阵列有个软肋它对矩阵形状很敏感。如果矩阵的维度跟阵列的物理尺寸不匹配就会出现计算单元的闲置。比如一个128x128的脉动阵列遇到一个37x53的矩阵乘法边缘的计算单元就浪费了。更麻烦的是Transformer类模型里的矩阵形状变化非常频繁注意力机制里还有大量的逐元素操作和小矩阵运算脉动阵列处理这些就有点力不从心。所以现在很多新架构开始往可重构数据流的方向走让数据流可以根据算子类型动态调整牺牲一点峰值能效来换取更广泛的适应性。2.3 可重构数据流灵活性与能效的再平衡可重构数据流的核心思路是不把数据流固定死而是让编译器根据当前算子的特征动态配置计算单元之间的连接方式和数据搬运路径。这有点像FPGA的思路但粒度更粗配置开销更小。具体实现上通常是把计算阵列划分成若干可独立配置的簇每个簇内部有本地的数据缓存和路由网络。编译器在映射算子时可以选择让数据在簇内广播、在簇间流水或者做部分和累加。这种灵活性带来的好处是面对不同形状、不同类型的算子时计算单元的利用率能维持在一个比较高的水平。代价是硬件复杂度上去了面积和功耗都会增加而且对编译器的要求极高。编译器需要有能力分析算子的数据依赖关系然后搜索一个较优的映射方案。这个搜索空间非常大实际产品里通常会用启发式算法加人工调优的模板来平衡编译时间和映射质量。我个人的经验是可重构架构的芯片软件团队的实力往往比硬件团队更能决定最终产品的竞争力因为硬件提供了可能性软件决定了能不能把这种可能性兑现。3. 数据通路的隐形战场片上缓存、HBM与数据搬运优化3.1 片上缓存的层级设计与容量分配AI芯片的片上缓存通常分好几级从每个计算单元私有的寄存器文件到簇内共享的SRAM再到全局共享的L2缓存。每一级的容量、带宽和延迟都不同设计时需要在面积、功耗和性能之间做精细的权衡。寄存器文件离计算单元最近带宽最高但容量极小通常只够存当前周期要用的操作数。SRAM作为中间层容量从几百KB到几十MB不等承担着数据复用的重任。L2缓存则负责在多个计算簇之间共享数据减少对片外内存的访问。这里有个容易被忽视的设计细节缓存的bank划分和访问冲突。如果多个计算单元同时访问同一个bank就会产生冲突导致流水线停顿。好的设计会根据典型算子的访问模式来规划bank数量和位宽让并发访问尽量落在不同的bank上。我见过一个项目硬件指标很好但实际跑起来性能只有预期的六成最后定位到就是SRAM的bank冲突太严重计算单元经常在等数据。3.2 HBM的带宽利用率和访问模式优化片外内存方面现在主流的高性能AI芯片基本都用HBM。HBM的带宽确实高但能不能用满取决于访问模式。HBM内部有多个channel和bank如果访问请求能均匀分布到各个channel上带宽利用率就高如果大量请求集中在一个channel就会形成瓶颈。优化HBM访问的核心手段是数据布局的调整。比如把卷积的权重按照HBM的channel交错方式重新排列让连续访问能自然分散到不同channel。再比如对于大矩阵乘法把矩阵分块让每个计算簇处理一块块与块之间的数据在HBM上的地址尽量错开。这些优化通常需要编译器和运行时系统配合完成硬件设计阶段就要预留足够的地址映射灵活性。3.3 数据搬运的能耗账为什么少搬一次比多算一次更值钱在先进工艺节点下一次片外内存访问的能耗可能是一次片上乘加运算的几十倍甚至上百倍。这个数量级差异意味着优化数据搬运带来的能效收益往往比优化计算本身更大。我习惯用一个简单的模型来估算假设一次MAC运算的能耗是1个单位一次片上SRAM访问大概是5到10个单位一次片外DRAM访问则是100到200个单位。基于这个比例设计时的优先级就很清楚了——能放在寄存器里的就别放SRAM能放SRAM的就别放DRAM。很多算子融合技术的本质就是把中间结果留在片上避免写回DRAM再读出来。实际操作中判断一个算子融合是否值得做可以算一笔账融合后节省的DRAM访问次数乘以单次访问能耗对比融合带来的额外片上缓存占用和可能的计算冗余。如果节省的能耗明显大于额外开销就值得做。这个判断在编译器优化里通常是自动化的但作为设计者理解背后的逻辑有助于你评估编译器的优化效果是否合理。4. 编译器与指令集让硬件算力真正落地的最后一公里4.1 算子映射从计算图到硬件指令的翻译过程编译器要做的事情简单说就是把上层框架描述的计算图翻译成硬件能执行的指令序列。这个过程分好几步图优化、算子融合、内存分配、指令调度。图优化阶段会做一些等价变换比如把连续的逐元素操作合并把常量折叠掉。算子融合阶段决定哪些算子合并成一个kernel执行这是影响性能的关键步骤。内存分配阶段给每个张量分配片上或片外的存储空间目标是让数据搬运最少。指令调度阶段则要安排指令的执行顺序尽量填满流水线避免停顿。每一步都有大量的工程细节。以算子融合为例融合哪些算子、按什么顺序融合直接影响生成的kernel数量和内存访问量。融合得太激进可能导致片上缓存不够用反而要频繁换入换出融合得太保守kernel数量多启动开销和内存访问次数都上去了。好的编译器会根据硬件资源约束和算子特征自动搜索一个较优的融合方案。4.2 自定义指令集的设计原则与常见陷阱AI芯片的指令集设计跟通用CPU很不一样。通用CPU追求指令的通用性和正交性AI芯片则更倾向于为特定操作提供专用指令。比如矩阵乘法指令、卷积指令、激活函数指令等。设计自定义指令集时有几个原则值得注意。第一指令的粒度要合适。太细了指令条数多取指和译码开销大太粗了灵活性差遇到不匹配的算子就得拆成多条指令。第二要预留足够的寄存器空间和立即数字段减少对内存的访问。第三要考虑编译器的生成难度指令格式尽量规整寻址模式不要太复杂。常见的陷阱包括指令集设计得过于专用导致新算子出来时无法高效支持或者寄存器数量不够编译器频繁溢出到内存又或者分支跳转指令的效率太低影响控制流的执行。我见过一个设计矩阵乘法指令只支持固定形状结果遇到Transformer里的变长序列就傻眼了只能退化成标量循环性能直接掉了一个数量级。4.3 编译器后端的调优经验从能跑通到跑得快编译器后端调优是个细活。刚开始的目标是让模型能正确跑通生成功能正确的指令序列。这个阶段通常用一些保守的策略比如所有中间结果都放内存指令顺序严格按照依赖关系排。跑通之后就要开始压性能了。第一步通常是看瓶颈在哪是计算单元利用率低还是内存带宽打满了还是指令发射受限。这个可以通过硬件性能计数器来定位。如果是计算单元利用率低可能是数据供给不上需要优化数据复用和预取如果是内存带宽打满可能需要调整数据布局或做算子融合如果是指令发射受限可能需要减少指令条数或优化调度。我个人的经验是编译器后端的优化百分之八十的收益来自前百分之二十的优化点。先把最影响性能的几个大算子调好比如矩阵乘法、卷积、注意力机制整体性能就能上一个台阶。剩下的长尾算子优化收益递减可以放到后面慢慢磨。5. 精度、能效与可靠性那些流片后才暴露的设计问题5.1 混合精度计算的硬件支持与数值稳定性现在AI芯片普遍支持混合精度计算比如FP16、BF16、INT8甚至INT4。硬件上要支持这些精度需要在计算单元里设计可配置的乘法器和累加器。比如INT8的乘法器面积只有FP16的四分之一左右能效比高很多。但精度降低带来的数值稳定性问题往往在流片后才充分暴露。比如INT8量化如果scale选得不好激活值的动态范围一大就会溢出或者精度损失严重。硬件上如果累加器的位宽不够多个数累加之后也会溢出。这些问题在仿真阶段很难完全覆盖因为真实模型的数值分布千变万化。我的建议是硬件设计阶段就要给累加器留足够的位宽余量比如INT8乘法用INT32累加FP16乘法用FP32累加。同时软件层面要有动态量化的能力根据每层激活值的实际分布调整scale而不是用一个全局固定的scale。5.2 功耗墙与散热约束下的设计妥协高性能AI芯片的功耗动辄几百瓦散热是个大问题。功耗主要来自三块计算单元的开关功耗、片上缓存的漏电功耗、以及片外内存接口的功耗。在先进工艺下漏电功耗的占比越来越高有时候能到总功耗的三成以上。应对功耗墙硬件上常用的手段包括时钟门控让空闲的计算单元停止翻转电源门控把暂时不用的模块彻底断电动态电压频率调节根据负载调整工作点。这些手段都需要软件配合比如编译器要在指令序列里插入合适的门控提示运行时系统要根据任务队列的长度决定升降频策略。散热约束还会影响芯片的物理设计。比如计算单元的布局要尽量均匀避免局部热点HBM的摆放位置要考虑风道和散热器的接触面。这些在架构设计阶段就要考虑进去等到物理设计阶段再改就来不及了。5.3 可靠性设计从ECC到容错调度AI芯片通常用在数据中心对可靠性要求很高。硬件层面片上缓存和内存接口一般都会加ECC校验检测和纠正单位错误。计算单元也可能做冗余设计比如关键路径上的乘法器做双模冗余发现不一致就重算。软件层面的容错调度也很重要。比如训练任务通常跑很长时间中间如果某个计算单元出了瞬时故障导致结果错误整个训练可能就白跑了。好的运行时系统会定期做检查点同时监控硬件错误计数器发现异常就隔离故障单元把任务迁移到健康单元上继续跑。这些可靠性设计在消费级芯片上可能不是重点但在数据中心场景下是刚需。设计时要根据目标场景的可靠性要求在面积、功耗和容错能力之间做权衡。6. 软硬件协同的落地方法从架构探索到量产部署6.1 架构探索阶段的软硬件联合仿真在芯片定义阶段架构师需要评估不同设计方案的性能和能效。这个阶段通常用软件仿真器来做比如用C或SystemC搭建一个周期精确的模型跑一些代表性的模型负载看性能指标。联合仿真的关键是要有代表性的负载。我一般会选三类模型一类是计算密集型的比如大的卷积网络用来压计算峰值一类是访存密集型的比如带大量逐元素操作的网络用来压内存带宽还有一类是控制流复杂的比如带动态形状的模型用来测试调度器的灵活性。仿真速度是个大问题。周期精确的仿真通常比真实硬件慢几个数量级跑一个完整模型可能要几个小时甚至几天。实践中会用一些加速手段比如只仿真关键路径、用采样方法估计整体性能、或者用FPGA原型来加速。FPGA原型的仿真速度能到真实硬件的十分之一左右对于架构探索阶段足够了。6.2 流片后的bring-up与性能调优流程芯片回来之后的bring-up是个紧张刺激的过程。第一步是让芯片能跑起来通常从最简单的测试程序开始比如读写寄存器、跑一个小的矩阵乘法。这个阶段最常见的问题是时钟、复位、电源这些基础功能的问题需要跟物理设计团队紧密配合。跑通基本功能之后就开始跑真实模型做性能调优。这个阶段软件团队是主力硬件团队配合定位问题。调优的流程一般是先用性能计数器找到瓶颈然后分析是硬件设计的问题还是软件映射的问题最后决定是改软件还是等下一版硬件改。我经历过的一个项目bring-up之后发现某个算子的性能只有预期的三分之一。查了很久最后定位到是编译器生成的指令序列里有一条指令的寻址模式触发了硬件的慢速路径。改了一行编译器的代码性能就恢复了。这种问题在仿真阶段很难发现因为仿真器通常不会建模这种微架构的慢速路径。6.3 量产部署中的软件栈维护与迭代芯片量产之后软件栈的维护和迭代是个长期工作。新的模型结构层出不穷编译器需要不断更新来支持新的算子。硬件的bug可能需要软件workaround。客户反馈的性能问题需要及时定位和修复。这个阶段最重要的是建立一套完善的测试和发布流程。每出一个新的编译器版本都要跑一遍回归测试确保已有模型的性能不退化。同时要有一个性能监控系统在客户实际部署的环境里收集性能数据发现异常及时告警。软件栈的迭代还要考虑向后兼容性。客户可能已经在生产环境里跑着旧版本的软件新版本不能破坏他们的现有流程。通常的做法是保持API稳定新功能通过新的接口提供旧接口继续维护一段时间。7. 一些踩坑之后的个人体会做AI芯片的软硬件设计这些年最大的体会是这个领域没有银弹所有的设计决策都是权衡。你追求峰值算力可能就要牺牲灵活性你追求能效比可能就要接受更复杂的编程模型你追求快速上市可能就要在架构的前瞻性上做妥协。另一个体会是软件团队和硬件团队的沟通成本往往比技术难度本身更影响项目进度。硬件工程师习惯用周期和面积说话软件工程师习惯用算子和框架说话两边对同一个问题的描述可能完全对不上。我后来养成的习惯是在项目早期就建立一套共同的性能模型和术语表让两边能用同一种语言讨论问题。这个投入在后期会省下大量的扯皮时间。还有一个很实际的经验在架构定义阶段一定要留足够的余量。芯片设计周期长等流片回来可能主流模型已经换了一代。如果架构太紧贴当前模型下一代模型出来就可能完全不适用。留余量意味着在面积、功耗上做一些牺牲但换来的是更长的生命周期和更好的适应性。这个账算长远一点是划算的。最后说一个具体的技巧在评估一个AI芯片设计时不要只看峰值算力要看在真实模型上的端到端性能。峰值算力是理论值端到端性能才是客户真正关心的。我通常会拿几个有代表性的模型从框架层面一路测到硬件层面看每一层的开销和瓶颈在哪。这个过程中暴露出来的问题往往比看规格书有用得多。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑