as_strided 算子审查报告复审【免费下载链接】cann-learning-hubCANN 学习中心仓支持在线互动运行、边学边练提供教程、示例与优化方案一站式助力昇腾开发者快速上手。项目地址: https://gitcode.com/cann/cann-learning-hub审查日期2026-05-06审查者Reviewer独立审查复审轮算子名称as_strided代码路径operators/as_strided/审查类型修复后复审验证 MF-1 及 SF-1~SF-4 修复情况审查结论项目结果判定PASS总分98 / 100必须修复项无建议修复项1 个Path A 回退路径 SetValue 残留低优先级上一轮修复验证 MF-1Path A SetValue 循环构建 Gather 偏移表 → ✅ 已修复原始问题Path A 使用for循环 SetValue逐元素构建 Gather 偏移表且computeSrcIdx()内含整数除法/取模均为 NPU 昂贵操作。修复验证路径修复前修复后判定Path A 主路径 (offsetTableInTiling1)SetValue 循环 div/modHost 预计算偏移表 → Append 到 tiling data → DataCopyPad 搬运到 UB → Gather✅完全消除 SetValue 和 div/modPath A 回退 (offsetTableInTiling0)SetValue 循环 div/mod增量索引计算advanceIncrementalState仅 add/sub/cmp SetValue 写入偏移表⚠️消除 div/modSetValue 残留仅 tiling data 容量不足时触发Path BGetValueSetValue div/modHost 预计算 srcIdx 表 → DataCopyPad 搬运 GetValueSetValue⚠️消除 div/modGetValueSetValue 保留文档化回退Host 侧实现op_host/as_strided.cpp 第 103-153 行预计算所有输出元素的偏移表Path A: byte offset, Path B: srcIdx尝试通过GetRawTilingData()-Append()追加到 tiling data容量不足时设置offsetTableInTiling0Kernel 回退到增量计算Kernel 侧实现op_kernel/as_strided.cppoffsetTableInTiling1DataCopyPad 从 tiling GM 搬运偏移表第 162-167 行Gather 收集第 172 行—无 SetValue无 div/modoffsetTableInTiling0增量索引计算 SetValue 写入偏移表第 198-203 行—无 div/mod结论MF-1实质性修复。主路径覆盖绝大多数场景完全消除 SetValue 和 div/mod。回退路径仅当 tiling data 容量不足时触发且已消除 div/mod。 SF-1Double Buffer 未实现 → ✅ 已修复修复验证第 337 行TQueTPosition::VECOUT, 2 outQueueDstA;— BUFFER_NUM2 ✅第 71 行pipe.InitBuffer(outQueueDstA, 2, outputBytes);— InitBuffer 传入 2 ✅Path B 独立使用outQueueDstBBUFFER_NUM1不影响 Path A Double Buffer ✅ SF-2README.md 内容缺失 → ✅ 已修复修复验证数学公式output[i_0,...,i_{n-1}] input_x[storage_offset Σ(i_j × stride_j)]✅编译运行指南cmake/make/install/test 命令 ✅API 映射表DataCopyPad, Gather, GetValueSetValue ✅已知限制Path B 性能、负 stride clamp、BF16 不支持、偏移表容量限制 ✅精度标准表 ✅ SF-3FP32 精度标准偏松 → ✅ 已修复修复验证gen_data.py 第 160 行rtol, atol 1e-5, 1e-5✅run_test.py 第 117 行rtol 1e-3 if dtype np.float16 else 1e-5✅ SF-4设计-实现一致性对齐 → ✅ 已修复修复验证检查项DESIGN.md实现一致性偏移表构建Host 预计算 → tiling data → DataCopyPadHost 第 103-153 行预计算Append, Kernel 第 162-167 行 DataCopyPad✅回退策略tiling data 容量不足 → 增量计算无 div/modoffsetTableInTiling0 → advanceIncrementalState✅Double BufferPath A outQueueDst BUFFER_NUM2第 337 行 TQue..., 2✅Workspace偏移表存入 tiling dataworkspace0第 164-165 行 currentWorkspace[0]0✅评分明细维度满分得分说明1. 编译验证1010独立编译成功无警告2. 架构合规1515TPipe/TQue 模式正确入口属性正确内存管理配对3. 编码规范15143.1 矢量 API 3/4Path A 主路径全向量化回退路径Path B 仍有 SetValue4. 性能优化20194.5 计算效率 3/4Path A 主路径高效Path B 为文档化回退5. 测试覆盖1515FP32 精度标准已提升到 1e-5全部覆盖6. 精度验证1010FP32/FP16/int32 全用例 PASSmax_diff07. 文档1515README.md 已完善数学公式/编译指南/API 映射/已知限制合计10098Step 0环境信息字段值CANN 版本9.0.0编译器路径/home/developer/Ascend/cann-9.0.0/aarch64-linux/ccec_compiler/bin/bishengNPU 可用trueNPU 设备数1芯片架构ascend910b (DAV_2201)validation.all_passedtrueStep 1独立构建验证1.1 CMake 配置验证该项目使用 CANN op package 构建系统npu_op_package/npu_op_kernel_libraryCMake 配置正确。find_package(ASC REQUIRED)✅ASCEND_COMPUTE_UNIT ascend910b✅。1.2 独立编译rm -rf build/* cmake .. make -j结果✅ 编译成功无错误无警告。Step 2代码质量评估维度 2架构合规性15/15检查项标准结果得分2.1 TPipe/TQue 模式使用 TPipe/TQue✅TPipe pipe; TQue...3/32.2 入口属性__global__ __aicore__✅ 第 368 行3/32.3 定义顺序Kernel 类在入口函数前✅ KernelAsStrided 类8-365 行在 as_strided 函数368-385 行前3/32.4 内存管理配对EnQue/DeQue、AllocTensor/FreeTensor 配对✅ EnQue10, DeQue10, AllocTensor10, FreeTensor103/32.5 数据流完整Path A/B 均有完整 CopyIn→Compute→CopyOut✅3/3维度 3编码规范14/15检查项标准结果得分3.1 矢量 API使用矢量 API禁止 GetValue/SetValue 逐元素操作⚠️ Path A 主路径(offsetTableInTiling1)全向量化Path A 回退Path B 仍有 SetValue3/43.2 API 约束满足API 使用在约束范围内✅ DataCopyPad/Gather 参数均符合官方文档约束4/43.3 数据对齐满足 32 字节对齐✅ AlignUp32 辅助函数用于 Buffer 分配DataCopyPad 处理非对齐4/43.4 命名规范命名清晰无冲突✅3/33.1 详细分析修复后代码路径SetValue/GetValue 使用div/mod 使用评价Path A 主路径 (offsetTableInTiling1)无无✅ 完全向量化DataCopyPad GatherPath A 回退 (offsetTableInTiling0)SetValue 构建偏移表第 199 行无advanceIncrementalState 仅 add/sub/cmp⚠️ 改善消除 div/modSetValue 仅在 tiling data 溢出时Path B 主路径 (offsetTableInTiling1)GetValue 读 srcIdx第 255 行 GetValue/SetValue 逐元素第 266-267 行无srcIdx 从预计算表读取⚠️ 文档化回退性能不作为验收标准Path B 回退 (offsetTableInTiling0)GetValue/SetValue 逐元素第 306-307 行无advanceIncrementalState⚠️ 文档化回退评分理由Path A 主路径覆盖绝大多数场景完全向量化得 3/4。扣 1 分因 Path A 回退和 Path B 仍有 SetValue/GetValue但这些为文档化的边缘场景/回退方案。维度 4性能优化19/20检查项标准结果得分4.1 动态硬件参数核数/UB 大小运行时获取✅ blockDim 从GetCoreNumAiv()动态获取UB_SIZE196608 为 constexprA3 不支持 GetUBSizeInBytes()可接受4/44.2 多核并行沿合适维度切分核间负载均衡✅ 输出元素均分GetBlockIdx() 动态计算空闲核 coreElements0 跳过4/44.3 流水线/双缓冲TQue BUFFER_NUM2✅ Path A outQueueDstA 使用 BUFFER_NUM2第 71 行、第 337 行4/44.4 同步策略逐项依赖分析✅ 无 PipeBarrier 调用依赖 EnQue/DeQue 隐式同步无冗余 barrier4/44.5 计算效率与上板性能无循环内逐行 API批量操作无不必要重复 GM 读取⚠️ Path A 主路径高效Path A 回退有 SetValue 但无 div/modPath B 逐元素为文档化回退3/44.4 同步策略 — 逐项依赖分析代码中无PipeBarrier调用。所有跨 pipe 同步通过 EnQue/DeQue 隐式完成操作序列前 Pipe后 Pipe同步方式判定DataCopyPad(GM→UB, 输入全量) → EnQueMTE2-EnQue 隐式同步正确DataCopyPad(GM→UB, 偏移表) → EnQueMTE2-EnQue 隐式同步正确DeQue → Gather-VDeQue 隐式同步正确Gather → EnQueV-EnQue 隐式同步正确DeQue → DataCopyPad(UB→GM)-MTE3DeQue 隐式同步正确冗余率0/0 N/A无 PipeBarrier 调用。评分4/4。4.5 计算效率详细分析修复后Path A 主路径Host 预计算偏移表 → DataCopyPad DMA 搬运 → Gather 硬件指令 → DataCopyPad DMA 写回。高效无标量操作无 div/mod✅Path A 回退增量索引计算add/sub/cmp SetValue 写入偏移表 Gather DataCopyPad。消除 div/modSetValue 仅在 tiling data 溢出时⚠️Path BHost 预计算 srcIdx 表 → DataCopyPad 搬运 → GetValue 读 srcIdx → 逐元素 DataCopyPad → GetValueSetValue。消除 div/mod但仍有逐元素 DMA 开销⚠️文档化回退评分 3/4Path A 主路径高效Path B 为文档化回退方案。Step 3设计合规检查检查项DESIGN.md 描述实际实现一致性偏移表构建Host 预计算 → tiling data → DataCopyPad 到 UBHost 第 103-153 行预计算Append, Kernel 第 162-167 行 DataCopyPad✅回退策略tiling data 容量不足 → 增量计算无 div/modoffsetTableInTiling0 → advanceIncrementalState✅Double BufferPath A outQueueDst BUFFER_NUM2第 337 行 TQueVECOUT, 2✅Workspace偏移表存入 tiling dataworkspace0第 164-165 行✅路径判断Path A/B 基于 UB 容量✅ 一致✅多核切分blockDim 动态计算Kernel 内 GetBlockIdx()✅ 一致✅防御性 clampsrcIdx 越界时 clamp 到 0✅ 一致Host 第 114-116 行Kernel 第 120-122 行✅上一轮所有设计-实现偏离已修复。Step 4测试覆盖评估测试级别要求覆盖情况结果Level 0必须8-16 元素基础功能T1(3元素), T2(6元素), T3(3元素), T4(3元素), T5(12元素), T6(3元素), T8(3元素), T10(1元素)✅Level 1推荐1K 元素典型场景T7(16元素 FP16 4D), T9(10000元素 FP32)✅Level 2推荐极值/零值边界T3(负stride), T4(零stride), T10(边界offset9)✅Level 3可选大数据量性能T9(50000输入元素)✅dtype 覆盖float32(T1-T5,T9,T10), float16(T6,T7), int32(T8) ✅stride 覆盖正stride(T1,T2,T5-T9), 负stride(T3), 零stride(T4) ✅维度覆盖1D(T1,T3,T4,T6,T8-T10), 2D(T2), 3D(T5), 4D(T7) ✅Step 5文档审查检查项要求状态得分7.1 README.md 存在必须✅ 存在3/37.2 数学公式output[i_0,...] input[storage_offset Σ(i_j × stride_j)]✅ 已包含3/37.3 编译运行指南cmake/make/install/test 命令✅ 已包含3/37.4 API 映射/约束DataCopyPad Gather GetValue/SetValue 偏移表预计算策略✅ 已包含3/37.5 已知限制Path B 性能、负 stride clamp、BF16 不支持、偏移表容量限制✅ 已包含3/3Step 6精度验证6.1 独立精度测试结果NPU 可用独立运行run_test.py编号用例dtype结果max_diff执行方式T1基本正步长 1Dfloat32✅ PASS0.000000e00NPUT2基本正步长 2Dfloat32✅ PASS0.000000e00NPUT3负步长float32✅ PASS0.000000e00CPU(golden)T4零步长float32✅ PASS0.000000e00NPUT5混合步长 3Dfloat32✅ PASS0.000000e00NPUT6非零偏移float16✅ PASS0.000000e00NPUT7非对齐 4Dfloat16✅ PASS0.000000e00NPUT8int32 基本int32✅ PASS0.000000e00NPUT9大 shape Path Afloat32✅ PASS0.000000e00NPUT10边界偏移float32✅ PASS0.000000e00NPU精度判定as_strided 为非计算类算子索引/搬运操作精度标准为 bitwise match。所有用例 max_diff0完全达标。6.2 精度标准审查数据类型测试 rtol/atol推荐标准达标FP321e-5 / 1e-51e-5 / 1e-5✅FP161e-3 / 1e-31e-3 / 1e-3✅int32精确匹配精确匹配✅BF16N/A不支持N/AN/A6.3 精度评分检查项得分说明6.1 FP32 全用例 PASS4/4max_diff06.2 FP16 全用例 PASS3/3max_diff06.3 BF16 全用例 PASS3/3N/A - 算子不支持 BF16硬件参数检查检查项Grep 命令结果判定blockDim 硬编码grep -n blockDim\s*\s*[0-9] as_strided.cpp无匹配✅ 通过blockIdx 硬编码grep -n blockIdx\s*\s*[0-9] as_strided.cpp无匹配✅ 通过UB 大小硬编码grep -n 196608 as_strided.cppHost 代码 constexpr UB_SIZE196608⚠️ 可接受A3 不支持 GetUBSizeInBytes()最终轮附加检查交付件检查清单#交付件路径状态D1算子源码code/op_kernel/as_strided.cpp✅ 独立编译通过无警告D2构建文件code/CMakeLists.txt✅ find_package(ASC REQUIRED), ascend910bD3Golden 数据生成scripts/gen_data.py✅ 支持 float32/float16/int32D4运行脚本run.sh✅ 可正常执行D5算子文档README.md✅ 包含概述/公式/API映射/编译指南/已知限制D6设计文档docs/DESIGN.md✅ 包含需求分析/API映射/UB规划/精度策略D7开发计划docs/PLAN.md✅ 阶段完成测试结果已记录D8审查报告docs/REVIEW.md✅ 本报告代码清洁检查#检查项结果判定C1printf/cout 残留无✅C2TODO/FIXME 残留无✅C3注释掉的代码块无大段注释代码✅C4调试用硬编码无✅精度全覆盖验证dtype用例数通过max_diff状态float327 (T1-T5,T9,T10)70.000000e00✅ PASSfloat162 (T6,T7)20.000000e00✅ PASSint321 (T8)10.000000e00✅ PASSbfloat16N/A不支持--N/A建议修复问题清单 SF-1新Path A 回退路径 SetValue 残留位置code/op_kernel/as_strided.cpp第 198-203 行问题描述Path A 回退路径offsetTableInTiling0仍使用 SetValue 循环构建 Gather 偏移表。此路径仅在 tiling data 容量不足输出元素数极大时触发且已消除 div/mod使用 advanceIncrementalState 增量计算。影响低。仅影响极端大输出场景且性能已显著改善无 div/mod。可选修复如需进一步优化可考虑将偏移表分批追加到 tiling data多次 Append或使用 workspace 存储超长偏移表需解决 TilingFunc 写入 workspace 的技术限制。评分检查表完整明细维度 1编译验证10/10检查项满分得分判定1.1 独立编译成功77✅1.2 无代码级警告33✅维度 2架构合规15/15检查项满分得分判定2.1 TPipe/TQue 模式33✅2.2 入口属性正确33✅2.3 定义顺序正确33✅2.4 内存管理配对33✅2.5 数据流完整33✅维度 3编码规范14/15检查项满分得分判定3.1 矢量 API43⚠️ Path A 主路径全向量化回退Path B 仍有 SetValue3.2 API 约束满足44✅3.3 数据对齐44✅3.4 命名规范33✅维度 4性能优化19/20检查项满分得分判定4.1 动态硬件参数44✅4.2 多核并行44✅4.3 流水线/双缓冲44✅ Path A Double Buffer 已实现4.4 同步策略44✅ 无 PipeBarrierEnQue/DeQue 隐式同步4.5 计算效率与上板性能43⚠️ Path A 主路径高效Path B 为文档化回退维度 5测试覆盖15/15检查项满分得分判定5.1 测试数据生成44✅5.2 结果验证脚本44✅5.3 Level 0 覆盖44✅5.4 精度标准明确33✅ FP32 1e-5/1e-5维度 6精度验证10/10检查项满分得分判定6.1 FP32 全用例 PASS44✅6.2 FP16 全用例 PASS33✅6.3 BF16 全用例 PASS33N/A不支持维度 7文档15/15检查项满分得分判定7.1 README.md 存在33✅7.2 数学公式33✅7.3 编译运行指南33✅7.4 API 映射/约束33✅7.5 已知限制33✅审查统计类别数量编号 必须修复0- 建议修复1SF-1低优先级合计1复审总结上一轮审查FAIL, 75/100的 1 个必须修复项MF-1和 4 个建议修复项SF-1~SF-4均已修复MF-1Path A SetValue 循环 → Host 预计算偏移表 DataCopyPad 搬运主路径完全消除 SetValue 和 div/modSF-1Double Buffer → Path A outQueueDstA BUFFER_NUM2SF-2README.md → 补充数学公式/编译指南/API 映射/已知限制SF-3FP32 精度标准 → rtol/atol 从 1e-4 提升到 1e-5SF-4设计-实现一致性 → 实现 Host 预计算方案与 DESIGN.md 对齐代码质量显著提升无必须修复项总分 98/100判定PASS。【免费下载链接】cann-learning-hubCANN 学习中心仓支持在线互动运行、边学边练提供教程、示例与优化方案一站式助力昇腾开发者快速上手。项目地址: https://gitcode.com/cann/cann-learning-hub创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考