| Files | Last commit | Last update |
|---|---|---|
修复StatelessRandperm INT8/UINT8/INT16边界误拒及FLOAT16/BF16/FLOAT排列唯一性问题 Co-authored-by: guankarl<guanhongwei3@huawei.com> # message auto-generated for no-merge-commit merge: !6411 merge fix_stateless_randperm_dtype_boundary into master 修复StatelessRandperm INT8/UINT8/INT16边界误拒及FLOAT16/BF16/FLOAT排列唯一性问题 Created-by: guankarl Commit-by: guankarl Merged-by: cann-robot Description: ## 描述 StatelessRandperm(arch35 / Ascend 950)输出为0..n-1的随机排列,最大输出值为n-1。原Host tiling的 maxValueMap校验存在两类缺陷: **问题一(#3575):整数类型边界差一误拒。** 原以n > dtype最大值拒绝,导致INT8 n=128(最大输出127)、UINT8 n=256(最大输出255)、INT16 n=32768(最大输出32767)等可被dtype完整表示的边界被误拒。 **问题二(#3576):浮点类型未按连续整数精确表示范围校验。** 原FLOAT16/BF16/FLOAT的map值取类型最大有限值(65504/≈3.4e38/FLT_MAX),超精度边界输出出现舍入重复值,破坏排列合同:950PR真机实测torch.randperm(2051, dtype=float16)输出仅2050个不同值(2048重复,2049舍入为2048)、torch.randperm(259, dtype=bfloat16)输出仅258个不同值(256重复,257舍入为256);FLOAT在n>2^24+1时同理。 两个问题的修复均对齐PyTorch参考实现check_supported_max_int_with_precision(aten/src/ATen/native/TensorFactories.h,CPU/CUDA共用,注释明示按最大输出值n-1判定): - **commit 1**:GetInputN/GetOutputY两处校验修正为n-1 > dtype最大值才拒绝;n<0校验前移避免n-1下溢;新增INT8/UINT8/INT16边界UT用例 - **commit 2**:maxValueMap浮点值改为可精确表示的最大连续整数(FLOAT16 2^11、BF16 2^8、FLOAT 2^24,配合n-1判据即FP16 n≤2049、BF16 n≤257、FLOAT n≤2^24+1,与PyTorch对Half/Float的限制一致,BF16为PyTorch自身疏漏、本PR一并补齐);新增FLOAT16/BF16/FLOAT边界UT用例 - 同步更新docs/aclnnRandperm.md约束说明 ## 关联的issue - https://gitcode.com/cann/ops-math/issues/3575(整数边界差一误拒) - https://gitcode.com/cann/ops-math/issues/3576(浮点精度丢失排列唯一性) ## 测试 - op_host UT(本地Ascend950PR环境,bash build.sh -u --ophost --ops=stateless_randperm --soc=ascend950):新增6个边界用例全部通过——INT8 128放行/129拒绝、UINT8 256放行/257拒绝、INT16 32768放行/32769拒绝、FLOAT16 2049放行/2050拒绝、BF16 257放行/258拒绝、FLOAT 16777217放行/16777218拒绝,均含tilingKey与workspace golden校验 - 950PR真机复现(修复前):torch.randperm(128, dtype=torch.int8, device='npu')报错input n must not be greater than max value of [attr]dtype(错误栈指向stateless_randperm_tiling_arch35.cpp GetInputN),CPU侧同参数返回合法排列;FP16/BF16重复值数据见上 - PyTorch对照:CPU对Half限制n≤2049(报错n cannot be greater than 2049 for Half type.);int8 n=128 CPU正常/n=129报value cannot be converted to type int8,与本修复后语义一致;BF16在PyTorch CPU无检查(同样产生重复值)、CUDA不支持,本修复较参考更严谨 - 说明:存量用例stateless_randperm_tiling_950_001在未含本PR的master基线上同样失败(golden tiling data串与本地sort tiling版本不匹配的预置问题,已stash复测确认与本次改动无关) ## 文档更新 docs/aclnnRandperm.md约束说明按dtype实际可精确表示范围细化:INT8 n≤128、UINT8 n≤256、INT16 n≤32768、FLOAT16 n≤2049、BFLOAT16 n≤257、FLOAT n≤16777217 ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述 See merge request: cann/ops-math!6411 | 24 days ago | |
[CANNBot]修复StatelessRandperm算子infershape对-1/-2的适配 Co-authored-by: guankarl<guanhongwei3@huawei.com> # message auto-generated for no-merge-commit merge: !6836 merge fix_stateless_randperm into master [CANNBot]修复StatelessRandperm算子infershape对-1/-2的适配 Created-by: guankarl Commit-by: guankarl Merged-by: cann-robot Description: ## 描述 修复StatelessRandperm算子infershape对-1/-2的适配:n输入desc含-2(unknown rank)/-1(unknown shape)时输出置{-1}由运行时解析;增加const data缺失保护、n负值校验及关键路径日志。 ## 关联的issue ## 测试 - 新增3个UT用例覆盖desc为{-1}/{-2}/{-1,-1}陷阱场景,期望输出均为{-1} - 反向验证:移除修复代码后3个新用例均FAILED,恢复修复后4/4 PASSED - 基于master基线编译通过(bash build.sh -u --ops=stateless_randperm --noexec),op_host UT 4/4 PASSED ## 文档更新 无 ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述 ## AI/Agent 生成声明 代码来源: - [ ] 纯人工手写 - [ ] AI 辅助编写 - [x] AI 完全生成 人工审查:已完成 测试验证:已通过 合规检查:已完成 See merge request: cann/ops-math!6836 | 12 days ago |
| Files | Last commit | Last update |
|---|---|---|
| 24 days ago | ||
| 12 days ago |