已合并
#66: 新增 Device C++ 标准/语法限制与 Ascend C API 废弃接口发现、替换和重验两张 Runbook #160
#66: 新增 Device C++ 标准/语法限制与 Ascend C API 废弃接口发现、替换和重验两张 Runbook #160
已合并
bianque创建于 7 天前
共 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-281# 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### Summary29### Summary