# PR #22724 完整报告

- 仓库：`sgl-project/sglang`
- 标题：[Misc] Add @cache_once to is_arch_support_pdl in jit_kernel
- 合并时间：2026-04-14 05:42
- 原文链接：http://prhub.com.cn/sgl-project/sglang/pull/22724

---

# 执行摘要
本次 PR 为 `jit_kernel` 模块的 `is_arch_support_pdl` 函数添加了 `@cache_once` 装饰器以实现结果缓存，并简化了 `cache_once` 装饰器的实现。这是一个小型性能优化和代码清理，风险较低，对用户透明，适合快速了解缓存装饰器的使用技巧。

# 功能与动机
**为什么做**：根据 PR 描述，主要目的是避免 `is_arch_support_pdl` 函数的重复计算，通过缓存其返回值来提升性能。同时，清理 `cache_once` 装饰器中冗余的 `key=lambda` 参数，使代码更简洁。PR body 中明确写道：“Add `@cache_once` decorator to `jit_kernel`'s `is_arch_support_pdl` so the result is cached - Remove redundant `key=lambda` from `sorted(kwargs.items())` in `cache_once`”。

# 实现拆解
变更仅涉及一个文件 `python/sglang/jit_kernel/utils.py` 的两处修改：
1. **添加缓存装饰器**：在 `is_arch_support_pdl` 函数定义前添加 `@cache_once`，使该函数的结果在首次调用后被缓存。
   ```python
   @cache_once
   def is_arch_support_pdl() -> bool:
       if is_hip_runtime():
           return False
   ```
2. **简化装饰器实现**：修改 `cache_once` 内部的 key 生成逻辑，从 `tuple(sorted(kwargs.items(), key=lambda x: x[0]))` 简化为 `tuple(sorted(kwargs.items()))`，因为 `sorted` 默认按字典键排序，`key=lambda` 参数是冗余的。

# 评论区精华
本次 PR 没有 review 讨论记录（`review_comments_count` 为 0），作者 merrymercy 自行合并，表明变更简单直接，未引发技术争议。

# 风险与影响
**风险**：
- **缓存一致性**：`is_arch_support_pdl` 被缓存后，如果运行时硬件架构动态变化，缓存结果可能不会更新，但该函数检测的是静态架构特性，实际风险较小。
- **代码简化副作用**：移除 `key=lambda` 理论上不影响功能，但如果未来 `kwargs` 包含非标准键，排序行为可能有细微差异。
- **测试覆盖不足**：仅依赖现有 CI 测试，未新增针对缓存行为的单元测试。

**影响**：
- **性能**：减少重复硬件检测开销，对启动或运行时性能有轻微提升。
- **代码质量**：简化装饰器实现，提高可读性。
- **用户**：透明无感，不改变 API 或功能。

# 关联脉络
从近期历史 PR 看，本 PR 与以下 JIT 内核相关 PR 存在关联：
- PR #20673：为 Minimax 模型引入融合 TP QK norm JIT 内核，同属 `jit-kernel` 模块的性能优化。
- PR #22155 和 #22187：涉及 hisparse JIT 内核的测试和基准测试，共享相同模块上下文。
这些 PR 共同反映了 `jit-kernel` 模块在持续进行性能优化和测试完善，本 PR 的小型缓存优化是该趋势的一部分。