一块芯片从构想到流片,中间要经历的事情,比大多数工程师愿意承认的更像一场赌博。

不是那种明确赔率的赌博——掷骰子,概率六分之一,输了认栽。而是你甚至不知道赌桌上有多少种可能结局的赌博。一个基于RISC-V的处理器设计1,涉及流水线深度、发射宽度、缓存层次、分支预测策略等数十个可配置参数,排列组合超过\(10^{15}\)种。以每秒百万种的速度逐一检验,穷尽所有可能需要超过三十年。

这不是一道算术题。这是一种处境。

在封闭架构的年代,这种处境并不存在。使用商业IP核的SoC集成商在预定的框架里微调,天花板是别人定的。RISC-V把架构设计的自由交还给每一个人——同时也把选择的焦虑一并交还。当没有人再替你规定边界时,你必须自己面对整个可能性空间:每一个选择都合理,没有一个能被证明为最优。

每一次仿真需要数小时乃至数天,一个项目周期内至多跑几百次。用几百次机会去覆盖\(10^{15}\)种可能,这不叫探索,这叫在黑暗中摸索。

于是我们发明了各种聪明的办法来应对黑暗——代理模型、贝叶斯优化、多保真度近似、迁移学习,最近两年还加上了大语言模型:它们能生成RTL代码、预测设计指标、甚至从自然语言描述直接生成处理器配置。但所有这些工具——包括最令人兴奋的大语言模型在内——共享同一个致命的盲点。

这个盲点,说出来几乎令人尴尬:我们的模型学到的不是关于世界如何运作的知识,而是关于数据中什么与什么碰巧一起出现的记录。

你分析了一千组历史仿真数据,发现配备大L1 Cache的处理器普遍性能更高。代理模型忠实地学到了这条规律,在之后的优化中频繁推荐大缓存配置。一切正常——直到你查看这一千组数据的来源:团队过去三年的设计迭代,经验丰富的架构师的手工设计。这些架构师有一个共同的习惯:选择较深流水线时,出于对指令级并行的追求,他们往往也搭配较大的缓存来弥补分支惩罚。缓存大小对性能确有因果效应,但这个效应被设计者的偏好系统性地放大了。是混杂因素制造了大缓存与高性能之间夸大的统计共现。

这种污染以更隐蔽的方式存在于每一个使用历史数据的优化流程中:优化器推荐一个配置,仿真结果不如预期,你以为是模型精度不够,加了更多数据继续训练——而问题根本不在精度,在于模型从一开始就把虚假的统计关联当成了因果关系。你用更多的被污染数据去训练一个学习污染的模型,情况只会更糟。

这就是设计空间”液态”的第一层含义:我们以为自己踩到了坚实的地面——统计规律、相关模式、拟合精度——但脚下其实是流沙。从观测数据中估计的\(P(Y\vert X)\)被数据收集过程本身所污染:谁选择了哪些配置来仿真,以什么顺序,出于什么动机——这些混杂因素渗透进数据,然后被模型当成了关于世界的真理。换设计团队,规律变了;切换目标架构,规律变了;改一套工作负载,规律又变了。那些看似坚固的统计规律会像写在水面上的字迹一样消散——它们从一开始就是液态的,依赖于产生它们的那个特定历史情境。

不管你在\(P(Y\vert X)\)之上搭建多么精巧的上层建筑——更复杂的核函数、更聪明的采集策略、更深的神经网络、更大的语言模型——地基始终是液态的。当LLM能以资深工程师的口吻给出设计建议时,\(P(Y\vert X)\)的流动性被前所未有的规模和流畅性所掩盖:液态知识披上了固态的外衣。

需要的不是更好的上层建筑,而是更换地基。

更换地基意味着什么?

我们面对的是三种根本不同的知识。”经历性”的知识:我观察到\(X\)和\(Y\)一起出现,我记住了这个模式。”行动性”的知识:如果我主动改变\(X\),\(Y\)会如何变化。”反事实”的知识:如果当时做了不同的选择,结果会怎样。第一种是旁观者的知识,液态的,历史一变它就失效。第二种指向因果机制,不随观察者的位置而漂移。第三种超越行动,进入对可能性本身的推理。从观察到干预再到反事实——因果认知的阶梯,每上一级,知识就更接近固态,获取的代价也更高。

前两种知识的数学表达只差一个符号:\(P(Y\vert X)\)与\(P(Y\vert do(X))\)2。但这个符号标记的鸿沟,比它的排版尺寸所暗示的要深得多。\(do(\cdot)\)意味着干预——强行切断变量与所有上游因素的联系,将其钉死在你指定的值上,观察下游的反应。它拒绝接受世界”自然而然”的运作方式,主动打断因果链条中的某一环。

你观察到大缓存与高性能同时出现,不等于你主动设置大缓存就能获得高性能。前者是液态的,后者更接近固态——它描述的是因果机制,在因果模型假设成立的条件下具有更强的跨情境稳定性。但固态知识的获取代价远高于液态知识。要从观测数据中系统地计算\(P(Y\vert do(X))\),你需要一张因果图。而在芯片设计中构建因果图,就像试图在流动的河面上绘制一幅精确的地图。

困难的根源是哲学性的:你试图用有限的、被特定历史情境染色的观测数据,去推断超越任何特定情境的因果结构——从”这批数据里有什么模式”跃迁到”世界的因果结构是什么”。

第一重困难是混合变量。时钟频率是连续的,L1 Cache容量是有序离散的,分支预测器类型是无序分类的。当你需要检验”连续的时钟频率与离散的分支预测器类型在给定有序的Cache容量条件下是否独立”时,现有因果发现工具的可靠性急剧下降。第二重是样本量。两三百个仿真样本,三四十个变量,上千条潜在因果边——样本量比算法的理论需求低了一到两个数量级。第三重是验证。从观测数据学到的因果图只能确定到马尔可夫等价类3,确定因果方向需要干预实验,而每次干预的成本就是几小时的计算时间。

这些困难意味着你得到的因果图几乎必然包含错误。而一张错误的因果图可能比没有因果图更危险——它给你一种虚假的确定感。如果你的”固态”建立在错误的因果假设之上,它比坦诚的液态更有害。真正的问题不是”能否构建因果图”,而是如何在因果图必然包含错误的前提下仍然从中获益——如何让固态知识保留一丝液态的谦逊。

把\(P(Y\vert X)\)换成\(P(Y\vert do(X))\),不仅仅是一个技术操作,它改变了设计者与设计空间之间的关系。用\(P(Y\vert X)\)做决策,你是一个读取历史的人——翻阅仿真记录,找出模式,押注模式会延续,本质上向后看。用\(P(Y\vert do(X))\)做决策,你是一个试图改变未来的人——不问”历史上这个区域表现如何”,而问”如果我主动选择这个配置,预期收益是多少”。

但这个转变有隐含的代价。后门调整要求找到一组变量来”清洗”混杂偏差;调整集中的变量越多,估计的方差越大;在芯片设计的高维空间中,纠偏带来的方差膨胀可能吞噬它消除的混杂偏差。每一种纠错机制本身都引入新的误差来源——这不是因果方法独有的缺陷,而是认知活动的基本处境。更令人不安的是,你往往不知道混杂效应有多强,而这恰恰决定了因果纠偏是否值得。你不仅不知道最优点在哪里,你甚至不知道你选择的认知工具在当前场景下是否适用。

一种务实的策略是让因果方法和传统方法并行运作。两者推荐一致,说明混杂效应较弱;两者出现分歧,分歧本身就是信号——它暗示数据中存在显著的混杂偏差。用分歧来诊断混杂,比盲目信任某一种方法稳健得多。与其在液态和固态之间做非此即彼的选择,不如让两者的张力本身成为认知的工具。

同样的逻辑适用于优化器之间的协作。传统做法交换原始采样点——液态信息,换一个仿真环境就可能失效。更有价值的交换物是因果效应估计——”这个参数对性能的平均因果效应是多少”——经过凝固处理的知识,理论上不依赖于特定的数据收集过程。当然,如果因果图本身有错,”凝固”就是伪装。一切都取决于因果图的质量。

因果认知阶梯的前两级——关联和干预——处理的是”此地”。第三级——反事实——处理的是”本可以是的此地”:如果当时做了不同的选择,结果会怎样?

这个问题触及知识的一个根本性质:什么样的知识可以迁移?RISC-V生态系统中架构变体众多,每种架构的独立优化都需要消耗大量仿真预算,但问题远不止实用层面。

统计相关性不能迁移。”在BOOM上大Cache与高性能相关”——这条知识被锁死在BOOM这个特定情境中。BOOM是宽发射乱序核,其高IPC设计对Cache命中率有极强的性能依赖;Rocket是简单的顺序核,Cache未命中导致的流水线停顿模式完全不同。统计迁移看到的是”大Cache与高性能相关”这个液态的表层事实,然后天真地假设它在另一个环境中依然成立。

因果机制有可能迁移。”Cache容量通过影响未命中率而影响访存延迟”——这条因果链的某些环节反映的是存储层次结构的基本物理过程,在多数架构上可能是共通的。但另一些环节——未命中之后的惩罚如何通过流水线停顿传导为IPC损失——高度依赖具体的流水线实现,在不同架构上可能完全不同。问题的精确形式是:一条因果链上,哪些环节是”固态的”——跨越架构边界而保持稳定?哪些是”液态的”——随架构而变?区分两者,你就可以只迁移固态的部分,而对液态的部分在目标架构上重新学习。

但这里有一个诚实的循环困境:验证因果不变性需要两种架构上的足够数据,而数据稀缺恰恰是你想通过迁移来缓解的问题。你需要数据来验证迁移是否可行,但迁移的目的就是为了减少数据需求。只有不完美的近似能打破这个循环——用因果图的拓扑相似性作为机制稳定性的代理指标,或者在迁移的同时持续监测预测误差以检测机制漂移。

还有一个更根本的困境。反事实推理——”如果在BOOM上得到了性能\(y\),在Rocket上会得到什么?”——依赖结构因果模型。其一般形式允许任意函数关系\(V_i = f_i(\text{PA}_i, U_i)\),但反事实查询要求噪声项\(U_i\)可识别,最常用的实现方式——加性噪声假设——要求每个变量等于其因果父节点的确定性函数加上独立噪声。然而微架构设计中充满了交互效应和异方差性:ICache容量与DCache容量的联合影响不是各自影响的简单叠加,高时钟频率下功耗的波动远大于低频率下。假设不成立,反事实查询就不可靠——而你很难从结果本身判断它是否可靠。

这是整个方案中最液态的一环:你以为你已经站在了固态的因果结构之上,但脚下的结构方程本身可能是一个未经充分验证的假设。固态之下仍有液态。

一种方法如果不知道自己会在什么条件下失败,它就不是一种成熟的方法——它只是一种尚未被充分检验的乐观。

因果方法的失败模式至少有三种。

第一种:因果图错误。假设算法错误地认为”发射宽度\(\to\)功耗”之间存在直接因果边,而实际上发射宽度是通过增加功能单元面积间接影响功耗的。基于这条错误的边,因果贝叶斯优化在计算干预分布时跳过面积这个中间变量,导致功耗估计出现系统性偏差。在这个场景中,传统的\(P(Y\vert X)\)方法反而可能更好——它不假装理解因果结构,只是老老实实地拟合统计关系,至少不会被一个错误的因果假设额外扭曲。错误的固态比诚实的液态更有害

第二种:过度纠偏。后门调整通过边际化调整集来消除混杂偏差,但如果调整集选择不当——包含了\(X\)的后代节点,或者遗漏了关键混杂变量——纠偏的结果可能比原始估计偏差更大4。你试图把液态凝固为固态,结果反而制造了一种更顽固的偏差——因为它披着”因果纠偏”的外衣,让人更难察觉。

第三种出现在迁移场景中:因果不变性假设失效。你假设缓存容量对未命中率的因果机制在BOOM和Rocket上是相同的,于是直接迁移了对应的结构方程。但如果Rocket的缓存子系统采用了不同的替换策略,这条”相同”的因果边实际上对应着不同的底层物理过程。你以为自己在迁移固态知识,实际上迁移的是一段在目标架构上不成立的液态假设。

这些失败模式之间存在一种不对称性:传统方法的失败是隐性的——它被混杂偏差误导时,你从预测误差上看不出来,因为偏差被训练数据中的相同偏差所掩盖。因果方法的失败是显性的——因果图的不确定性原则上可以被量化,后门调整的适用条件可以被验证,迁移前后的预测一致性可以被监测。把隐性的失败变成显性的失败,本身就是一种从液态向固态的进步——不是让知识变得不可错,而是让错误变得可见。

因果图声称提供了比统计相关性更”固态”的知识。但它的”固态”究竟意味着什么?

因果图是一个模型。当我们画一条从”缓存大小”到”访存延迟”的因果边时,我们做了无数隐含的选择:为什么把缓存大小而非缓存行大小、组相联度、替换策略分别建模?为什么”访存延迟”被当作单一变量而非区分L1命中延迟和L2命中延迟?变量的粒度、边界的划定、哪些因素被纳入模型而哪些被归入”外生噪声”——这些选择本身就嵌入了设计者对世界的特定理解方式。因果图不是从数据中”发现”的客观真理,而是在数据、算法和人类判断的交互中”建构”的产物。它比纯粹的统计相关性更有结构、更能抵抗分布偏移、更接近物理机制——但它仍然是一种建构,带有建构者的视角和局限。

因果图也是液态的吗?在某种意义上,是的。它不是一劳永逸的终极真理,变量的定义可能改变,因果边可能被修正,整个图可能被重新绘制。但它与统计相关性的”液态”有一个关键区别:统计相关性的流动是无方向的——它随数据分布漂移而漂移,你无法判断它是在靠近真相还是远离真相。因果图的流动是有方向的——每一次验证、每一次干预实验、每一次对错误边的删除,都有可能向着更准确的因果结构收敛。

也许这就是因果知识的真正性质:不是固态,不是液态,而是正在凝固。它比统计模式更有形状,比物理定律更不确定,处在知识的相变过程中——从数据的无序流动,经由因果推断的结构化,逐渐凝固为对设计空间的可靠理解。这个过程永远不会完成,但每一步都有方向。

既然因果图是一种建构,它就不可避免地与其他认知方式发生对话。一位资深架构师的”直觉”往往比跑了三天的优化算法更可靠;大语言模型有时也能给出令人印象深刻的参数建议。但二者的”直觉”之间有一个根本的区别。

架构师说”把L1 Cache从32KB增大到64KB对这个流水线深度下的性能提升不大”时,他的判断背后隐含着一条因果链:这个流水线深度下L1命中率已经很高了,增大Cache的边际收益被饱和效应所抑制。这是一个可以被干预实验检验的因果性判断。LLM给出相似建议时,它的”理由”来自训练语料中类似场景的统计概括。追问它”在一种它没有见过的新流水线结构下,这个判断是否成立”——架构师可以沿着因果链推演出一个有依据的预测,而LLM只能外推训练分布中的统计规律,一旦超出分布,它的信心不减,但可靠性已经坍塌。

LLM的训练语料中确实包含大量因果性叙述——教科书、论文、设计手册。但记住因果叙述与拥有因果推理能力是两回事,正如背诵棋谱与理解棋理是两回事。LLM压缩了人类的因果知识,但压缩的方式是统计记忆而非结构性理解——面对训练分布之外的新情境,棋谱用完了,而棋理从未被真正掌握。这使得LLM成为一种独特的认识论现象:伪固态——输出具有固态知识的一切外观特征,连贯、自信、有理有据,但内部结构是液态的。规模可以让统计近似更精细,但不能跨越从相关到因果的逻辑鸿沟。这不是LLM的”缺陷”,正如液态不是水的”缺陷”——它是\(P(Y\vert X)\)这种知识形式的本性,不管承载它的模型有多大。

因果推理方法试图做的,是把架构师”正在凝固”的因果直觉显式化。形式化伴随着简化和损失,但它获得的东西不容忽视:可检验性、可传递性、可累积性。架构师的因果直觉随退休而消失,但从数据和知识中构建的因果图可以留给后来的人——也可以用来校准LLM的液态推荐,让后者在因果结构的约束下变得更加可靠。

三者之间的关系不是替代,而是三角对话。因果图在直觉到达不了的高维空间中提供指引,在直觉可能出错的混杂场景中提供矫正。LLM在因果图覆盖不到的角落提供快速的统计近似,在数据稀缺时提供来自更大语料库的先验。架构师的直觉为前两者提供它们最缺乏的东西:对”这张图画得对不对”“这个建议说得通吗”的批判性审视。

这种三角对话或许永远不会产生一张完美的因果图。但它会让知识持续凝固——不是冻结为僵硬的教条,而是结晶为越来越可靠的结构。

我们仍然在赌。\(10^{15}\)种可能性没有变少,仿真的代价没有变低,设计空间的液态本性没有改变。但赌的方式变了。不再是在黑暗中盲注,而是在一张正在凝固的地图上,有方向地落子。

  1. RISC-V是2010年诞生于加州大学伯克利分校的开源指令集架构,如今已成为学术界和工业界最活跃的处理器架构生态系统之一。 

  2. \(do(\cdot)\)算子是Judea Pearl在其因果推理框架中引入的核心概念,用于区分”观察”与”干预”。参见Pearl, Causality, Cambridge University Press, 2009. 

  3. 马尔可夫等价类是一组具有相同条件独立关系的有向无环图集合,它们从纯观测数据中无法区分。 

  4. 参见Cinelli, Forney & Pearl, A Crash Course in Good and Bad Controls, Sociological Methods & Research, 2022, 关于不当调整导致偏差放大的系统性讨论。