高性能代码验证
围绕指定模块回答:实际做了多少工作,哪些工作必须等待,哪些工作可以消除或并行,改动在目标硬件上是否更快。 给出可定位的代码依据、可复核的推导和可重跑的验证结果。
性能取向
- 将用户指定的低延迟、尾延迟或吞吐量作为主要目标。允许降低抽象层次、融合逻辑、复制特化代码、手工展开、重排布局、使用底层指令或代码生成;不以“难读”单独否决有证据的收益。
- 区分源码重复与运行时重复计算。允许前者换取性能,主动消除后者;若少量重算能节省更多访存或同步,也允许以净收益保留。
- 保留外部语义、资源所有权和同步协议。牺牲可读性不等于允许数据竞争、越界、丢任务、偷减精度或漏算工作。用户另有近似精度契约时按其契约验收。
- 将不变量、布局公式和选择理由放在最少量注释、参考实现或验证报告中。性能实现可以难读,正确性依据必须可复核。
工作流程
1. 固定任务和验收口径
- 读取目标仓库的
AGENTS.md、指定模块、直接调用者、相关测试及构建入口。按需要扩展调用链,避免无目标扫描。 - 记录源码版本及未提交差异、模块入口、输入规模与分布、数据类型与布局、输出和副作用、目标硬件、运行时及编译参数。标记未知项,禁止编造设备能力。
- 从现有上下文确定操作范围:审核请求默认分析并运行已有检查;优化或修复请求继续完成范围内实现与验证。未指定模块时请求目标路径,同时给出所需的最小输入清单。
- 定义计时起终点、有效工作单位、冷启动或稳态、并发量、内存预算、精度与顺序要求。目标同时包含低延迟和高吞吐但未指定优先级时,分别给出结果及取舍,不擅自合并成一个分数。
- 在测量前固定比较规则,包括用户给定的阈值和不能退化的指标。未给硬性阈值时报告收益幅度及波动,结论限定为测得的工作负载,不虚构达标线。
2. 建立工作量与依赖模型
阅读 量化与并行改写方法,按阶段填写下表,使用真实规模代入一次;只有符号规模时保留公式。
| 阶段与源码位置 | 有效工作 / 实际执行工作 | 读写量 / 通信量 / 临时空间 | 前置依赖与关键路径 | 可运行任务数 / 当前执行资源 | 测得耗时与证据 |
|---|---|---|---|---|---|
| 填入具体阶段 | 写明操作类型、次数和单位 | 区分逻辑估算与实测流量 | 写明等待谁、等待什么 | 写明任务粒度和映射 | 未测时明确标记 |
- 分别统计算术、比较、索引、格式转换、分配、拷贝、同步和轮询;以
次数 × 每次工作量给出公式,避免只写大 O。 - 区分单任务、单线程/核、单设备、全模块的口径,并计入循环次数、调用频率及不均衡分配。异步阶段不能直接用耗时之和解释墙钟时间。
- 构建依赖 DAG,区分真正的数据依赖、资源争用和实现额外引入的屏障。给出当前实现与候选算法各自的总工作量
W、最长依赖链D、平均并行度W/D;不要把改写后的潜在并行度当成现有代码的并行度。 - 同时检查访存、通信、启动开销及负载不均衡。区分算法上独立的任务、某时刻已就绪的任务和硬件上同时驻留的任务;线程数或核数本身不能证明并行度。
3. 逐项验证优化机会
围绕瓶颈产生少量具体候选,每项给出位置 → 原因 → 改写 → 预期指标变化 → 正确性义务 → 验证方法。允许用证据说明某种方案不适用。
- 减少工作与数据移动。 检查循环不变量、重复遍历、重复归约、重复地址计算、转换、拷贝、分配和初始化;评估结果复用、预计算、融合、分块与布局变换。说明缓存有效期、输入变化后的失效规则和额外空间。
- 压缩热循环内操作,尤其是同步等待。 按“每轮次数 × 循环轮数”列出计算、分配、提交、查询、锁、屏障及等待成本;能消除则消除,确为不变量则外提,能合并则批量执行。重点检查“提交一项就等待一项”、每轮全局同步和重复轮询,评估有界批量提交、按依赖等待、等待延后至首次消费或缓冲复用之前。按 热循环与同步等待 证明跨迭代依赖、可见性和进度;不能直接删等待或把异步变化的就绪标志外提。
- 缩短串行依赖链。 识别归约、前缀和、筛选压缩、分桶、合并、递推和整批等待;评估树形、扫描、分治、分层合并、分段处理及就绪驱动。说明代数条件、跨分块依赖和新增工作,不能只建议给原循环加线程。
- 匹配执行资源。 对 CPU 多进程、多线程、SIMD,GPU/NPU 的实际执行模型与 SIMT 能力分别判断适用性;写明任务到进程、线程、lane、block、核、设备的映射,不要求每个模块强行使用全部机制。
- 复用资源并控制粒度。 评估持久进程池/线程池、常驻工作线程、批量投递、复用缓冲区和编译结果;计入创建、序列化、IPC、唤醒、队列、合并及跨设备传输成本。避免每个小任务创建资源或嵌套线程池造成超额订阅。
- 重叠阶段。 评估计算与搬运重叠、双缓冲、异步提交及不同任务间的流水。写明生产者、消费者、发布与完成事件、缓冲区回收时机、背压;取消整批屏障时证明单项就绪足以安全消费。
- 验证更激进的实现。 在前述瓶颈仍成立时评估展开、特化、融合、底层指令和重排;把寄存器压力、指令体积、缓存影响、驻留数变化及尾部处理纳入比较。支持牺牲可读性,不用代码长度或复杂度代替性能证据。
对候选分别估计延迟和吞吐收益上限、主要新增成本及可信度。优先实施对主目标最有影响且能验证的候选;不要先规定固定的技术路线。
4. 执行正确性和性能验证
阅读 验证协议。优先复用已有基准和参考实现,缺失时补充与改动机制直接相关的最小验证。
- 固定原始基线;先验证候选输出及协议正确,再比较性能。并行化收益需要与合理的优化串行实现比较,另保留相对原始基线的业务收益。
- 对输入规模、分布、并发数和任务粒度进行有界测量;单独记录冷启动、稳态、内核局部时间和端到端时间,计入与目标口径相关的启动、拷贝、排队、同步及结果合并。
- 用完成事件或适当同步覆盖真正执行时间;保持生产流程的并发语义。记录计时域与同步范围,不能把异步提交时间当完成时间。
- 保存命令、环境、原始样本、统计口径和正确性结果。做必要的消融,确认收益来自所声称的机制,避免同时改多项后随意归因。
- 没有目标设备时继续完成源码模型和可执行的主机检查;目标工具链及接口已知时提供设备验证入口,否则列出最少待补信息、可复用契约测试和验证方案,标记设备入口未完成。明确列出设备编译、正确性和性能待验证项,不编造命令,不用主机模拟或理论推导替代 GPU/NPU、真实多 rank 验证。
- 在约定范围和预算内迭代。收益落在噪声内、发生退化或关键证据缺失时,保留准确结论和下一项最小实验;不要通过挑选最好一次、丢掉必要工作或不断改验收条件制造通过。
5. 交付可复核结论
用 报告模板 组织结果,可压缩不适用段落。文件写入用户指定位置或目标项目适当的非发布报告目录,不写回 Skill 源目录。小型审核可以直接在回复中交付。
必须覆盖:
- 主要结论。 当前瓶颈、最值得做的改动、已完成范围和证据边界。
- 量化模型。 分阶段计算量、数据移动、工作量与依赖链、并行任务及硬件映射。
- 候选决策。 冗余消除、串行算法改写和资源复用方案的采纳或不采纳理由,附源码位置。
- 实测对比。 同口径基线与候选、正确性结果、延迟与吞吐、资源代价、适用规模和必要回退路径。
- 重现入口。 代码版本、构建/运行命令、原始数据、未完成检查。
逐项标记结论为 目标已验证、部分验证、仅分析、未达标或收益不明确。仅在约定语义和性能指标均有对应目标环境证据时使用“目标已验证”;微基准通过不自动代表端到端通过。