跳转至

配置寄存器与隐式状态

Ascend 910B 指令既使用显式操作数,也使用当前 AI Core 执行上下文中的隐式状态。开发时最容易混淆的是:指令末尾的 Xs 配置字、命名 SPR、MASK/CMPMASK 并不是同一种寄存器接口。

本页只描述 dav-c220-vecdav-c220-cube 工具链可见的开发接口。没有公开字段定义的寄存器只说明用途类别和访问边界,不给出猜测性的位域。

三类配置载体

类别 汇编形态 生命周期与用途
X 寄存器中的打包配置字 VADD ... X3, MASKMMAD ... X3 X3 仍是普通 64 位 X 寄存器;使用方按自己的格式解释 repeat、stride、shape 等字段
命名 SPR MOV X0, CTRLMOV DEQSCALE, X1 保存在当前执行上下文中,后续指令可隐式消费,直到被再次写入或上下文结束
专用状态 MASK[0]MASK[1]CMPMASKVA<n> 使用专用指令或专用操作数字段,不能一律套用通用 MOV

例如:

MOV X3, #0
MOVEMASK MASK[0], X3
MOVEMASK MASK[1], X3
VADD.s16 [X0], [X1], [X2], X3, MASK

这里 X3 同时被用来提供掩码半部和 VADD 配置值,但它本身不是“VADD 配置寄存器”。不同指令对 Xs 的解释不同,不应把某条指令的配置字无条件复用于另一条指令。

命名 SPR 的读写形式

通用形式只有寄存器到寄存器的传送:

MOV Xd, NAME       // 读取 NAME
MOV NAME, Xn       // 写入 NAME

配置 SPR 不接受 MOV NAME, #imm。需要常量时先装入 X 寄存器:

MOV X0, #1
MOV CTRL, X0

每个符号分别定义可读方向、可写方向和目标 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_0AIPP_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_25AIPP_SPR_31VLAR 虽然有名称和编码,但当前 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 可用的保证。

功能分组

功能组 代表寄存器 编程含义
执行与条件 STATUSCTRLCONDITION_FLAGCONDLPCNT 执行模式、条件和循环相关隐式状态
向量掩码 MASK0/1CMPMASK0/1VMS4_SRSMASK_INDEX lane 有效性、比较结果和稀疏掩码状态;优先使用专用指令
Vector/MTE 数值参数 DEQSCALEMOV_PAD_VALLOW_PRE_TBLLRELU_ALPHAVPIPEVSP 量化、填充、激活或数据路径参数
Cube 矩阵 FMATRIX*FPCPADDING*QUANT_PRE/POSTACC_VALCUBE_CTRL_* 矩阵形状、精度、填充、量化和累加控制
3D/ND 与搬运 L1_3D_SIZEL3D_RPTFCOL2IMGND_PARARPN_* 3D、ND、卷积展开和搬运形状参数
AIPP AIPP_SPR_0AIPP_SPR_31 图像预处理参数槽;910B Cube setter 范围为 0–24
原子与 Fixpipe ST_ATOMIC_CFGFIXP_ADDR Store 原子行为和 Fixpipe 地址状态
启动环境 PARA_BASEDATA_*COREIDTHREAD_*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_VALCUBE_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);
}
MOV X0, CTRL
MOV CTRL, X0
MOV X0, ST_ATOMIC_CFG
MOV ST_ATOMIC_CFG, X0

常用的 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 可见数据依赖保持顺序。

保存、恢复与作用域

命名配置寄存器应视为当前执行上下文的易变状态:

  1. 在首次消费前完成写入,不依赖内核入口的偶然初值。
  2. 不假设普通函数调用会替你保存 CTRLFPC、掩码或量化状态。
  3. 临时修改可读写寄存器时,先读取旧值,完成操作后恢复;只写寄存器无法采用通用的保存/恢复模式。
  4. 不把某个 core/thread 读到的环境状态当作跨 core 共享配置。
  5. 修改影响内存或异步流水线的状态时,仍按消费指令要求建立事件或屏障;SPR 写入本身不替代数据依赖同步。

推荐工作流是:先用 builtin 生成一份 -S 汇编,确认目标 CPU、寄存器方向和完整配置序列;再用 -cc1as -show-encoding 固化必须手写的语法。完整名称及编码见 SPR 编码