同一道矩阵乘法,两个程序都算对了,能拿来做同样的 GPU 架构实验吗?缓存怎样被使用、线程怎样访问内存、工作落在哪类计算单元上,都会影响答案。最终数值相近,只覆盖了其中一层。
近日,Huanzhi Pu 等作者发布 VortexSynth 论文,利用性能剖析,也就是 profiling,驱动 Agent 重建 GPU 基准。研究以开放 RISC-V GPGPU 平台 Vortex 为目标,从机器人学习负载中抽取热点内核,构建包含 26 对 Vortex/CUDA 内核的 VX-Robotics 套件。
作者报告,全部 26 对内核通过规定容差内的两道输出检查。Agent 怎样改代码,比通过数量更有看头。一个注意力矩阵乘法案例中,Agent 主动降低访存合并效率,让候选更接近参考负载。
基准重建需要分开回答三个问题:数值能否对上,资源压力是否相似,这种相似能否支撑目标架构上的研究判断。VortexSynth 把前两项组织成了可追踪的迭代流程,也让第三项的验收对象更清楚。
![]()
新架构先要有合适的题目
研究 GPU 缓存、调度器或计算单元,需要能触发相关行为的程序。新架构的困难往往从软件开始:应用调用了厂商库,库内核可能没有可直接取得的源码;即便源码可得,异步复制、张量计算和编程接口也可能需要适配。
VortexSynth 从应用上下文重建热点内核。输入包括算子调用、张量形状、操作数与累加精度、线程块大小、启动网格,以及测得的资源使用信息。内核名称能提供部分线索,但论文要求这些线索与测得的启动结构交叉核对,未公开的命名约定留给搜索处理。
研究选择 ACT、Diffusion Policy 和 Pi0 三类机器人学习负载,在 H200 与 Jetson AGX Orin 上以批量大小 1 做 profiling。随后按 GPU 时间选择热点,形成覆盖线性层、矩阵乘法及一维、二维卷积的套件。
热点切片有明确用途。架构研究经常需要反复运行仿真,抽取内核能把单次实验控制在更适合探索的范围内,同时保留被测形状。使用者也需要保存切片来源:它属于哪个模型、哪种输入、哪次算子调用,才能判断它适合研究什么。
为什么每轮都生成两套代码
每次修订,Agent 先生成 CUDA 候选,再生成对应的 Vortex 候选。CUDA 侧在 NVIDIA GPU 上执行,Vortex 侧在 SimX 仿真器上执行;两者按同一优化方向保持实现策略对应。
这套安排把行为比较放在参考平台上。CUDA 候选被嵌入原应用,与参考内核在同一类测量环境中比较。Vortex 候选承担目标侧执行与输出检查,CUDA 候选则提供 Nsight Compute 的 profiling 反馈。
替换入口也需要检查。论文包装选定的 PyTorch 算子入口,形状匹配时转向生成内核,其余调用保留原实现,并记录调用签名与分发决定。否则,输出检查通过可能只是原库继续算出了答案。确认候选实际执行,是这条链的第一项工程条件。
Agent 的修改范围受到沙箱约束。它不能偷换算法、改变替换对象、调用厂商库绕过生成任务,或重放缓存答案。允许调整的方向包括分块、共享内存暂存、寄存器复用、软件预取和线程映射等,并要求能够在 Vortex 上表达。
流程先做两道输出检查:CUDA 候选与参考操作比较,再把相同输入交给 CUDA 与 Vortex 候选比较。任一道失败,本轮即被拒绝。两道都通过后,系统才测量行为差异,并决定保留还是回退。
26 对通过,要连着容差读
输出一致在这里指逐元素满足绝对误差与相对误差组成的判定。论文为不同精度路径设置不同阈值,不能把“通过”读成逐位相等。
表中有 9 对 FP32、7 对 TF32 到 FP16,以及 10 对 BF16。FP32 的绝对和相对容差均为 0.001;BF16 均为 0.01。TF32 路径的相对容差为 0.25,CUDA 到 Vortex 的绝对容差为 0.002,用来容纳目标侧精度变化。
实际误差与接受阈值也要分开。作者报告,TF32 到 FP16 候选之间的最大相对误差为 0.095;BF16 在接近零的输出上出现 0.032 的相对误差,但仍通过组合判定。数值接近零时,相对误差容易变大,绝对项会影响最终判断。
这些结果给出了测试输入上的输出一致性。团队采用同类方法时,应先按研究用途固定精度路径和接受标准,再决定哪些形状、输入分布与边界情况需要补测。“通过”必须连着测试条件交付,否则后续比较很容易失去依据。
更像参考,有时要降低效率
VortexSynth 用 profile signature,也就是一组资源使用指标,描述参考行为。十项指标分为四组:缓存与访存、计算引擎与结果提交、每字节计算量与带宽,以及机器并行利用情况。
系统把各项差异转换到共同尺度,再取可测分量的均值,得到签名距离 D。候选需要在输出检查通过的前提下,使 D 的改善超过 0.005,才会被保留。反馈同时提供各分量差异,帮助 Agent 选择下一次修改方向。
Pi0 注意力矩阵乘法给出了完整过程。初始 CUDA 候选保留了张量计算引擎、BF16 输入与 FP32 累加、每块 128 个线程等条件,但 L1 命中率只有 14%,参考为 89%,算术强度约为参考的四分之一,D 为 0.2397。
Agent 调整分块和数据暂存,再通过软件预取修复部分带宽差异。几次未带来足够改善的尝试被回退。最后,它反向调整线程访存映射,让连续线程访问不同内存扇区,访存合并效率降至 29%,更接近参考的 37%,D 降至 0.0820。
常规内核优化通常希望把访存安排得更紧凑。重建实验则需要保留被研究对象的资源压力。参考负载若有低合并效率,候选把它优化掉,就可能改变缓存或内存系统实验面对的问题。作者案例中,“降低效率”是为了改善行为匹配。
最终结果还保留了不同程度的差异:算术强度仍约为参考的四分之一,L2 命中率为 76%,参考为 91%。D 是聚合距离,0.0820 不能换算成“复刻度 91.8%”。若团队研究 L2 缓存,相关分量应单独进入验收标准。
代理反馈怎样影响架构判断
资源指标带着测量平台的特征。论文指出,相近的资源使用模式可能对应不同的指令调度、停顿原因、共享内存冲突与寄存器分配。研究者需要让观察指标对准自己的架构问题。
作者还比较了先改 CUDA 与先改 Vortex 两种顺序。后者先在目标实现上修改,再翻译回 CUDA 获取反馈。在同一组 13 个内核上,先改 Vortex 的多数分量距离更大;DRAM 带宽分量的平均距离为 0.463,默认流程为 0.115。
作者的解释是,目标架构约束进入实现后,回到 NVIDIA 平台测得的差异可能同时包含负载行为偏差与架构适配影响。Agent 因而更难判断下一步应该改代码的哪一部分。先在参考平台上调整,能在引入目标适配之前获得更清楚的反馈。
Orin 的测量还提醒了另一项条件:它的签名不纳入算术强度与 DRAM 带宽,D 只对可测项取平均。因此,不同平台的距离值需要连着指标集合读。团队应保存原始分量、测量环境和缺项信息,避免把不同口径排成统一榜单。
把基准交付拆成三层
架构团队采用这类 Agent,可以把验收拆成三层。第一层检查数值:候选确实运行,输入、精度、容差和错误样本可重放。第二层检查行为:逐项查看与研究问题相关的资源压力,并保存修改轨迹。
第三层检查决策适用性。研究缓存时,补看访问模式与缓存响应;研究调度时,检查并行度及停顿;研究张量计算时,确认引擎与精度路径。再通过改变目标配置,观察基准对这些变化的响应是否符合研究预期。这是导入建议,不能当作论文已完成的结果。
内核工程师需要看到代码与误差,工具链负责人需要重放替换和测量过程,架构负责人需要确认负载触发了待研究机制。同一份“全部通过”汇总表,很难承担三类责任。
修订记录因此是交付的一部分。论文保留失败与回退尝试,让 Agent 知道哪些改动没有帮助。团队也能沿着记录确认最终版本为什么被接受,是否有某项指标因总分改善而被忽略。把企业知识、工具执行和验证规则接进同一条研发流程,并为每次修订留下可追踪记录,能让这类 Agent 成果更容易被团队接管。
VortexSynth 提供了一条准备研究基准的路径:从真实应用热点出发,用输出检查挡住错误,再让资源指标指导重建。它最有启发的地方,是把“算对”和“像原负载”拆成了两个连续任务。
采用这类成果时,可以要求交付可重放的数值检查、逐项行为差异,以及面向研究问题的目标配置实验。三层证据对应三种接受条件。Agent 生成的基准越多,架构团队越需要知道每个基准保留了什么压力,适合支撑哪一类判断。
作者:麒芯
本文基于公开论文进行技术解读,实验结果归属论文作者,工程分析供交流参考。
参考资料:
Huanzhi Pu 等:VortexSynth: Profile-guided benchmark reconstruction for GPU architecture research(arXiv v1)
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.