
本期聚焦 Triton 的 NVPTX 寄存器压力调度、TVM 的精确 CUDA launch 契约与多 GPU 清理修复,并把公开证据和目标环境自测边界分开。
| 分组 | 更新 | 时间(+08:00) | 来源已报告结果 | 适用场景 | 第一步验证 | 行动窗口 |
|---|---|---|---|---|---|---|
| AI 编译器 / kernel | Triton per-kernel NVPTX register-pressure scheduling:为单个 kernel 增加 sched4reg 选择 | 8 月 30 日 03:37 | 默认调度与寄存器压力调度会生成不同 PTX;并发测试验证两种策略的结果稳定,页面给出代码生成测试,端到端性能数字留给自测。12 | NVPTX kernel 的寄存器占用、occupancy 或 spill 成为调优变量时 | 对同一 Triton kernel 分别编译 sched4reg=false/true,检查 PTX、寄存器数、occupancy 和正确性 | 可先放进编译回归;性能验证应绑定具体 shape 与 GPU |
| AI 编译器 / kernel | TVM TIRx exact required block dimensions:把静态线程 / cluster 维度变成 CUDA 的精确 launch 契约 | 8 月 29 日 09:42 | 生成 __block_size__ 与 PTX .reqntid 的代码生成测试通过;属性互斥和 host/device metadata 测试覆盖,页面给出 CUDA 13+ 边界,端到端性能数字留给自测。34 | 需要固定 block / cluster 尺寸、依赖 .reqntid 的 TIRx CUDA kernel | 用 CUDA Toolkit 13+ 编译一个静态线程与 cluster 维度的 kernel,核对生成源码、grid 可整除条件和 launch 失败信息 | 适合在升级 TIRx 或重写 launch metadata 前做兼容性门禁 |
| CUDA runtime | TVM cleanup 保持当前设备:CUDADeviceGuard 包住跨设备释放与 CUDA IPC pooled allocation 清理 | 8 月 30 日 05:20 | 多 GPU destructor / stream 回归通过;三项目标清理回归通过,TIRx 测试报告 2902 passed、94 skipped、3 xpassed,页面未给运行时加速数字。45 | Python GC、runtime destructor 或 Disco CUDA IPC 释放跨设备资源的多 GPU 进程 | 让线程停在 cuda:1,释放 cuda:0 的 tensor、stream 和 pooled IPC allocation,再断言当前设备仍为 cuda:1 | 适合直接加入多 GPU runtime 回归;收益先看状态稳定性和后续算子是否落到正确设备 |
c349ce5。提交在 NVPTX 后端注册一个编译期调度器:sched4reg=false 走默认调度,sched4reg=true 走 createBURRListDAGScheduler,并把选项挂到单个 kernel 的 CUDAOptions 上。这个调度器只对 NVIDIA 的 NVPTX 目标启用。12ptxas 的寄存器与 spill 报告,再用 Nsight Compute 或等价工具观察 occupancy,最后用目标服务的真实 batch 测 latency 和吞吐。true 只有在这三层结果都变好时,才值得进入默认配置。0d9c9384。提交新增 tirx.required_block_size=1 属性,并在 CUDA codegen 中生成 __block_size__((tx, ty, tz), (cx, cy, cz))。CUDA 会由这个精确契约导出 PTX .reqntid;它与只提供建议的 __launch_bounds__ 属于两种不同的约束。34tirx.required_block_size 不能与最大寄存器数、每个 SM 的最小 block 数或每个 cluster 的最大 block 数同时使用。第三,采用精确 block / cluster 尺寸时,运行时 grid 的每个维度需要能被对应的静态 cluster 维度整除。3__block_size__,并检查源码里没有 __launch_bounds__;另一组测试把精确 block 尺寸和 launch bounds 放在一起,确认编译阶段报出互斥错误。页面给出的证据是契约和回归测试,性能收益需要按具体 block / cluster 形状测量。366efb012。提交把 CUDA 释放路径里的直接 cudaSetDevice 换成 CUDADeviceGuard:释放 tensor / workspace 和销毁 stream 时,代码临时切到资源所在设备,作用域结束后恢复调用线程原来的当前设备。Disco CUDA IPC pooled allocation 的释放路径也采用同一做法。这里的“当前设备”指 CUDA 线程上下文里后续算子默认使用的 device。45cuda:1 时,释放属于 cuda:0 的资源。旧路径会把线程留在资源设备;后续 DLPack 导出、CuTe DSL 操作或下一个未显式指定 device 的算子就可能观察到错误的当前设备。提交把保护放回 runtime cleanup 内部,调用方无需在每个引用周围重复设置 device。5fast_topk_clusters 的三项默认 correctness case 被标为 skip,原因是 FlashInfer 参考实现缺少输入边界检查,也没有初始化或重置共享 threshold bin;严格 registry import 覆盖仍保持开启。5cuda:1,在 cuda:0 分配 tensor 和 stream,触发释放,再断言当前设备仍是 cuda:1。随后把同一检查放进 CUDA IPC pool 和异常清理路径,覆盖正常返回、Python GC 与进程退出前的 destructor。sched4reg 两个编译分支,比较寄存器、spill 和 occupancy,再看真实 shape 的 latency 与吞吐。__block_size__、grid 整除和 launch 属性互斥,再测 kernel 性能。github.com
github.com
github.com
github.com
github.com
This story was produced automatically by a channel. One sentence is all it takes for Neodrop to keep producing for you.