已合并
#66: 新增 Device C++ 标准/语法限制与 Ascend C API 废弃接口发现、替换和重验两张 Runbook #160
bianque创建于 7 天前
#66: 新增 Device C++ 标准/语法限制与 Ascend C API 废弃接口发现、替换和重验两张 Runbook #160
已合并
共 4 个文件变更+253-0
| @@ -0,0 +1,119 @@ | |||
| 1 | +--- | ||
| 2 | +type: "Runbook" | ||
| 3 | +title: "Ascend C Device 侧 C++ 标准级别与语法限制判定" | ||
| 4 | +description: "核对 Ascend C Host/Device 编译标准:Device 默认 C++17,可选 C++11/14/20;区分纯 SIMT 与 SIMD/SIMT 混合编程的运行时递归边界,并检查核函数 POD 入参、SIMT VF 地址空间与结构体限制。附编译选项、诊断步骤和静默栈地址错误的验证边界。" | ||
| 5 | +tags: | ||
| 6 | +- "task.implementation" | ||
| 7 | +- "task.migration" | ||
| 8 | +- "topic.compilation" | ||
| 9 | +status: stable | ||
| 10 | +sources: | ||
| 11 | +- resource: cann-docs-raw/asc-devkit/docs/zh/guide/technical_appendix/cpp_standard_support/overview.md | ||
| 12 | + role: primary | ||
| 13 | +- resource: cann-docs-raw/asc-devkit/docs/zh/guide/technical_appendix/cpp_standard_support/cpp_language_restrictions/general_restrictions.md | ||
| 14 | + role: primary | ||
| 15 | +- resource: cann-docs-raw/asc-devkit/docs/zh/guide/technical_appendix/cpp_standard_support/cpp_language_feature/lambda_expressions.md | ||
| 16 | + role: supporting | ||
| 17 | +- resource: cann-docs-raw/asc-devkit/docs/zh/guide/programming_guide/compilation_and_execution/operator_compilation/ai_core_operator_compilation.md | ||
| 18 | + role: constraint | ||
| 19 | +created_at: '2026-10-23T02:00:00Z' | ||
| 20 | +updated_at: '2026-10-23T08:55:34Z' | ||
| 21 | +platforms: | ||
| 22 | +- agnostic | ||
| 23 | +--- | ||
| 24 | + | ||
| 25 | +# Ascend C Device 侧 C++ 标准级别与语法限制判定 | ||
| 26 | + | ||
| 27 | +## 适用场景 | ||
| 28 | + | ||
| 29 | +出现下列任一情形时,先用本卡定性,再动代码: | ||
| 30 | + | ||
| 31 | +- 把 Host 侧或普通 C++ 代码搬进 kernel,用到虚函数、STL 容器、`tuple`、动态申请内存、`typeid`、文件 IO; | ||
| 32 | +- 编译报错涉及参数地址空间或结构体参数,或者 VF 内携带 MainScalar 栈地址却未报错; | ||
| 33 | +- 设计核函数(Kernel)入参列表、`__simt_vf__` 函数签名,或写 SIMD 与 SIMT 混合编程的结构体定义; | ||
| 34 | +- 想确认实际 C++ 标准,以及为什么切换到 C++11/14/20 后语法或 API 无法使用。 | ||
| 35 | + | ||
| 36 | +## 支持级别:先分清 Host 侧与 Device 侧 | ||
| 37 | + | ||
| 38 | +- **Host 侧**:与 clang15 一致,支持完整的 C/C++ 标准。 | ||
| 39 | +- **Device 侧**:固定来源文档的默认标准是 **C++17**,可指定 **C++11、C++14、C++20**;bisheng 命令行用 `-std=c++<version>` 或 `--std=c++<version>`,CMake 用 `CMAKE_ASC_STANDARD`(默认 17,设置低于 17 会告警)。无论使用哪种构建方式,都应核对实际编译命令;指定低于 C++17 的标准时,部分 API 内部实现可能不可用,部分高版本语法仍可能以 clang 扩展告警通过,需要严格约束时使用 `-Werror`。 | ||
| 40 | +- 两条轴必须分开判:**标准级别与编译诊断**用于核对语法,**Device 运行时能力与编程模式**用于核对特性是否可用。标准级别够(例如按 C++17 编译)不代表该特性在 Device 侧可用。 | ||
| 41 | +- 平台口径:本卡来源全部按 C++ 标准级别与编译器行为给结论,正文未把结论绑定到任何芯片型号,因此本卡标 `agnostic`;若问题实际来自某个芯片/架构的后端能力缺口,本卡不适用(见文末"相邻卡分工")。 | ||
| 42 | +- Host 侧的"完整标准"是编译能力口径,不等于每条构建链都开到了最新标准:具体编译单元以什么语言标准编译,要按构建配置核对(op_host 侧已有"链上标准低于宿主机 g++"的实例,见文末相邻卡)。 | ||
| 43 | + | ||
| 44 | +## Device 侧不可用/被限制的语言特性 | ||
| 45 | + | ||
| 46 | +| 类别 | 限制(Device 侧) | | ||
| 47 | +|---|---| | ||
| 48 | +| 类与继承 | 不支持虚函数;不支持虚继承 | | ||
| 49 | +| 控制流 | 运行时递归仅纯 SIMT 编程场景可用;SIMD 与 SIMT 混合编程等其他场景不支持 | | ||
| 50 | +| 动态内存 | 不支持动态 `malloc`、`free`、`new`、`delete` | | ||
| 51 | +| 标准库 | 不支持 STL;不支持标准库下的 `tuple` 及算法类运算(相关库函数调用需要标记 `aicore`) | | ||
| 52 | +| RTTI | 不支持运行时 `typeid` | | ||
| 53 | +| IO | 不支持文件系统 IO | | ||
| 54 | +| Lambda | 纯 SIMT 的核函数局部 lambda 无需附加函数属性;混合编程场景按定义位置标记 `__aicore__`、`__simd_callee__`、`__simt_callee__` 或 `__callee__` | | ||
| 55 | + | ||
| 56 | +混合编程场景的 SIMT VF 内 lambda 属性标注形态(属性写在参数列表之后;纯 SIMT 核函数局部 lambda 无需此标记): | ||
| 57 | + | ||
| 58 | +```cpp | ||
| 59 | +auto affine = [scale, bias](float v) __simt_callee__ { return v * scale + bias; }; | ||
| 60 | +``` | ||
| 61 | + | ||
| 62 | +诊断用法:虚函数/虚继承、动态申请、STL、运行时 `typeid` 或文件系统 IO 命中禁用项;运行时递归先区分纯 SIMT 与混合编程,再对照目标编译命令验证。编译期 `constexpr` 递归与运行时递归也须分开判。 | ||
| 63 | + | ||
| 64 | +## 核函数(Kernel)参数列表限制 | ||
| 65 | + | ||
| 66 | +核函数参数列表**仅支持**以下三类: | ||
| 67 | + | ||
| 68 | +1. 基础数据类型,如 `int32_t`、`float`; | ||
| 69 | +2. 基础数据类型组成的结构体:支持嵌套结构体形式,但必须是 **POD**(Plain Old Data); | ||
| 70 | +3. 基础数据类型的指针,如 `int32_t*`、`float*`——这些指针实际指向 Global Memory。 | ||
| 71 | + | ||
| 72 | +判定:核函数入参须落在上述三类;非 POD 类对象、引用、多态类型不能仅凭名字归入“POD 结构体”。POD 约束取决于类型性质而非使用 `struct` 还是 `class` 关键字,不能把所有自定义类对象一概排除;仍须核对实际定义并以目标编译结果验证。 | ||
| 73 | + | ||
| 74 | +## SIMT VF 函数(`__simt_vf__`)限制 | ||
| 75 | + | ||
| 76 | +- 标量按值传入;引用形参不支持,指针形参必须指向 GM 或 UB 并带地址空间限定符,不能用普通标量指针形参。 | ||
| 77 | +- 不允许把栈数组作为参数传入;指针形参必须显式使用 `__gm__` 或 `__ubuf__` 地址空间限定符。违反时编译期报错,来源给出的报错文本为 `error: cannot initialize a parameter of type '__gm__ int *' with an lvalue of type 'int[5]'`。规避写法:把数据放到 Global Memory 或 UB,用带限定符的指针传参。 | ||
| 78 | +- VF 内不得访问 MainScalar 栈空间:即使把栈地址通过 UB 中的整数/多级指针间接传入并编译通过,VF 内解引用仍是运行时未定义行为,可能静默读写错误内存。 | ||
| 79 | +- 不允许使用结构体作为参数。 | ||
| 80 | +- `__simt_vf__` 入口本身不能通过函数指针调用,须以编译期确定的模板实参经 `asc_vf_call()` 调用;VF 内 `__simt_callee__` 辅助函数可通过带 `__simt_callee__` 标记的函数指针间接调用,普通函数指针类型不匹配。 | ||
| 81 | +- 函数的 inline 行为由编译器决定:额外添加的 `always_inline` 或 `noinline` 会被忽略。 | ||
| 82 | + | ||
| 83 | +## SIMD 与 SIMT 混合编程的结构体限制 | ||
| 84 | + | ||
| 85 | +- 使用位于 Global Memory 或 Unified Buffer(UB)中的结构体/类**拷贝构造**新对象时,需要开发者手动实现拷贝构造函数,编译器不会隐式生成;两个地址空间要分别重载,例如 `__callee__ TestS(const __gm__ TestS& other)` 与 `__callee__ TestS(const __ubuf__ TestS& other)`,调用点按数据所在空间选中对应重载。 | ||
| 86 | +- 异构编译场景中 Host 与 Device 可共用结构体定义,但 Host 侧无法识别 `__callee__`、`__gm__` 等 Device 侧关键字,因而无法据此实现函数重载。需要定义多个地址空间重载函数时,用编译预定义宏 `__NPU_ARCH__` 把相关 Device 代码隔离,避免函数定义冲突。 | ||
| 87 | +- 不支持直接向 Global Memory 或 UB 地址空间写入结构体;来源对该形态仅标注"不支持,编译报错",未给出报错文本。 | ||
| 88 | + | ||
| 89 | +## 判定步骤(按序执行) | ||
| 90 | + | ||
| 91 | +1. **分侧**:先确认代码属于 Device 侧(kernel)还是 Host 侧(tiling/框架)。Host 侧按完整 C/C++ 标准处理;Device 侧继续往下。 | ||
| 92 | +2. **过特性清单**:比对禁用项;运行时递归核对编程模式,lambda 核对定义位置与函数属性,不将条件限制误判为通用禁用。 | ||
| 93 | +3. **查核函数入参**:把参数列表逐项归入"基础类型 / POD 结构体 / 基础类型指针"三类,任一项落不进就调整入参形态(例如把类成员拆成 POD 字段、把引用改成值或指针)。 | ||
| 94 | +4. **查 `__simt_vf__`**:标量按值、无引用或栈数组实参、指针带 `__gm__`/`__ubuf__`、无结构体参数;入口经 `asc_vf_call()` 调用,辅助 callee 函数指针须带匹配标记。追溯间接传入的地址是否指向 MainScalar 栈,不能用编译通过排除这类运行时错误;`always_inline`/`noinline` 不控制内联。 | ||
| 95 | +5. **查混合编程结构体**:拷贝构造是否手写、是否按地址空间重载、Device 代码是否用 `__NPU_ARCH__` 隔离、是否存在"向 GM/UB 写结构体"的语句。 | ||
| 96 | +6. **编译与运行验证**:检查实际标准与目标编程模式下的编译诊断;编译成功只证明部分语法检查通过,不能排除 VF 读写 MainScalar 栈地址的静默未定义行为,需排查地址来源并用目标环境验证数据。 | ||
| 97 | + | ||
| 98 | +## 验证方式 | ||
| 99 | + | ||
| 100 | +- 核对 bisheng `-std` / `--std` 或 CMake `CMAKE_ASC_STANDARD` 与实际编译命令;需要严格拒绝高版本语法扩展时加 `-Werror`,低于 C++17 还要检查所用 API 是否依赖 C++17。 | ||
| 101 | +- 对文档声明会编译报错的禁用项检查编译诊断;对 MainScalar 栈地址经 UB 带入 VF 的情况直接检查地址来源及数据结果,不能以无编译错误为通过证据。此处没有执行硬件或编译实验。 | ||
| 102 | +- 混合编程结构体:检查 Global Memory 与 UB 两个地址空间的拷贝构造函数是否都已实现——来源示例中两条读路径分别调用不同的重载,两条路径都要覆盖。 | ||
| 103 | + | ||
| 104 | +## 失效边界 | ||
| 105 | + | ||
| 106 | +- **清单之外不等于可用**:来源给的是禁用项与受限项,没有"允许清单";未被禁止的特性仍以实际编译结果为准,本卡不做"一定可用"的背书。 | ||
| 107 | +- **报错文本覆盖不全**:来源对多种限制给出不同诊断示例;不要将任何一条错误串视为所有编译模式的固定文本,静默未定义行为尤其不能靠报错判断。 | ||
| 108 | +- **不覆盖全部构建链**:来源给出 bisheng `-std` / `--std` 与 AI Core CMake 的 `CMAKE_ASC_STANDARD`;其他工程须核对实际传给编译器的选项。 | ||
| 109 | +- **不覆盖具体后端缺口**:来源按标准级别与编译器行为给结论,不针对某一芯片/架构;具体芯片上的后端能力缺口属于另一类问题。 | ||
| 110 | + | ||
| 111 | +## 相邻卡分工 | ||
| 112 | + | ||
| 113 | +- [bf16_scalar_to_fp32_bit_extension](./bf16_scalar_to_fp32_bit_extension.md):具体后端缺口的实测实例(bf16 标量强转、标量有序比较报错与位级规避)。本卡给语言/标准级的限制清单,该卡给"某条限制在特定后端上的具体形态"。 | ||
| 114 | +- [pipebarrier_pipe_s_is_not_supported](./pipebarrier_pipe_s_is_not_supported.md):模板参数取值域导致的编译失败实例。本卡管语言特性与函数签名,该卡管"某模板参数不在目标编译器允许范围"。 | ||
| 115 | +- [casttrait_nttp_uses_reference_in_cxx17](./casttrait_nttp_uses_reference_in_cxx17.md):同一写法在不同标准级别下的可用性差异(按值 NTTP 需 C++20,C++17 需改用 const 引用 NTTP),是"标准级别决定语法能否被接受"的落地证据。 | ||
| 116 | +- [op_host_fwk_modules_rejects_cxx20](./op_host_fwk_modules_rejects_cxx20.md):Host 侧某个具体构建链以低于宿主机 g++ 的标准编译(`auto` lambda 形参、结构化绑定失败),用于核对"该编译单元实际用的语言标准"。 | ||
| 117 | +- [device_cpp_and_scalar_vector_interfaces](../../guides/environments/device_cpp_and_scalar_vector_interfaces.md):设备 C++ 子集与函数可调用性的边界(按编译目标、函数标注、头文件与数值合同判断某个 std 风格/设备函数能否调用)。本卡给"官方禁用清单 + 判定步骤",该卡给"未被本卡禁止时如何逐个核对实现与类型约束"。 | ||
| 118 | +- [duplicate_dtype_support_arch22_arch35](./duplicate_dtype_support_arch22_arch35.md):按架构分档的 API/指令支持差异,不属于 C++ 标准限制范畴。 | ||
| 119 | +- [deprecated_interface_detection_and_replacement](./deprecated_interface_detection_and_replacement.md):接口废弃与替换流程(编译期告警/文档清单驱动),与本卡的语言级限制互补。 | ||
| @@ -0,0 +1,107 @@ | |||
| 1 | +--- | ||
| 2 | +type: "Runbook" | ||
| 3 | +title: "Ascend C API 废弃接口的发现、替换与重验流程" | ||
| 4 | +description: "迁移 Ascend C API 时结合废弃声明告警、接口级清单与基础 API 命名变更表定位调用点;按旧重载、产品范围和目标签名选择替代。同步复合接口替换需重新核对 asc_sync 的全流水语义,并分别验证编译、依赖顺序、数值和性能。" | ||
| 5 | +tags: | ||
| 6 | +- "task.migration" | ||
| 7 | +- "task.implementation" | ||
| 8 | +- "topic.compilation" | ||
| 9 | +status: stable | ||
| 10 | +sources: | ||
| 11 | +- resource: cann-docs-raw/asc-devkit/docs/zh/api/appendix/deprecated_interface.md | ||
| 12 | + role: primary | ||
| 13 | +- resource: cann-docs-raw/asc-devkit/docs/zh/api/appendix/interface_change_description.md | ||
| 14 | + role: supporting | ||
| 15 | +- resource: cann-docs-raw/asc-devkit/docs/zh/api/SIMD-API/c_api/defs/macro/asc_deprecation.md | ||
| 16 | + role: evidence | ||
| 17 | +- resource: cann-docs-raw/asc-devkit/docs/zh/api/SIMD-API/c_api/deprecated_interface/asc_mmad_deprecated.md | ||
| 18 | + role: example | ||
| 19 | +created_at: '2026-10-23T02:00:00Z' | ||
| 20 | +updated_at: '2026-10-23T08:55:34Z' | ||
| 21 | +platforms: | ||
| 22 | +- '950' | ||
| 23 | +- a2 | ||
| 24 | +- a3 | ||
| 25 | +--- | ||
| 26 | + | ||
| 27 | +# Ascend C API 废弃接口的发现、替换与重验流程 | ||
| 28 | + | ||
| 29 | +## 触发条件 | ||
| 30 | + | ||
| 31 | +- 从 CANN 8.5.0 及前序版本、或 9.0.0 及前序版本升级到当前版本(命名变更对照表以这两条基线给出); | ||
| 32 | +- 代码中使用了 `*_sync` 复合接口(同步语义内置在接口里),或 `asc_loadalign`、`asc_storealign` 这类"一个名字多种模式"的重载; | ||
| 33 | +- 使用了带 `unit_flag`(`uint8_t`)、`feat_offset` 等旧参数形态的接口,或旧的三参数位置控制原型; | ||
| 34 | +- 工程要在 Ascend 950PR&950DT(3510)与 Atlas A3 / Atlas A2(2201)之间共用代码,需确认废弃范围在两个体系上是否一致。 | ||
| 35 | + | ||
| 36 | +## 步骤 1:判定是否存在废弃接口调用(发现) | ||
| 37 | + | ||
| 38 | +1. **看编译告警**:部分 C API 声明可用 `ASC_DEPRECATED` 宏(公共头 `c_api/defs/macro.h`)挂上 C++ `[[deprecated]]` 属性;编译调用被标记声明的代码时,编译器会生成告警,格式为 | ||
| 39 | + `Deprecated since <version>, Will be removed after <removal_date>, Use <replacement> instead.` | ||
| 40 | + 告警文本自带开始废弃的版本、计划移除日期和推荐替代接口。 | ||
| 41 | + **边界**:该宏只添加废弃属性和告警信息,不阻止被标记接口参与编译,也不会在计划移除日期后自动删除接口;`removal_date` 仅用于生成告警文本。编译成功或没有告警均不能证明没有废弃调用:还需确认所编译的路径和声明,并查清单中的旧原型及重载。 | ||
| 42 | +2. **按清单逐名对照**:不论是否出现告警,都用两份登记文档对照——`deprecated_interface.md` 给逐接口的废弃状态和替代方向;`interface_change_description.md` 是基础 API 的命名变更对照表(原接口名 → 新接口名 → 备注),不等同于 C API 废弃清单。备注列标出改名之外的参数或语义变化。 | ||
| 43 | +3. **区分废弃状态再排期**:清单里同时存在"后续版本会废弃"(尚未废弃,可排期替换)与"已废弃"/"旧原型已废弃"(优先替换)两种措辞,二者处理节奏不同,不要一律当成立即不可用。 | ||
| 44 | +4. **工程内检索**:按清单里的接口名逐个对照调用点,重点检查 `*_sync` 后缀、被重命名的基础 API 旧名(如 `ScalarGetCountOfValue`、`FusedMulAddRelu`、`GetAccVal`)、单名多模式的重载(`asc_loadalign`、`asc_storealign`);同名时按实际参数和目标产品区分旧/新原型。 | ||
| 45 | + | ||
| 46 | +## 步骤 2:按替换类型选路径(判定树) | ||
| 47 | + | ||
| 48 | +### A. 命名变更:先对照参数与语义 | ||
| 49 | + | ||
| 50 | +命名变更对照表中备注为"无"的条目包括:`ScalarGetCountOfValue`→`GetBitCount`、`ScalarCountLeadingZero`→`CountLeadingZero`、`ScalarGetSFFValue`→`GetSFFValue`、`FusedMulAddRelu`→`MulAddRelu`、`CastDeq`→`CastDequant`、`CompareScalar`→`Compares`、`SetAtomicNone`→`DisableDmaAtomic`、`InitConstValue`→`Fill`、`CalcTschBlockDim`→`CalcTschNumBlocks`。C API 废弃清单另给出 `asc_set_atomic_none`→`asc_disable_dma_atomic`、`asc_set_atomic_add_int`→`asc_set_atomic_add_int32`、`asc_set_atomic_max_int`→`asc_set_atomic_max_int32`、`asc_set_atomic_min_int`→`asc_set_atomic_min_int32`、`asc_get_ar_spr`→`asc_get_squeeze_status`、`asc_pack`→`asc_pack_to_low`、`asc_pack_v2`→`asc_pack_to_high` 等替代方向。"无"只表示对照表未附备注,清单的替代方向也不保证签名、状态或语义完全相同;逐项核对目标接口。 | ||
| 51 | + | ||
| 52 | +### B. 同步复合接口 → 非同步接口 + `asc_sync()` | ||
| 53 | + | ||
| 54 | +清单列举了矩阵计算搬运、矢量数据搬运、Memory 矢量计算等多类 `*_sync` 的替代方向,例如 `asc_copy_l12ub_sync`、`asc_copy_gm2l0a_sync`、`asc_add_sync`、`asc_abs_sync`、`asc_float2half_sync`(含 `_rn`/`_rna`/`_rd`/`_ru`/`_rz`/`_ro` 等列明的变体)、`asc_duplicate_sync`、`asc_repeat_reduce_sum_sync`:按各条目选择非同步接口并核对 `asc_sync()` 的位置。`asc_sync()` 会等待同核所有流水在调用前提交的操作,并阻塞后续指令,可能比原接口同步范围更广、影响性能;清单中的“接口 + `asc_sync()`”不证明逐点等价。`asc_sync_vec()` **无入参原型**也已废弃并推荐 `asc_sync()`;带 `id` 的重载不能据此判为废弃。 | ||
| 55 | + | ||
| 56 | +### C. 重载收窄 / 模式拆分:必须显式选新模式 | ||
| 57 | + | ||
| 58 | +- `asc_loadalign(dst, src)` 原通过函数名重载承载 NORM/BRC/UP2X/DOWN2X/UNPACK/BRCV2/BRCV3/DEINTLV 等多种搬入模式,现收窄为仅 NORM,其余模式拆成独立函数(如 `asc_loadalign_brc_datablock`、`asc_loadalign_brc_elem2datablock`、`asc_loadalign_unpack4`、`asc_loadalign_deintlv`、`asc_loadalign_downsample`)。 | ||
| 59 | +- `asc_storealign(dst, src, mask)` 原承载 NORM/FIRST/PACK/PACKV2/INTLV 等搬出模式,现收窄为仅 NORM,其余拆为 `asc_storealign_1st`、`asc_storealign_intlv`、`asc_storealign_pack`、`asc_storealign_pack_quarter`、`asc_storealign_postupdate`。 | ||
| 60 | +- 带偏移量的旧原型按"无偏移 / `addr_reg` / `int32_t` / `int32_t` Post Update"分档废弃(`asc_loadalign_*_v2`、`_v3`、`_v4` 等),替换时要同时选对新函数名与目标偏移原型。 | ||
| 61 | +- 判定:这类不能按名字机械替换,必须先确认旧调用实际落在哪个模式分支上。 | ||
| 62 | + | ||
| 63 | +### D. 旧原型 → 显式位置参数重载 | ||
| 64 | + | ||
| 65 | +`asc_float2half`、`asc_half2float`、`asc_int322int16`、`asc_bfloat162float` 等类型转换接口中,通过后缀控制源读取位置或目的写入位置的旧三参数原型已废弃;`asc_bfloat162e2m1x2` 的旧原型也已废弃。按各自条目选择**显式位置参数**重载;`asc_muls` 改用 `asc_mul_scalar_float2half_rn` 的显式位置参数重载。 | ||
| 66 | +语义还发生了拆分:`asc_exp_sub` 的 `half` 输入且不带 `src_pos` 参数的原型、以及 `asc_exp_sub_v2` 原型已废弃——`float` 输入继续用 `asc_exp_sub`,`half` 输入改用带显式 `src_pos` 的 `asc_exp_sub_half2float`。 | ||
| 67 | + | ||
| 68 | +### E. 参数类型与配置方式变更:改签名,不只是改名 | ||
| 69 | + | ||
| 70 | +- `asc_mmad`:入参 `unit_flag` 为 `uint8_t` 的形态及 `asc_mmad_sync` 已废弃,改用 `unit_flag_mode` 为 `asc_unit_flag_mode` 的新接口,同步由新接口 + `asc_sync()` 实现;`asc_mmad_mx` 同理。 | ||
| 71 | +- **按产品分开判废弃范围**:在 Atlas A3 / Atlas A2 上,带 `feat_offset` 参数的 `asc_mmad`、`asc_mmad_s4` 以及全部 `asc_mmad_sync`、`asc_mmad_s4_sync` 也在废弃之列(该参数在 2201 原型中是无效参数);`asc_mmad_sparse` 的废弃说明标注在 A3、A2 上。 | ||
| 72 | +- L2 Cache 配置改枚举:`asc_copy_gm2ub_align` / `asc_copy_ub2gm_align` 在 950 上的原高维切分搬运原型、以及 `asc_ndim_copy_gm2ub` 的原函数原型已废弃,改用 `asc_load_l2_cache_mode` / `asc_store_l2_cache_mode` 枚举值配置;`asc_set_gm2ub_pad`→`asc_set_copy_pad_val`。 | ||
| 73 | +- 矩阵与搬运配置类改名:`asc_set_l0c2gm_nz2nd`→`asc_set_l0c_copy_nz_para`、`asc_set_l0c2gm_channel_para`→`asc_set_l0c_copy_channel_para`、`asc_set_l0c2gm_config`→`asc_set_l0c_copy_config`、`asc_set_l12l0_padding_val`→`asc_set_l12l0b_3d_padding`、`asc_set_l13d_padding`→`asc_set_l12l0a_3d_padding`;`asc_set_fp32_mode`→`asc_disable_hf32`、`asc_enable_fp8`→`asc_disable_hif8`、`asc_enable_hf32_trans`→`asc_set_hf32_round_mode`。 | ||
| 74 | +- 逻辑运算收窄:`asc_and`、`asc_or` 的浮点类型重载已废弃,需按位宽选择对应的整数重载。 | ||
| 75 | + | ||
| 76 | +### F. 无替代接口与平台限定废弃(不能机械替换) | ||
| 77 | + | ||
| 78 | +- `asc_set_l0c2gm_quant_post`:已废弃且**暂无登记的替代接口**;该需求需单独评估或重新设计,不要挑一个"看起来相近"的接口顶上。 | ||
| 79 | +- `asc_get_store_atomic_config`:仅在 Ascend 950PR&950DT 系列产品上废弃(替代为 `asc_atomic_add`);`asc_set_store_atomic_config_v2` 也在 950 标注块内标注"后续版本会废弃"。 | ||
| 80 | +- 系统变量类要换成内置变量组合:`asc_get_block_idx`→内置变量 `block_idx` 配合 `asc_get_sub_block_num`、`asc_get_sub_block_id` 计算逻辑核索引;`asc_get_block_num`→内置变量 `block_num`。 | ||
| 81 | + | ||
| 82 | +## 步骤 3:替换后必须重验什么 | ||
| 83 | + | ||
| 84 | +1. **编译**:核对新接口的参数个数、类型、顺序。最危险的是"改名同时动了参数"的条目:`BlockReduceSum`/`BlockReduceMax`/`BlockReduceMin` 合并为 `ReduceDataBlock`(模板参数区分归约类型,且 **mask 与 repeatTime 的参数顺序被调整**)、`WholeReduceSum`/`WholeReduceMax`/`WholeReduceMin` 合并为 `ReduceRepeat`、`RepeatReduceSum`→`ReduceRepeat`(顺序调整并删除无效参数 `dstBlkStride`)。 | ||
| 85 | +2. **返回值与类型**:`ToFloat` 其中一个重载的返回值类型由 `float` 改为模板 `U`(`U = float`);`SetHF32Mode`、`SetHF32TransMode` 接口名不变但参数类型由 `bool` 改为枚举——这类"能编过但语义已变"的条目要逐个核对调用点。 | ||
| 86 | +3. **语义拆分**:`SetMMLayoutTransform` 按 `true`/`false` 分别对应 `SetMMRowMajor`/`SetMMColumnMajor`,不能整体替换;`ScalarCast`、`ToBfloat16` 也是按目标类型拆到不同的 `Cast` 重载。 | ||
| 87 | +4. **同步**:B 类替换后逐个核对原同步点、目标接口的同步要求及 `asc_sync()` 的实际位置;漏补可能丢失原有顺序保证,直接照搬也不能推定同步范围和性能不变。 | ||
| 88 | +5. **数值**:按原 dtype 与 Round 模式后缀(`_rn`/`_rna`/`_rd`/`_ru`/`_rz`/`_ro`)逐项对照,替换后跑同一组数据对拍。来源只给出替代关系,未承诺逐位等价。 | ||
| 89 | +6. **性能**:同步点显式化可能改变流水结构,替换后必须重测该段 kernel;来源不含性能等价承诺。 | ||
| 90 | + | ||
| 91 | +## 失效边界 | ||
| 92 | + | ||
| 93 | +- 本卡是流程与分类,**单接口的签名、约束、产品支持**以单接口卡/文档为准(见"相邻卡分工")。 | ||
| 94 | +- 平台范围:单接口 `asc_mmad` 文档列出 Ascend 950PR&950DT(`950`)、Atlas A3(`a3`)、Atlas A2(`a2`)为支持,并对 A2/A3 另列 `feat_offset` 废弃范围;这不是整个清单的统一产品矩阵。其他条目须逐项核对目标产品上的旧/新接口及同步原型;未标注产品的条目不能据此推断全平台适用。 | ||
| 95 | +- 本卡的"发现"手段依赖文档清单与编译告警,不构成"全工程扫描工具"的结论;清单本身会随版本更新,替换前应以目标 CANN 版本自带的文档/头文件再核对一次。 | ||
| 96 | + | ||
| 97 | +## 相邻卡分工 | ||
| 98 | + | ||
| 99 | +- [deprecated_interface](../../apis/appendix/deprecated_interface.md):全量清单,查"哪个接口被谁替代";本卡讲"怎么发现、怎么判替换类型、替换后验什么"。 | ||
| 100 | +- [interface_change_description](../../apis/appendix/interface_change_description.md):命名变更对照表(含"改名同时改了什么"的备注)。 | ||
| 101 | +- [asc_mmad_deprecated](../../apis/simd_api/c_api/deprecated_interface/asc_mmad_deprecated.md):单接口完整原型与产品支持矩阵,本卡 E 类结论出自它;[asc_mmad_mx_deprecated](../../apis/simd_api/c_api/deprecated_interface/asc_mmad_mx_deprecated.md) 同理。 | ||
| 102 | +- [asc_pack_deprecated_reference_contract](../../guides/regbase/asc_pack_deprecated_reference_contract.md) 与 [asc_create_iter_reg_deprecated_reference_contract](../../guides/regbase/asc_create_iter_reg_deprecated_reference_contract.md):废弃接口的固定 reference 调用约束;本卡只给"废弃→替代"的方向,不展开单接口契约。 | ||
| 103 | +- [begin_tiling_data_def_deprecated](./begin_tiling_data_def_deprecated.md):同类"废弃选型"问题但对象是 TilingData 注册宏族(高层 API 宏),不属于本卡的 C API 废弃清单。 | ||
| 104 | +- [ol_127_cann_api_surface_shrinks_across_versions_check_api](./ol_127_cann_api_surface_shrinks_across_versions_check_api.md):跨版本 API 面**收缩**(旧接口在新版本上不再提供);本卡处理的是接口存在但已废弃/改签名。 | ||
| 105 | +- [ascend_c_api_compatibility](../../guides/cross_gen_migration_guide/ascend_c_api_compatibility.md):Ascend C API 兼容性策略(功能兼容/性能兼容的口径、跨架构需重新编译);本卡是其中的"废弃与重命名"分支的操作流程。 | ||
| 106 | +- [cann_9_2_0](../../apis/appendix/release_notes/cann_9_2_0.md):版本增量(公共头文件拆分、`ASC_DEPRECATED` 等)。 | ||
| 107 | +- [cpp_standard_support_and_syntax_restrictions](./cpp_standard_support_and_syntax_restrictions.md):C++ 标准与语言级限制,与接口废弃是两个维度。 | ||
| @@ -980,3 +980,6 @@ | |||
| 980 | - [dav-m200 — a CPU-staged tensor's host `data_ptr()` passed to the kernel as a GM operand is read as GM SILENTLY: output all-NaN, kernel completes, zero error codes (scalar GM loads perform no pointer-provenance validation)](pb_189_dav_m200_a_cpu_staged_tensor_s_host_data_ptr_pas.md):kernel 全程跑完、输出稳定全 NaN、零错误码——只有 CPU 侧来的操作数坏了(GM 标量读 corruption 特征)。 | 980 | - [dav-m200 — a CPU-staged tensor's host `data_ptr()` passed to the kernel as a GM operand is read as GM SILENTLY: output all-NaN, kernel completes, zero error codes (scalar GM loads perform no pointer-provenance validation)](pb_189_dav_m200_a_cpu_staged_tensor_s_host_data_ptr_pas.md):kernel 全程跑完、输出稳定全 NaN、零错误码——只有 CPU 侧来的操作数坏了(GM 标量读 corruption 特征)。 |
| 981 | 981 | ||
| 982 | - [Generated AscendC SoC constructor versus initialized-runtime DSO loading](generated_ascendc_soc_constructor_initialized_npu_load.md):Distinguish CPU-only constructor abort from a same-byte DSO loaded after NPU initialization; preserve load, numerical and cause boundaries. | 982 | - [Generated AscendC SoC constructor versus initialized-runtime DSO loading](generated_ascendc_soc_constructor_initialized_npu_load.md):Distinguish CPU-only constructor abort from a same-byte DSO loaded after NPU initialization; preserve load, numerical and cause boundaries. |
| 983 | + | ||
| 984 | +- [Ascend C Device 侧 C++ 标准级别与语法限制判定](cpp_standard_support_and_syntax_restrictions.md):核对 Ascend C Host/Device 编译标准:Device 默认 C++17,可选 C++11/14/20;区分纯 SIMT 与 SIMD/SIMT 混合编程的运行时递归边界,并检查核函数 POD 入参、SIMT VF 地址空间与结构体限制。附编译选项、诊断步骤和静默栈地址错误的验证边界。 | ||
| 985 | +- [Ascend C API 废弃接口的发现、替换与重验流程](deprecated_interface_detection_and_replacement.md):迁移 Ascend C API 时结合废弃声明告警、接口级清单与基础 API 命名变更表定位调用点;按旧重载、产品范围和目标签名选择替代。同步复合接口替换需重新核对 asc_sync 的全流水语义,并分别验证编译、依赖顺序、数值和性能。 | ||
| @@ -1,5 +1,29 @@ | |||
| 1 | # 2026-10-28 | 1 | # 2026-10-28 |
| 2 | 2 | ||
| 3 | +## [01:56] knowledge | 修正 C++ 标准与混合编程示例条件 | ||
| 4 | + | ||
| 5 | +### Summary | ||
| 6 | + | ||
| 7 | +修正 compilation Runbook 中高版本语法扩展告警的适用条件和带 `__simt_callee__` 标记的 lambda 示例场景。 | ||
| 8 | + | ||
| 9 | +### Details | ||
| 10 | + | ||
| 11 | +- `cpp_standard_support_and_syntax_restrictions.md` 明确扩展告警发生于指定低于 C++17 标准的条件下;带 `__simt_callee__` 的示例归于 SIMD/SIMT 混合编程的 SIMT VF,不作为纯 SIMT 核函数局部 lambda 示例。 | ||
| 12 | +- 对照固定提交 `e680c34c09ba6919b3cebd2b7ec027f4ff6f0f22` 的 `cpp_standard_support/overview.md` 与 `cpp_language_feature/lambda_expressions.md` 核实上述条件和编程模式。 | ||
| 13 | + | ||
| 14 | +## [01:44] knowledge | 修正 Ascend C 编译与废弃接口 Runbook | ||
| 15 | + | ||
| 16 | +### Summary | ||
| 17 | + | ||
| 18 | +新增两张 Ascend C compilation Runbook,分别覆盖 Device C++ 标准/语法限制判定与 API 废弃接口发现、替换和重验;同步 compilation 直属索引。 | ||
| 19 | + | ||
| 20 | +### Details | ||
| 21 | + | ||
| 22 | +- `cpp_standard_support_and_syntax_restrictions.md` 依据 asc-devkit `e680c34c09ba6919b3cebd2b7ec027f4ff6f0f22` 的 `docs/zh/guide/technical_appendix/cpp_standard_support/overview.md` 与 `cpp_language_restrictions/general_restrictions.md`,将 Device 默认标准校正为 C++17,补充 bisheng/CMake 标准选项,区分纯 SIMT 运行时递归与 SIMD/SIMT 混合编程限制,并保留 POD 入参、SIMT VF 地址空间和结构体限制。 | ||
| 23 | +- `deprecated_interface_detection_and_replacement.md` 依据同一 asc-devkit 提交的 `docs/zh/api/appendix/deprecated_interface.md` 及配套 C API 文档,区分接口级废弃清单、基础 API 命名变更表和声明告警,限定同步替换的 `asc_sync()` 全流水语义,并要求按旧重载、产品范围、签名、数值和性能重新核验。 | ||
| 24 | +- 直属 `knowledge/ops/ascendc/runbooks/compilation/index.md` 已同步两张卡的中文摘要;本次不修改其他知识卡、治理规则或 API 镜像。 | ||
| 25 | +- 来源证据固定到上述 40 位提交;没有把未执行的编译、硬件运行或性能测试写成验证结果。 | ||
| 26 | + | ||
| 3 | ## [01:09] knowledge | 补齐 AscendC 术语、平台映射与混合编程边界 | 27 | ## [01:09] knowledge | 补齐 AscendC 术语、平台映射与混合编程边界 |
| 4 | 28 | ||
| 5 | ### Summary | 29 | ### Summary |