配置寄存器与隐式状态¶
Ascend 910B 指令既使用显式操作数,也使用当前 AI Core 执行上下文中的隐式状态。开发时最容易混淆的是:指令末尾的 Xs 配置字、命名 SPR、MASK/CMPMASK 并不是同一种寄存器接口。
本页只描述 dav-c220-vec 与 dav-c220-cube 工具链可见的开发接口。没有公开字段定义的寄存器只说明用途类别和访问边界,不给出猜测性的位域。
三类配置载体¶
| 类别 | 汇编形态 | 生命周期与用途 |
|---|---|---|
| X 寄存器中的打包配置字 | VADD ... X3, MASK、MMAD ... X3 |
X3 仍是普通 64 位 X 寄存器;使用方按自己的格式解释 repeat、stride、shape 等字段 |
| 命名 SPR | MOV X0, CTRL、MOV DEQSCALE, X1 |
保存在当前执行上下文中,后续指令可隐式消费,直到被再次写入或上下文结束 |
| 专用状态 | MASK[0]、MASK[1]、CMPMASK、VA<n> |
使用专用指令或专用操作数字段,不能一律套用通用 MOV |
例如:
这里 X3 同时被用来提供掩码半部和 VADD 配置值,但它本身不是“VADD 配置寄存器”。不同指令对 Xs 的解释不同,不应把某条指令的配置字无条件复用于另一条指令。
命名 SPR 的读写形式¶
通用形式只有寄存器到寄存器的传送:
配置 SPR 不接受 MOV NAME, #imm。需要常量时先装入 X 寄存器:
每个符号分别定义可读方向、可写方向和目标 feature。以下是 910B 两个目标下可直接使用的代表性接口:
| 目标 | SPR | 方向 | 可用形式 | 主要角色 |
|---|---|---|---|---|
dav-c220-vec |
STATUS |
只读 | MOV Xd, STATUS |
当前执行状态 |
dav-c220-vec |
CTRL |
读写 | MOV Xd, CTRL / MOV CTRL, Xn |
通用执行控制 |
dav-c220-vec |
CONDITION_FLAG |
读写 | MOV Xd, CONDITION_FLAG / MOV CONDITION_FLAG, Xn |
标量条件状态 |
dav-c220-vec |
ST_ATOMIC_CFG |
读写 | MOV Xd, ST_ATOMIC_CFG / MOV ST_ATOMIC_CFG, Xn |
Store/原子路径配置 |
dav-c220-vec |
DEQSCALE |
只写 | MOV DEQSCALE, Xn |
反量化比例状态 |
dav-c220-vec |
MOV_PAD_VAL |
只写 | MOV MOV_PAD_VAL, Xn |
搬运越界或填充值 |
dav-c220-cube |
FMATRIX |
只写 | MOV FMATRIX, Xn |
Cube 矩阵形状/布局参数 |
dav-c220-cube |
FMATRIX_B |
只写 | MOV FMATRIX_B, Xn |
Cube B 路矩阵参数 |
dav-c220-cube |
FPC |
读写 | MOV Xd, FPC / MOV FPC, Xn |
Cube 浮点/精度控制状态 |
dav-c220-cube |
PADDING |
只写 | MOV PADDING, Xn |
Cube 填充配置 |
dav-c220-cube |
AIPP_SPR_0–AIPP_SPR_24 |
只写接口 | 对应 setter 生成 MOV AIPP_SPR_n, Xn |
AIPP 参数块 |
“只写”表示当前 c220 汇编语法/代码生成只提供写方向,不表示硬件内部没有可观察状态。反向写成 MOV Xd, FMATRIX 时,名称会进入立即数/标签解析路径,而不是完成 SPR 读取。
可复现的编码样例¶
以下字节按目标文件中的小端顺序书写。X 寄存器编号是编码的一部分,替换寄存器后字节也会变化。
| 目标 | 汇编 | 小端字节 |
|---|---|---|
| Vector | MOV DEQSCALE, X0 |
00 09 18 02 |
| Vector | MOV ST_ATOMIC_CFG, X2 |
00 29 b4 02 |
| Vector | MOV X3, ST_ATOMIC_CFG |
80 a8 87 02 |
| Vector | MOV MOV_PAD_VAL, X4 |
00 49 8c 02 |
| Vector | MOV CONDITION_FLAG, X8 |
00 89 16 02 |
| Vector | MOV X9, CONDITION_FLAG |
80 b8 12 02 |
| Vector | MOV X12, CTRL |
80 38 18 02 |
| Vector | MOV CTRL, X13 |
00 d9 06 02 |
| Vector | MOV X14, STATUS |
80 28 1c 02 |
| Cube | MOV FMATRIX, X0 |
00 09 14 02 |
| Cube | MOV FMATRIX_B, X2 |
00 29 b8 02 |
| Cube | MOV FPC, X8 |
00 89 80 02 |
| Cube | MOV X9, FPC |
80 08 92 02 |
| Cube | MOV PADDING, X10 |
00 a9 1a 02 |
不能从 SPR 总表推导可用性
SPR 编码是后端名称空间,不是 910B 权限表。AIPP_SPR_25–AIPP_SPR_31、VL、AR 虽然有名称和编码,但当前 dav-c220 目标不启用相应接口。目标 feature、读写方向和语法必须分别确认。
可读取的环境与身份状态¶
下列 getter 在 dav-c220-vec 上会生成单条 MOV Xd, NAME。返回值按 64 位无符号标量承载;具体字段含义应由运行时 ABI 解释。
| SPR | C builtin | 用途 |
|---|---|---|
STATUS |
__builtin_cce_get_status() |
当前执行状态 |
ARCH_VER |
__builtin_cce_get_arch_ver() |
架构版本标识 |
COREID |
__builtin_cce_get_coreid() |
当前 AI Core 标识 |
THREAD_ID |
__builtin_cce_get_thread_id() |
当前线程标识 |
THREAD_DIM |
__builtin_cce_get_thread_dim() |
线程维度 |
SUBBLOCKID |
__builtin_cce_get_subblockid() |
当前子块标识 |
SUBBLOCKDIM |
__builtin_cce_get_subblockdim() |
子块维度 |
SYS_CNT |
__builtin_cce_get_sys_cnt() |
系统计数值 |
PARA_BASE |
__builtin_cce_get_para_base() |
参数区基址状态 |
DATA_MAIN_BASE |
__builtin_cce_get_data_main_base() |
主数据区基址状态 |
DATA_UB_BASE |
__builtin_cce_get_data_ub_base() |
UB 数据区基址状态 |
DATA_SIZE |
__builtin_cce_get_data_size() |
当前数据区大小状态 |
SMMU_TAG_VER |
__builtin_cce_get_smmu_tag_ver() |
地址转换标签版本 |
这些寄存器的写方向会被 c220 汇编器拒绝。它们用于查询当前执行环境,不是内核自行建立线程、地址空间或版本状态的接口。
MOV Xd, BLOCKDIM 可以由 c220 汇编器编码,但当前工具链的 __builtin_cce_get_blockdim() 没有对 dav-c220-vec/dav-c220-cube 开放。需要该值时,应先确认调用约定和部署环境,不要把“汇编器可编码”视为 C builtin 可用的保证。
功能分组¶
| 功能组 | 代表寄存器 | 编程含义 |
|---|---|---|
| 执行与条件 | STATUS、CTRL、CONDITION_FLAG、COND、LPCNT |
执行模式、条件和循环相关隐式状态 |
| 向量掩码 | MASK0/1、CMPMASK0/1、VMS4_SR、SMASK_INDEX |
lane 有效性、比较结果和稀疏掩码状态;优先使用专用指令 |
| Vector/MTE 数值参数 | DEQSCALE、MOV_PAD_VAL、LOW_PRE_TBL、LRELU_ALPHA、VPIPE、VSP |
量化、填充、激活或数据路径参数 |
| Cube 矩阵 | FMATRIX*、FPC、PADDING*、QUANT_PRE/POST、ACC_VAL、CUBE_CTRL_* |
矩阵形状、精度、填充、量化和累加控制 |
| 3D/ND 与搬运 | L1_3D_SIZE、L3D_RPT、FCOL2IMG、ND_PARA、RPN_* |
3D、ND、卷积展开和搬运形状参数 |
| AIPP | AIPP_SPR_0–AIPP_SPR_31 |
图像预处理参数槽;910B Cube setter 范围为 0–24 |
| 原子与 Fixpipe | ST_ATOMIC_CFG、FIXP_ADDR |
Store 原子行为和 Fixpipe 地址状态 |
| 启动环境 | PARA_BASE、DATA_*、COREID、THREAD_*、SUBBLOCK*、ARCH_VER |
runtime 建立、内核读取的执行环境 |
| 地址转换与映射 | SMMU_*、MEMMAP_*、SYS_VA_BASE |
runtime/固件管理的地址空间状态,不建议普通内核直接改写 |
| 诊断与安全 | AIC_ERROR*、SAFETY_CRC_*、ICACHE_PRL_ST |
错误、CRC 与取指相关状态,通常由系统软件管理 |
同一家族中的寄存器也不保证具有相同访问权限。例如 ST_ATOMIC_CFG 可读写,而 MOV_PAD_VAL 在 c220 Vector 语法中只提供写方向;ACC_VAL 与 CUBE_CTRL_* 也不能仅凭名称套用 MOV NAME, Xn。
bisheng builtin 与生成汇编¶
builtin 能把目标 feature 和寄存器方向纳入前端检查。下面的代码在 dav-c220-vec 上生成对应的单条 MOV:
unsigned long read_ctrl(void) {
return __builtin_cce_get_ctrl();
}
void write_ctrl(unsigned long value) {
__builtin_cce_set_ctrl(value);
}
unsigned long read_atomic_config(void) {
return __builtin_cce_get_st_atomic_cfg();
}
void write_atomic_config(unsigned long value) {
__builtin_cce_set_st_atomic_cfg(value);
}
常用的 c220 写接口包括:
| 目标 | builtin |
|---|---|
| Vector | __builtin_cce_set_ctrl、__builtin_cce_set_condition_flag、__builtin_cce_set_st_atomic_cfg、__builtin_cce_set_deqscale |
| Cube | __builtin_cce_set_fmatrix、__builtin_cce_set_fmatrix_b、__builtin_cce_set_padding、__builtin_cce_set_aipp_spr_0 … __builtin_cce_set_aipp_spr_24 |
后端还包含面向其他处理器版本的 builtin 名称。调用存在但目标 feature 不匹配时,前端会报告“不支持给定目标特性”;这不是通过声明函数原型可以绕过的普通外部函数错误。
内联汇编访问¶
需要与手写指令放在同一局部序列时,可使用 GNU extended asm 的 "l" 约束:
unsigned long read_ctrl_inline(void) {
unsigned long value;
__asm__ volatile("MOV %0, CTRL" : "=l"(value));
return value;
}
void write_ctrl_inline(unsigned long value) {
__asm__ volatile(
"MOV CTRL, %0"
:
: "l"(value)
: "memory");
}
"memory" 只阻止编译器把内存访问跨过该 asm 重排,不会替你生成流水线事件或屏障。若一个配置影响紧随其后的搬运、Vector 或 Cube 指令,最稳妥的做法是把“写配置 + 消费指令”放在同一 asm 块,或者使用 builtin 和 C 可见数据依赖保持顺序。
保存、恢复与作用域¶
命名配置寄存器应视为当前执行上下文的易变状态:
- 在首次消费前完成写入,不依赖内核入口的偶然初值。
- 不假设普通函数调用会替你保存
CTRL、FPC、掩码或量化状态。 - 临时修改可读写寄存器时,先读取旧值,完成操作后恢复;只写寄存器无法采用通用的保存/恢复模式。
- 不把某个 core/thread 读到的环境状态当作跨 core 共享配置。
- 修改影响内存或异步流水线的状态时,仍按消费指令要求建立事件或屏障;SPR 写入本身不替代数据依赖同步。
推荐工作流是:先用 builtin 生成一份 -S 汇编,确认目标 CPU、寄存器方向和完整配置序列;再用 -cc1as -show-encoding 固化必须手写的语法。完整名称及编码见 SPR 编码。