| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
【PR】bugfix: reduce算子融合case,1)针对ATT与Codegen校验merge_size问题统一取向量化轴repeats 2)针对codegen生成代码时2个broadcast算子消费同一父节点导致生成代码变量名冲突问题进行兼容解决 Co-authored-by: nikson<nisong1@huawei.com> # message auto-generated for no-merge-commit merge: !2156 merge develop into develop 【PR】bugfix: reduce算子融合case,1)针对ATT与Codegen校验merge_size问题统一取向量化轴repeats 2)针对codegen生成代码时2个broadcast算子消费同一父节点导致生成代码变量名冲突问题进行兼容解决 Created-by: tourse Commit-by: nikson Merged-by: cann-robot Description: # Pull Request ## 描述 【PR】bugfix: reduce算子融合case,1)针对ATT与Codegen校验merge_size问题统一取向量化轴repeats 2)针对codegen生成代码时2个broadcast算子消费同一父节点导致生成代码变量名冲突问题进行兼容解决 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [x] 🐛 Bug 修复 - [ ] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在当前页面的右侧'关联Issue'部分添加相应Issue链接,并勾选'合并后关闭已关联的 Issue'选项。 --> ## 如何测试 描述测试此变更的步骤和前提条件: 1. 通过CI平台构建了AF包,上传到环境上进行了验证,明确了此前失败的用例已执行通过; 2. 针对其他此前执行成功的用例再新AF包中进行了验证,修改代码后仍然成功 3. 已通过gitcode平台CI流水线,UT执行通过 4. 针对修改的代码,已拉通相关模块熟悉的责任人明确修改无误且不引入额外问题 ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如: feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 在此添加任何其他关于本次 PR 的说明。 See merge request: cann/graph-autofusion!2156 | 6 天前 | |
修复 Broadcast 后 Reduce source reuse 判断 Co-authored-by: weishitoken<huangqianqian15@huawei.com> # message auto-generated for no-merge-commit merge: !1819 merge fix/reduce-broadcast-reuse-guard into develop fix: 修复 Broadcast 后 Reduce source reuse 判断, 避免修改复用的broadcast数据导致精度失败 Created-by: wei_shi Commit-by: weishitoken Merged-by: cann-robot Description: # Pull Request ## 描述 修复 Reduce source reuse 判断遗漏上游 Broadcast 的问题。当 Broadcast 的 B 轴与 Reduce 的 R 轴具有相同 vectorized_axis 时,禁止复用输入 source,避免 Broadcast 与 Reduce 的轴语义冲突,错误复用,导致出现精度问题。 ## 变更类型 <!-- [x] 表示选中 --> - [x] Bug 修复 - [ ] 新功能 - [ ] 代码风格更新(格式化,局部变量) - [ ] 重构(既不修复错误也不增加功能的代码变动) - [ ] 构建过程或辅助工具的变动 - [ ] 文档内容更新 ## 关联的Issue 无 ## 如何测试 1. 使用 CANN 9.2.0 配置并构建 aihac_codegen 和 test_main:均成功。 2. 针对本次 4 个变更文件执行 pre-commit run --files ...:基础检查、clang-format、codespell 和 OAT 检查均通过。 3. 执行 git diff --check:通过。 4. 目标测试运行受既有 liboptimize.so ABI/链接问题阻塞,未进入 gtest,错误为缺少 af::GraphUtils::RelinkGraphEdges 符号。 ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [ ] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如:feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 - 分支相对 develop 仅包含 4 个目标文件:1 个测试构建配置、1 个共享 helper 和 2 个生产路径修改。 - .gitignore 中的既有本地修改未纳入本分支提交。 See merge request: cann/graph-autofusion!1819 | 1 个月前 | |
【PR】: [feat] [autofuse] add llt to autofuse. Co-authored-by: xingzhixiong<xingzhixiong@huawei.com> # message auto-generated for no-merge-commit merge: !372 merge master_llt into master 【PR】: [feat] [autofuse] add llt to autofuse. Created-by: xingzhixiong Commit-by: xingzhixiong Merged-by: cann-robot Description: # Pull Request ## 描述 增加autofuse组件的llt。 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [x] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在当前页面的右侧'关联Issue'部分添加相应Issue链接,并勾选'合并后关闭已关联的 Issue'选项。 --> ## 如何测试 描述测试此变更的步骤和前提条件: 1. 跑ci流水线能全部通过即可 ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如: feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 在此添加任何其他关于本次 PR 的说明。 See merge request: cann/graph-autofusion!372 | 4 个月前 | |
【PR】: [feat] [autofuse] add llt to autofuse. Co-authored-by: xingzhixiong<xingzhixiong@huawei.com> # message auto-generated for no-merge-commit merge: !372 merge master_llt into master 【PR】: [feat] [autofuse] add llt to autofuse. Created-by: xingzhixiong Commit-by: xingzhixiong Merged-by: cann-robot Description: # Pull Request ## 描述 增加autofuse组件的llt。 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [x] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在当前页面的右侧'关联Issue'部分添加相应Issue链接,并勾选'合并后关闭已关联的 Issue'选项。 --> ## 如何测试 描述测试此变更的步骤和前提条件: 1. 跑ci流水线能全部通过即可 ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如: feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 在此添加任何其他关于本次 PR 的说明。 See merge request: cann/graph-autofusion!372 | 4 个月前 | |
【PR】: [feat] [autofuse] add llt to autofuse. Co-authored-by: xingzhixiong<xingzhixiong@huawei.com> # message auto-generated for no-merge-commit merge: !372 merge master_llt into master 【PR】: [feat] [autofuse] add llt to autofuse. Created-by: xingzhixiong Commit-by: xingzhixiong Merged-by: cann-robot Description: # Pull Request ## 描述 增加autofuse组件的llt。 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [x] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在当前页面的右侧'关联Issue'部分添加相应Issue链接,并勾选'合并后关闭已关联的 Issue'选项。 --> ## 如何测试 描述测试此变更的步骤和前提条件: 1. 跑ci流水线能全部通过即可 ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如: feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 在此添加任何其他关于本次 PR 的说明。 See merge request: cann/graph-autofusion!372 | 4 个月前 | |
style: 统一 Autofuse 代码格式 Co-authored-by: Ling-DT<lingxing@huawei.com> # message auto-generated for no-merge-commit merge: !921 merge style/clang-format-autofuse-20260611 into develop style: 统一 Autofuse 代码格式 Created-by: ling-DT Commit-by: Ling-DT Merged-by: cann-robot Description: # Pull Request ## 描述 基于 cann/graph-autofusion:develop 最新提交 46a23b0,使用仓库根目录 .clang-format 对 autofuse/ 目录内受版本管理的 C/C++/AscendC 源文件执行统一格式化。 本 PR 仅包含 autofuse/ 目录格式化变更;super_kernel/ 目录格式化变更按要求暂留本地,未提交到本 PR。 格式化工具:clang-format 18.1.8,参数:--style=file。 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新功能 - [x] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue 无。 ## 如何测试 描述测试此变更的步骤和前提条件: 1. /tmp/opencode/clang-format-18-venv/bin/clang-format -i --style=file <autofuse C/C++/AscendC files> 2. git diff --cached --check 3. git diff --name-only HEAD~1..HEAD | cut -d/ -f1 | sort | uniq -c 确认 PR 提交仅包含 autofuse/。 ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如:feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 本 PR 为纯格式化变更,不涉及功能逻辑、接口、构建脚本或打包内容修改。 See merge request: cann/graph-autofusion!921 | 3 个月前 | |
【feat】: Bitwise 类算子支持 DT_BOOL 输入 Co-authored-by: zqmin<zengqingmin2@huawei.com> # message auto-generated for no-merge-commit merge: !2021 merge feat/bitwise-bool-input into develop 【feat】: Bitwise 类算子支持 DT_BOOL 输入 Created-by: zqmin Commit-by: zqmin Merged-by: cann-robot Description: # Pull Request ## 描述 BitwiseNot/BitwiseAnd/BitwiseOr/BitwiseXor 支持 DT_BOOL 输入。底层 AscendC Bitwise API 不支持 bool(bitwise_template 仅支持 8/16/32/64 位整型),采用 regbase extend 内部等效类型方案: - **regbase(按算子新增四个文件 bitwise_and/or/xor/not.h)**:每文件含泛型转发 + bool 特化重载。 BitwiseAnd/Or/XorExtend 的 bool 重载将 dst/src0/src1 ReinterpretCast<uint8_t> 视图后调用官方 BitwiseAnd/Or/Xor(bool 与 uint8 同为 1 字节、位模式一致,0/1 域按位运算语义等价);BitwiseNotExtend 的 bool 分支调用官方 LogicalNot——uint8 域按位非(~1=0xFE)会产出非法 bool 值,语义必须为逻辑非 0<->1 - **Codegen**:四个 impl GetApiName 改为 BitwiseXxxExtend,LoadApiHeaderFiles 各自加载 bitwise_xxx_reg_base.h(文件按算子拆分:Load 内联是整文件粒度,合并文件会使单算子 kernel 内联全部源码,产生对未加载官方头的隐式符号依赖),生成文本保持 BitwiseAndExtend(local_x[0], ...) 干净形态(无 ReinterpretCast);BitwiseNot 的 IsVectorFunctionSupported 对 BOOL 返回 false(VF 融合走 MicroAPI 按位非指令,bool 语义错误),回落 UnaryApiCall - **注册表**:四个算子 T 增加 DT_BOOL - **ATT 性能**:BitwiseAndPerf 公式入口 bool 归一化为 uint8 建模(与真实执行一致,防指令表静默漏算);Not/Or/Xor 走 dtype 无关的 kUnitVector 占位公式,无需处理 - **测试补漏**:test_bitwise_or/xor/not.cpp 三个 UT 文件历史遗漏未入 CMake,本次一并纳入 ## 变更类型 - [x] ✨ 新功能 ## 关联的Issue Closes #306(合并后自动关闭) ## 如何测试 1. 增量编译 cmake --build build --target test_main test_ascendc_api_v35 bitwise_bool_store_test_e2e_v2 -j 8 2. regbase UT(TmSim dav_3510):test_ascendc_api_v35 --gtest_filter='*Bitwise*',8/8 PASS(含 4 个 bool 用例,每算子 1 shape,数据经 uint8 tensor 装载 + bool 视图规避模拟器差异;多 repeat 场景由既有 uint8 用例覆盖) 3. codegen UT:test_main --gtest_filter='*Bitwise*' 3/3 PASS(既有 BitwiseAndTest 断言更新为 BitwiseAndExtend 调用文本) 4. E2E bitwise_bool_store_test:Phase1 断言生成 kernel 含四个 Extend 名 + 无 ReinterpretCast;Phase2 device 编译 + 数值验证(2 入 4 出图覆盖 and/or/xor/not 全部 0/1 输入组合) 5. 解耦验证:单算子(xor)图生成的 kernel 仅内联 BitwiseXorExtend,LogicalNot 引用 0 次(文件拆分前单算子图会因内联 BitwiseNotExtend 的 LogicalNot 调用缺 logical_not.h 而编译失败) 6. 回归:codegen 全量 883/883、perf 全量 1194/1194、VF/partition 62/62、现有 4 个单算子 uint8 bitwise E2E 12/12 全部 PASS ## 核对清单 - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如:feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 - bool 的 BitwiseNot 语义与 PyTorch 对齐(torch.bitwise_not(bool) = 逻辑非),与 uint8 按位非不同,实现上不可用 uint8 视图复用 BitwiseNot,故选择官方 LogicalNot(同为 AscendC API) - regbase 文件粒度与 Include 头精确对应是硬约束:IncludeApiHeaderFiles 按"图中实际节点"收集并集,单文件多算子会让未参与图的算子符号依赖泄漏进 kernel,故 bitwise 采用一算子一文件(对齐 compare.h/sub.h 惯例) - 性能基线:外抛 for 循环未命中(Binary/UnaryApiCall 无外抛路径,bool 禁 VF 不引入新外抛);无上板环境,vector bound 未知——bool 走 uint8 位宽指令与既有 uint8 路径同吞吐,无预期恶化 See merge request: cann/graph-autofusion!2021 | 16 天前 | |
【PR】: [fix] [autofuse] adapt reform of the same-named header files of ge. Co-authored-by: xingzhixiong<xingzhixiong@huawei.com> # message auto-generated for no-merge-commit merge: !1149 merge develop_change_dir_of_metadef_headers into develop 【PR】: [fix] [autofuse] adapt reform of the same-named header files of ge. Created-by: xingzhixiong Commit-by: xingzhixiong Merged-by: cann-robot Description: # Pull Request ## 描述 metadef在做同名头文件整改,整改完编译发现gaf失败,原因是gaf仓和ge仓也有同名且子目录相同的头文件,故需要将gaf仓的同名头文件的子目录进行整改,只给gaf仓内部使用,避免产生耦合编译问题。 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [x] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在当前页面的右侧'关联Issue'部分添加相应Issue链接,并勾选'合并后关闭已关联的 Issue'选项。 --> ## 如何测试 描述测试此变更的步骤和前提条件: 1. ci流水线pass 2. RDV pass ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如: feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 在此添加任何其他关于本次 PR 的说明。 See merge request: cann/graph-autofusion!1149 | 2 个月前 | |
fix: 拦截不支持ScalarData的codegen输入(#161) Co-authored-by: zqmin<zengqingmin2@huawei.com> # message auto-generated for no-merge-commit merge: !1209 merge fix/bitwiseand-scalardata-guard into develop fix: 拦截不支持ScalarData的codegen输入(#161) Created-by: zqmin Commit-by: zqmin Merged-by: cann-robot Description: # Pull Request ## 描述 修复 BitwiseAnd 等声明不支持 scalar input 的 codegen 校验漏拦截 ScalarData 的问题。 本次将 ScalarData 纳入 IsNodeHasScalarInput / IsNodeFirstInputScalar 判定,使不支持 scalar input 的节点在 CheckGraphValidity 阶段提前失败,避免继续生成非法 AscendC 代码并在设备编译时报 ScalarData[0] 语法错误。 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [x] 🐛 Bug 修复 - [ ] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue 关联 #161 ## 如何测试 描述测试此变更的步骤和前提条件: 1. cmake --build build --target aihac_codegen -j 8 通过。 2. sh build.sh -u --module=autofuse_framework -j 8 本地因 CANN 环境缺失 SkSystemArgs / latest version.info 阻塞,已记录在其他信息中,完整 UT 依赖 CI 流水线验证。 ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如:feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 本地完整 framework UT 未完成,环境报错如下: - sk_entry.asc: no type named 'SkSystemArgs' in namespace 'sk' - /usr/local/Ascend/ascend-toolkit/latest/share/info/*/version.info does not exist 本 PR 仅修改 scalar input 判定和新增 codegen graph check 单测,不涉及运行时 ABI/API。 See merge request: cann/graph-autofusion!1209 | 2 个月前 | |
fix(cv-ubfuse): align UB physical layout for mixed-dtype vector tensors Co-authored-by: tianbaolin<tianbaolin1@qq.com> Co-authored-by: ling-DT<lingxing@huawei.com> # message auto-generated for no-merge-commit merge: !2177 merge tbl/fix/cv-ubfuse-mixed-dtype-ub-alignment-dev into develop fix(cv-ubfuse): align UB physical layout for mixed-dtype vector tensors Created-by: tianbaolin Commit-by: ling-DT;tianbaolin Merged-by: cann-robot Description: ## Problem In CV UBFuse kernels the epilogue consumes the cube output by rows ( stageM * blockShapeNAlign) while queue tensors were still sized by the flat element budget (a0a1t), and 1D flat APIs were used for mixed-dtype vector stages. When tensor row strides differ by dtype (e.g. bool rows are 32B-aligned while float rows are not), the flat interpretation reads/writes wrong addresses and the queue allocation can be smaller than the real per-stage footprint, which corrupts results (scattered mismatches) or overflows UB (aicore exception). ## Fix Keeps the three-size contract (UB allocation >= UB compute size >= valid data size): **Tiling** - basen_align aligns to 32 elements, so it is the supremum of every dtype 32B-aligned row width; cube_ub_stage_size keeps cube-dtype element semantics - new cube_m_stage_size (max stage rows); after the solver picks STAGE_SIZE_NAME it is overwritten with STAGE_SIZE_NAME / basen_align, so rows * any-dtype-row-width never exceeds the solver per-dtype element budget - serialize the new field for const/dynamic/DB paths **Kernel init** - stage_size unified to element count (solver budget a0a1t, falling back to cube fragment capacity for tiny stages) - stage_size_type (rows) comes from cube_m_stage_size on all four flows: inductor const (kConstTilingData), inductor dynamic (params), non-inductor static (kConstTilingData baked by ascbc) and non-inductor dynamic (params.cv_tiling_data) - TensorSizeAssign emits local_size = stage_size for every UB tensor, so each dtype byte size equals its solver budget exactly - buf_cube sized by the pure C-fragment capacity - conv2d stage_size switched to element count as well **Reg APIs** - CvApi2DParams gains valid_size / output_compute_size / input_compute_size - Cast/Floor/Round/Trunc/Compare use the 2D form with logical {curAivM, curAivN} dims plus per-dtype physical row strides under CV UBFuse - WhereRegApiCall::GenerateNoLoopCase emits the 2D WhereExtend form with an independent mask stride, fixing bool-mask rows (e.g. align(N,32) != float row width) that previously went through a flat 1D call ## Verification (torch.compile, forced CV fusion, Ascend950PR): - tensor/broadcast/scalar compares, where (bool mask from GM, int8, int64, two float branches, compare->where), cast (fp16/int32), floor/round/trunc, add/mul/sub/div, max/min, unary and chained cases all match eager bit-exactly - previously failing N=400/600 and crashing N=664 now pass - inductor dynamic shape (params path) verified with multiple shapes - non-inductor flows covered by code-path audit (ascbc bakes kConstTilingData, dynamic reads params.cv_tiling_data) - UT expectations updated for the new stage_size element semantics ## TF non-inductor static-flow fixes (follow-up commit 5a48b96e) The rework broke TF static-shape kernel compilation (and exposed two latent misalignments): - **codegen_kernel.cpp**: non-inductor static Init referenced params.cv_tiling_data->cube_m_stage_size, but TF/GE online-compiled static graphs have neither INDUCTOR_CONST_TILING_DATA nor the cv_tiling_data Params member (is_dynamic=false), failing with no member named 'cv_tiling_data' in 'AutoFusionVector::Params'. Now reads the baked solver budget (AutofuseTilingData::STAGE_SIZE_NAME) and derives stage rows as stage_size_name / basen_align (conv2d-branch pattern). - **asc_codegen_compile.py**: host tiling still used ub_align_value = 32 / cube_output_type_size; aligned to 32 elements to match the kernel-side supremum row width. TF E2E (GE AutoFuse, --autofuse_enable_pass=matmul, Ascend950PR): matmul+abs now compiles and runs; 128x128x128 completes with results within half-cast precision. Note: 28-block (large-shape) MIX launches still deadlock in the GE/fftsplus dispatch (block group 13 never scheduled) — tracked separately, not addressed by this PR. ## TF non-inductor static-flow fixes (follow-up commit 5a48b96e) - **codegen_kernel.cpp**: non-inductor static Init referenced params.cv_tiling_data->cube_m_stage_size, but TF/GE online-compiled static graphs have neither INDUCTOR_CONST_TILING_DATA nor the cv_tiling_data Params member (is_dynamic=false), failing with "no member named 'cv_tiling_data' in 'AutoFusionVector::Params'". Now reads the baked solver budget (AutofuseTilingData::STAGE_SIZE_NAME) and derives stage rows as stage_size_name / basen_align (conv2d-branch pattern). - **asc_codegen_compile.py**: host tiling still used ub_align_value = 32 / cube_output_type_size; aligned to 32 elements to match the kernel-side supremum row width. TF E2E (GE AutoFuse, --autofuse_enable_pass=matmul, Ascend950PR): matmul+abs now compiles and runs; 128x128x128 completes within half-cast precision. Note: 28-block (large-shape) MIX launches still deadlock in the GE/fftsplus dispatch (block group 13 never scheduled) - tracked separately, not addressed by this PR. See merge request: cann/graph-autofusion!2177 | 5 天前 | |
style: 统一 Autofuse 代码格式 Co-authored-by: Ling-DT<lingxing@huawei.com> # message auto-generated for no-merge-commit merge: !921 merge style/clang-format-autofuse-20260611 into develop style: 统一 Autofuse 代码格式 Created-by: ling-DT Commit-by: Ling-DT Merged-by: cann-robot Description: # Pull Request ## 描述 基于 cann/graph-autofusion:develop 最新提交 46a23b0,使用仓库根目录 .clang-format 对 autofuse/ 目录内受版本管理的 C/C++/AscendC 源文件执行统一格式化。 本 PR 仅包含 autofuse/ 目录格式化变更;super_kernel/ 目录格式化变更按要求暂留本地,未提交到本 PR。 格式化工具:clang-format 18.1.8,参数:--style=file。 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新功能 - [x] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue 无。 ## 如何测试 描述测试此变更的步骤和前提条件: 1. /tmp/opencode/clang-format-18-venv/bin/clang-format -i --style=file <autofuse C/C++/AscendC files> 2. git diff --cached --check 3. git diff --name-only HEAD~1..HEAD | cut -d/ -f1 | sort | uniq -c 确认 PR 提交仅包含 autofuse/。 ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如:feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 本 PR 为纯格式化变更,不涉及功能逻辑、接口、构建脚本或打包内容修改。 See merge request: cann/graph-autofusion!921 | 3 个月前 | |
feat: support IndexExpr and Arange autofusion Co-authored-by: Jett_Woo<wujinteng1@huawei.com> # message auto-generated for no-merge-commit merge: !1961 merge index-expr-device-validation-pr into develop feat: support IndexExpr and Arange autofusion Created-by: Jett_Woo Commit-by: Jett_Woo Merged-by: cann-robot Description: # Pull Request ## 描述 支持 IndexExpr 和 Arange 自动融合,补充 ASCIR/Python 接口、调度与 codegen 支持,并完善设备验证、UT 和 Backend E2E 用例。Arange 仅保留连续物理布局,数学上的非单位 step 仍受支持。 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [x] Bug 修复 - [x] 新功能 - [ ] 代码风格更新(格式化,局部变量) - [ ] 重构(既不修复错误也不增加功能的代码变动) - [x] 构建过程或辅助工具的变动 - [ ] 文档内容更新 ## 关联的Issue 无 ## 如何测试 描述测试此变更的步骤和前提条件: 1. 已完成 IndexExpr/Arange 相关 C++ 定向 UT,12 passed。 2. 已完成 device-validation Python 定向测试,259 passed;Ascend950 fused 精度验证有效 133 个 cell,其中 131 个通过,reduce_mask 的两个既有通用 Reduce codegen 问题仍按实测结果保留。 3. 已完成相关构建目标编译验证,构建并行度限制为 -j 8。 ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [ ] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如:feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 本 PR 基于远端 develop 分支新建。未包含 docs/、tool/、temp/、验证日志或生成产物。 See merge request: cann/graph-autofusion!1961 | 21 天前 | |
style: 统一 Autofuse 代码格式 Co-authored-by: Ling-DT<lingxing@huawei.com> # message auto-generated for no-merge-commit merge: !921 merge style/clang-format-autofuse-20260611 into develop style: 统一 Autofuse 代码格式 Created-by: ling-DT Commit-by: Ling-DT Merged-by: cann-robot Description: # Pull Request ## 描述 基于 cann/graph-autofusion:develop 最新提交 46a23b0,使用仓库根目录 .clang-format 对 autofuse/ 目录内受版本管理的 C/C++/AscendC 源文件执行统一格式化。 本 PR 仅包含 autofuse/ 目录格式化变更;super_kernel/ 目录格式化变更按要求暂留本地,未提交到本 PR。 格式化工具:clang-format 18.1.8,参数:--style=file。 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新功能 - [x] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue 无。 ## 如何测试 描述测试此变更的步骤和前提条件: 1. /tmp/opencode/clang-format-18-venv/bin/clang-format -i --style=file <autofuse C/C++/AscendC files> 2. git diff --cached --check 3. git diff --name-only HEAD~1..HEAD | cut -d/ -f1 | sort | uniq -c 确认 PR 提交仅包含 autofuse/。 ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如:feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 本 PR 为纯格式化变更,不涉及功能逻辑、接口、构建脚本或打包内容修改。 See merge request: cann/graph-autofusion!921 | 3 个月前 | |
【PR】: [fix] [autofuse] adapt reform of the same-named header files of ge. Co-authored-by: xingzhixiong<xingzhixiong@huawei.com> # message auto-generated for no-merge-commit merge: !1149 merge develop_change_dir_of_metadef_headers into develop 【PR】: [fix] [autofuse] adapt reform of the same-named header files of ge. Created-by: xingzhixiong Commit-by: xingzhixiong Merged-by: cann-robot Description: # Pull Request ## 描述 metadef在做同名头文件整改,整改完编译发现gaf失败,原因是gaf仓和ge仓也有同名且子目录相同的头文件,故需要将gaf仓的同名头文件的子目录进行整改,只给gaf仓内部使用,避免产生耦合编译问题。 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [x] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在当前页面的右侧'关联Issue'部分添加相应Issue链接,并勾选'合并后关闭已关联的 Issue'选项。 --> ## 如何测试 描述测试此变更的步骤和前提条件: 1. ci流水线pass 2. RDV pass ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如: feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 在此添加任何其他关于本次 PR 的说明。 See merge request: cann/graph-autofusion!1149 | 2 个月前 | |
fix(cv-ubfuse): align UB physical layout for mixed-dtype vector tensors Co-authored-by: tianbaolin<tianbaolin1@qq.com> Co-authored-by: ling-DT<lingxing@huawei.com> # message auto-generated for no-merge-commit merge: !2177 merge tbl/fix/cv-ubfuse-mixed-dtype-ub-alignment-dev into develop fix(cv-ubfuse): align UB physical layout for mixed-dtype vector tensors Created-by: tianbaolin Commit-by: ling-DT;tianbaolin Merged-by: cann-robot Description: ## Problem In CV UBFuse kernels the epilogue consumes the cube output by rows ( stageM * blockShapeNAlign) while queue tensors were still sized by the flat element budget (a0a1t), and 1D flat APIs were used for mixed-dtype vector stages. When tensor row strides differ by dtype (e.g. bool rows are 32B-aligned while float rows are not), the flat interpretation reads/writes wrong addresses and the queue allocation can be smaller than the real per-stage footprint, which corrupts results (scattered mismatches) or overflows UB (aicore exception). ## Fix Keeps the three-size contract (UB allocation >= UB compute size >= valid data size): **Tiling** - basen_align aligns to 32 elements, so it is the supremum of every dtype 32B-aligned row width; cube_ub_stage_size keeps cube-dtype element semantics - new cube_m_stage_size (max stage rows); after the solver picks STAGE_SIZE_NAME it is overwritten with STAGE_SIZE_NAME / basen_align, so rows * any-dtype-row-width never exceeds the solver per-dtype element budget - serialize the new field for const/dynamic/DB paths **Kernel init** - stage_size unified to element count (solver budget a0a1t, falling back to cube fragment capacity for tiny stages) - stage_size_type (rows) comes from cube_m_stage_size on all four flows: inductor const (kConstTilingData), inductor dynamic (params), non-inductor static (kConstTilingData baked by ascbc) and non-inductor dynamic (params.cv_tiling_data) - TensorSizeAssign emits local_size = stage_size for every UB tensor, so each dtype byte size equals its solver budget exactly - buf_cube sized by the pure C-fragment capacity - conv2d stage_size switched to element count as well **Reg APIs** - CvApi2DParams gains valid_size / output_compute_size / input_compute_size - Cast/Floor/Round/Trunc/Compare use the 2D form with logical {curAivM, curAivN} dims plus per-dtype physical row strides under CV UBFuse - WhereRegApiCall::GenerateNoLoopCase emits the 2D WhereExtend form with an independent mask stride, fixing bool-mask rows (e.g. align(N,32) != float row width) that previously went through a flat 1D call ## Verification (torch.compile, forced CV fusion, Ascend950PR): - tensor/broadcast/scalar compares, where (bool mask from GM, int8, int64, two float branches, compare->where), cast (fp16/int32), floor/round/trunc, add/mul/sub/div, max/min, unary and chained cases all match eager bit-exactly - previously failing N=400/600 and crashing N=664 now pass - inductor dynamic shape (params path) verified with multiple shapes - non-inductor flows covered by code-path audit (ascbc bakes kConstTilingData, dynamic reads params.cv_tiling_data) - UT expectations updated for the new stage_size element semantics ## TF non-inductor static-flow fixes (follow-up commit 5a48b96e) The rework broke TF static-shape kernel compilation (and exposed two latent misalignments): - **codegen_kernel.cpp**: non-inductor static Init referenced params.cv_tiling_data->cube_m_stage_size, but TF/GE online-compiled static graphs have neither INDUCTOR_CONST_TILING_DATA nor the cv_tiling_data Params member (is_dynamic=false), failing with no member named 'cv_tiling_data' in 'AutoFusionVector::Params'. Now reads the baked solver budget (AutofuseTilingData::STAGE_SIZE_NAME) and derives stage rows as stage_size_name / basen_align (conv2d-branch pattern). - **asc_codegen_compile.py**: host tiling still used ub_align_value = 32 / cube_output_type_size; aligned to 32 elements to match the kernel-side supremum row width. TF E2E (GE AutoFuse, --autofuse_enable_pass=matmul, Ascend950PR): matmul+abs now compiles and runs; 128x128x128 completes with results within half-cast precision. Note: 28-block (large-shape) MIX launches still deadlock in the GE/fftsplus dispatch (block group 13 never scheduled) — tracked separately, not addressed by this PR. ## TF non-inductor static-flow fixes (follow-up commit 5a48b96e) - **codegen_kernel.cpp**: non-inductor static Init referenced params.cv_tiling_data->cube_m_stage_size, but TF/GE online-compiled static graphs have neither INDUCTOR_CONST_TILING_DATA nor the cv_tiling_data Params member (is_dynamic=false), failing with "no member named 'cv_tiling_data' in 'AutoFusionVector::Params'". Now reads the baked solver budget (AutofuseTilingData::STAGE_SIZE_NAME) and derives stage rows as stage_size_name / basen_align (conv2d-branch pattern). - **asc_codegen_compile.py**: host tiling still used ub_align_value = 32 / cube_output_type_size; aligned to 32 elements to match the kernel-side supremum row width. TF E2E (GE AutoFuse, --autofuse_enable_pass=matmul, Ascend950PR): matmul+abs now compiles and runs; 128x128x128 completes within half-cast precision. Note: 28-block (large-shape) MIX launches still deadlock in the GE/fftsplus dispatch (block group 13 never scheduled) - tracked separately, not addressed by this PR. See merge request: cann/graph-autofusion!2177 | 5 天前 | |
fix: enforce block dim hardware core budget Co-authored-by: zhang_shengjie<804425610@qq.com> # message auto-generated for no-merge-commit merge: !1956 merge fix/block_dim_bug into develop fix: enforce block dim hardware core budget Created-by: zhang_shengjie Commit-by: zhang_shengjie Merged-by: cann-robot Description: # Pull Request ## 1. 主要解决的问题 PGO 多 Group/TopN 场景中,生成或恢复的 block_dim 可能超过硬件实际 AIV 数;同时存在以下关联失败链路: - 动态 CORENUM 表达式在 solver 前被提前求值,搜索变量尚未赋值时可能触发除 0(SIGFPE)。 - tiling case、PGO 候选和静态 tiling 入口未完整传播失败,可能继续使用无效候选或未初始化输出。 - PGO 配置文件可直接恢复超预算 block_dim,且失败回退前会污染实时 tiling 的初始状态。 - 多 Group 场景未区分串行与并行 launch 语义,可能错误聚合 core budget。 ## 2. 修改方案 - 将 CORENUM 保留为显式 solver 约束;依赖搜索变量的 CORENUM 表达式不再在 DoTiling 前提前求值。 - GeneralTiling 后校验每个 tiling case 的 block_dim <= corenum_,fused 顶层再次校验聚合结果;超预算返回失败,不做静默截断,避免 tile 漏算。 - 串行 Group 的外层 block_dim 取各 Group 最大值;并行 Group 按求和语义安排 block offset,并限制在当前硬件 probe 范围内。 - Inductor modeled/measured TopN 搜索统一使用 min(limit->aiv_num, g_no_limit_res.aiv_num) 作为可用 AIV 数。 - PGO 配置增加 flag、数据长度、memcpy_s 和 block budget 校验;先读取到临时副本,仅校验成功后写回,失败时使用未污染的实时 tiling 状态重新搜索。 - PGO 搜索只向 batch callback 传递有效候选,并在无新增候选时返回失败。 - AutofuseTilingWithConfig 失败后立即向 C++ tiling/静态生成入口传播;静态生成返回空结果时,两个 Python 编译入口抛出明确异常。 ## 3. 代码修改流程图 mermaid flowchart TD A[获取实际 AIV/UB 资源] --> B[初始化 tiling core budget] B --> C{PGO 配置有效且 block_dim 合法?} C -- 是 --> D[提交 PGO 临时副本] C -- 否 --> E[使用未污染状态实时搜索] E --> F[solver 执行 CORENUM 约束] F --> G[各 tiling case 计算并校验 block_dim] G --> H[串行 Group 取 max / 并行 Group 求和并安排 offset] H --> I{聚合 block_dim 不超过硬件预算?} D --> I I -- 是 --> J[TopN 仅保留有效候选并执行 profile] J --> K[输出选中 tiling 或静态 kernel] I -- 否 --> L[逐层返回失败] L --> M[实时搜索 fallback 或 Python 编译异常] ## 4. 测试用例说明 ### 4.1 UT/静态检查 | 验证项 | 命令/范围 | 结果 | |---|---|---| | ATT 编译 | cmake --build build --target att_ut -j 8 | 通过 | | Codegen 编译 | cmake --build build --target test_main -j 8 | 通过 | | Generator/solver UT | GeneratorUT.* + CORENUM solver 用例 | 70 passed,1 disabled | | Codegen 定向 UT | PGO 配置隔离、失败输出保护、TopN 核预算、静态 tiling | 6 passed | | Python UT | test_ascendc_compile.py + test_asc_codegen_compile_conv2d.py | 96 passed | | 格式与提交检查 | clang-format、ruff、pre-commit、OAT | 通过 | ### 4.2 PGO 实机验证 验证环境:CANN 9.2.0,Ascend950PR_9579,硬件 AIV 数 56;用例位于 /workspace/CANN-DevTools/att_generalization。 选择 ATT-CG-01:6 输入连续 Add + Pow/Mean/Rsqrt RMSNorm,shape 为 (1, 2048, 1024),同时覆盖 Reduce、多个 schedule result/group 与 PGO TopN,是本问题最直接的回归图。 验证前执行: bash cmake --build build --target aihac_codegen -j 8 cmake --build build --target pyautofuse -j 8 运行时通过本地 package path/LD_LIBRARY_PATH 成套加载本分支 pyautofuse.so、libaihac_codegen.so 及 graph/expression 依赖,避免新旧 C++ ABI 混用;实测加载路径为: text /workspace/graph-autofusion/build/autofuse/compiler/py_module/pyautofuse.so /workspace/graph-autofusion/build/autofuse/libaihac_codegen.so 分别执行: bash python -m att_generalization.run_att_cache_guard --topn 1 --warmup 2 --repeat 5 --device npu:0 --att-profiling python -m att_generalization.run_att_cache_guard --topn 10 --warmup 2 --repeat 5 --device npu:0 --att-profiling 结论:Top1/Top10 均完成 PGO host/device 编译、候选 profiling、NPU 执行和精度比对,未出现 SIGFPE、core dump 或超核数 block_dim。 | 配置 | PGO 搜索结果 | 实际编译候选 | 最终 block_dim | 硬件上限 | 最大绝对误差 | 结果 | |---|---:|---:|---:|---:|---:|---| | Top1 | 56 个可行 tiling,block_dim 27–56 | 1 | 53 | 56 | 4.76837158203125e-07 | PASS | | Top10 | 58 个可行 tiling,block_dim 27–56 | 10 | 53 | 56 | 4.76837158203125e-07 | PASS | Top10 实际编译的 10 个候选外层 block_dim 为 53, 52, 53, 54, 54, 52, 49, 52, 49, 46;PGO 搜索结果中 block_dim > 56 的数量为 0。 ## 5. 核对清单 - [x] 代码遵循项目代码风格,并通过 clang-format/ruff - [x] 已完成相关 C++/Python 自测 - [x] 已在 Ascend950PR_9579 完成 PGO Top1/Top10 实机验证 - [x] 已核验全部搜索结果和实际编译候选 block_dim <= 56 - [x] PR 标题使用 fix: 类型标签 - [x] 已阅读并遵守 CONTRIBUTING.md - [x] 未修改对外 API/ABI、CMake 或打包布局 - [ ] 文档更新(本次为内部 bug 修复,无用户接口文档变更) ## 6. 其他信息 - 原问题环境为 Ascend950PR_9589(AIV=64);本次补充验证环境为 Ascend950PR_9579(AIV=56),覆盖了更小 core budget 下的 TopN 行为。 - 首次尝试仅覆盖本地 libaihac_codegen.so、仍使用安装包旧 pyautofuse.so 时,在 graph/expression 对象析构处出现 ABI 混用崩溃;改为成套加载本分支 binding 和依赖后 Top1/Top10 均通过。该现象属于验证部署组合问题,不是 PGO 流程回归。 See merge request: cann/graph-autofusion!1956 | 21 天前 | |
style: 统一 Autofuse 代码格式 Co-authored-by: Ling-DT<lingxing@huawei.com> # message auto-generated for no-merge-commit merge: !921 merge style/clang-format-autofuse-20260611 into develop style: 统一 Autofuse 代码格式 Created-by: ling-DT Commit-by: Ling-DT Merged-by: cann-robot Description: # Pull Request ## 描述 基于 cann/graph-autofusion:develop 最新提交 46a23b0,使用仓库根目录 .clang-format 对 autofuse/ 目录内受版本管理的 C/C++/AscendC 源文件执行统一格式化。 本 PR 仅包含 autofuse/ 目录格式化变更;super_kernel/ 目录格式化变更按要求暂留本地,未提交到本 PR。 格式化工具:clang-format 18.1.8,参数:--style=file。 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新功能 - [x] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue 无。 ## 如何测试 描述测试此变更的步骤和前提条件: 1. /tmp/opencode/clang-format-18-venv/bin/clang-format -i --style=file <autofuse C/C++/AscendC files> 2. git diff --cached --check 3. git diff --name-only HEAD~1..HEAD | cut -d/ -f1 | sort | uniq -c 确认 PR 提交仅包含 autofuse/。 ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如:feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 本 PR 为纯格式化变更,不涉及功能逻辑、接口、构建脚本或打包内容修改。 See merge request: cann/graph-autofusion!921 | 3 个月前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 6 天前 | ||
| 1 个月前 | ||
| 4 个月前 | ||
| 4 个月前 | ||
| 4 个月前 | ||
| 3 个月前 | ||
| 16 天前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 5 天前 | ||
| 3 个月前 | ||
| 21 天前 | ||
| 3 个月前 | ||
| 2 个月前 | ||
| 5 天前 | ||
| 21 天前 | ||
| 3 个月前 |