Pull Request已成功合入, 合并人@CANN-robot
(感谢 zhangxiyan7 的贡献)变更摘要
本 PR 引入了一个新的 StatelessExponential 算子,用于在原地(in-place)生成服从指数分布 Exp(λ) 的随机数。与旧的 SimThreadExponential 不同,该算子将 seed 和 offset 作为输入张量(而非属性)传递,使其能够被 aclnnMultinomialTensor 等基于张量的调用方直接使用。该算子的内核计算逻辑复用 SimThreadExponential::Process<T>,通过 TilingKey 按输出数据类型(FP16/BF16/FP32)分派。同时,PR 清理了 stateless_sample_multinomial 中旧的 David 路径代码(RunDavidMultinomialReplaceMent、RunDavidMultinomialNoReplaceMent 等),并将 multinomial 的无放回采样路径统一改为 StatelessExponential + Run950AicoreMultinomialWithoutReplacement 的组合。
主要改动
- 新增
StatelessExponential算子:完整实现了 Op 定义 (stateless_exponential_def.cpp)、Op API (stateless_exponential.h/.cpp)、Tiling (stateless_exponential_tiling_arch35.h/.cpp) 和内核入口 (stateless_exponential.cpp),支持 FP16/BF16/FP32 输出,seed/offset作为 INT64 标量张量通过TilingInputsDataDependency在 tiling 阶段消费,lambd作为属性传入并校验 >0。 - 重构 multinomial 无放回采样路径:在
aclnn_multinomial.cpp中,aclnnMultinomialGetWorkspaceSize和aclnnMultinomialTensorGetWorkspaceSize的 RegBase 分支不再调用已删除的Run950AicoreExponentialWithoutReplacement,改为先通过StatelessExponential生成指数随机数,再传入Run950AicoreMultinomialWithoutReplacement。 - 移除旧的 David 多分类实现代码:从
aclnn_multinomial.cpp中删除了RunDavidMultinomialReplaceMent、RunDavidMultinomialNoReplaceMent、GetDavidRandomUniformReplaceMentTensor、GetDavidRandomUniformNoReplaceMentTensor、BuildDavidCounter等约 170 行代码;从stateless_sample_multinomial.cpp/.h中移除了Run950AicoreExponentialWithoutReplacement函数及OP_TYPE_REGISTER(SimThreadExponential)注册。 sim_thread_exponential写入方式调整:ExponentialTransform中写回全局内存的方式从直接索引赋值outputGm[li] = ...改为*const_cast<__gm__ T*>(&outputGm[li]) = ...,以适配更严格的编译器约束。- 新增完整的单元测试:tiling 层测试覆盖 FP32/FP16/BF16 三种数据类型、多维形状、
lambd=0校验失败、offset非 4 的倍数校验失败;kernel 层测试覆盖冒烟测试(三种类型)和确定性验证(相同 seed/offset 两次运行结果一致)。


代码审查
Now let me write the closing summary.
审查总结
共审查了 18 个变更文件,报告了 3 个问题:
| 优先级 | 数量 | 说明 |
|---|---|---|
| P0 | 0 | 无构建/严重安全问题 |
| P1 | 0 | 无高概率运行时错误 |
| P2 | 3 | 2 个空指针检查缺失(aclnn_multinomial.cpp 两个新增 RegBase 路径),1 个 const_cast 移除 volatile 的潜在内存序问题(sim_thread_exponential_simt.h) |
| P3 | 0 | 无次要问题 |
逐文件审查结果
| 文件 | 结论 |
|---|---|
random/sim_thread_exponential/op_kernel/arch35/sim_thread_exponential_simt.h |
P2: const_cast 移除 volatile |
random/stateless_exponential/CMakeLists.txt |
无问题 |
random/stateless_exponential/README.md |
无问题 |
random/stateless_exponential/op_api/stateless_exponential.cpp |
无问题 |
random/stateless_exponential/op_api/stateless_exponential.h |
无问题 |
random/stateless_exponential/op_host/arch35/stateless_exponential_tiling_arch35.cpp |
无问题 |
random/stateless_exponential/op_host/arch35/stateless_exponential_tiling_arch35.h |
无问题 |
random/stateless_exponential/op_host/config/ascend950/stateless_exponential_simplified_key.ini |
无问题 |
random/stateless_exponential/op_host/stateless_exponential_def.cpp |
无问题 |
random/stateless_exponential/op_kernel/stateless_exponential.cpp |
无问题 |
random/stateless_exponential/tests/ut/op_host/arch35/test_stateless_exponential_tiling_arch35.cpp |
无问题 |
random/stateless_exponential/tests/ut/op_kernel/CMakeLists.txt |
无问题 |
random/stateless_exponential/tests/ut/op_kernel/stateless_exponential_tiling.h |
无问题 |
random/stateless_exponential/tests/ut/op_kernel/test_stateless_exponential.cpp |
无问题 |
random/stateless_sample_multinomial/CMakeLists.txt |
无问题 |
random/stateless_sample_multinomial/op_api/aclnn_multinomial.cpp |
P2 × 2: 空指针检查缺失 |
random/stateless_sample_multinomial/op_api/stateless_sample_multinomial.cpp |
无问题(清理旧代码) |
random/stateless_sample_multinomial/op_api/stateless_sample_multinomial.h |
无问题(清理旧声明) |
整体风险评估:此 PR 引入了新的 StatelessExponential 算子以替代旧的 SimThreadExponential 路径,架构设计合理。主要风险集中在 aclnn_multinomial.cpp 两条新增 RegBase 路径中缺少中间分配结果(AllocIntArray/ConvertToTensor)的空指针检查,在 OOM 场景下会崩溃而非返回错误码。另外 sim_thread_exponential_simt.h 中 const_cast 剥离 volatile 的做法需确认是否是针对已知编译器问题的 intentional workaround。整体风险等级:中等。
| 类型 | 数量 |
|---|---|
| 🔴 阻塞 | 0 |
| 🟡 建议 | 2 |
💬 仅评论


Thanks for your pull-request.
The full list of commands accepted by me can be found at here。
You can get sig-info at here
PR Approval Progress
✅ Congratulations! All modules have met the lgtm and approve requirements.
Module Approval Details
| module | lgtm status | approve status |
|---|---|---|
| */*/README.md | ✅ 陈娇, xuejinghui (2/2) | ✅ 陈娇 (1/1) |
| */*/op_api/*.h | ✅ 汤磊, xuejinghui (2/2) | ✅ 汤磊 (1/1) |
| */*/op_host/*_def.cpp | ✅ 汤磊, xuejinghui (2/2) | ✅ 汤磊 (1/1) |
| repo-cann/ops-math | ✅ 宋恺, xuejinghui (2/2) | ✅ 宋恺 (1/1) |
💡 Tip:
- Committer can comment
/approveor/lgtm- Commenting
/approveimplies both code review (lgtm) and intent to merge (approve)
CLA Signature Pass
zhangxiyan7, thanks for your pull request. All authors of the commits have signed the CLA. 👍


描述
当前multinomial接口中会通过exponential_小算子拼接,aclnnMultinomialTensor输入seed/offset是通过tensor输入,SimThreadExponential seed/offset作为属性输入,无法在aclnnMultinomialTensor中调用,因此新增StatelessExponential算子实现aclnnMultinomialTensor的seed/offset实现tensor输入。
关联的Issue
https://gitcode.com/cann/ops-math/issues/2418
测试
门槛用例通过,冒烟通过
文档更新
新增stateless_exponential目录下README.md
类型标签