CANN/Ascend C: SetCtrlSpr控制寄存器设置

📅 2026/7/17 13:46:16 👁️ 阅读次数 📝 编程学习
CANN/Ascend C: SetCtrlSpr控制寄存器设置

SetCtrlSpr(ISASI)

【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C++标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit

产品支持情况

  • Ascend 950PR/Ascend 950DT:支持
  • Atlas A3 训练系列产品/Atlas A3 推理系列产品:支持
  • Atlas A2 训练系列产品/Atlas A2 推理系列产品:支持
  • Atlas 200I/500 A2 推理产品:不支持
  • Atlas 推理系列产品AI Core:不支持
  • Atlas 推理系列产品Vector Core:不支持
  • Atlas 训练系列产品:不支持

功能说明

头文件路径为:"basic_api/kernel_operator_common_intf.h"

对CTRL寄存器(控制寄存器)的特定比特位进行设置。通过模板参数startBit和endBit指定目标比特位范围,将运行参数value(超出比特位范围会出现编译报错)写入CTRL寄存器对应位置。

函数原型

template <int8_t startBit, int8_t endBit> __aicore__ static inline void SetCtrlSpr(int64_t value)

参数说明

表1模板参数说明

参数名描述
startBit起始比特位索引。
endBit终止比特位索引。

表2参数说明

参数名输入/输出描述
value输入起止比特位上新设置的值。

表3Ascend 950PR/Ascend 950DT常用CTRL寄存器比特位说明

CTRL寄存器比特位功能默认值配合使用的API
CTRL[8:6]用于控制数据从L0C Buffer/Unified Buffer/L1 Buffer搬运至Global Memory时原子操作的启用及数据类型选择。
• 3'b000:不开启原子操作;
• 3'b001:开启原子操作,数据类型为float;
• 3'b010:开启原子操作,数据类型为half;
• 3'b011:开启原子操作,数据类型为int16_t;
• 3'b100:开启原子操作,数据类型为int32_t;
• 3'b101:开启原子操作,数据类型为int8_t;
• 3'b110:开启原子操作,数据类型为bfloat16_t。
3'b000配合使用API:
• 数据搬运API。
CTRL[10:9]用于控制原子操作的类型,仅在CTRL[8:6]开启原子操作时生效。
• 2'b00:选择ADD操作;
• 2'b01:选择MAX操作;
• 2'b10:选择MIN操作。
2'b00不涉及
CTRL[45]用于控制左右矩阵数据做Mmad计算时的处理方式。
• 1'b0:按照原数据类型进行处理;
• 1'b1:左右矩阵数据均为fp8_e4m3fn_t时,数据视为hifloat8_t进行矩阵乘法计算。其他场景按照原数据类型进行处理。
1'b0不涉及
CTRL[48]用于控制浮点数计算和浮点数精度转换时的饱和模式,仅在CTRL[60]开启时生效。
• 1'b0:饱和模式,inf输出会被饱和为±MAX,NaN输出会被饱和为0;
• 1'b1:非饱和模式,inf/NaN保持原输出。

该控制位仅支持如下数据类型:
•浮点数计算时支持half数据类型;
•浮点数精度转换时支持如下数据类型:hifloat8_t、fp8_e8m0_t、fp8_e5m2_t、fp8_e4m3fn_t、half、bfloat16_t。
1'b0配合使用的API:
• 矢量计算API;
• 原子操作API;
• 精度转换指令。

使用约束:
• 需要满足数据类型限制。
• 执行原子操作过程中,如果需要重新配置该控制位,需要调用DataCacheCleanAndInvalid先清除当前Cache Line状态并将当前数据写出,防止饱和模式变更影响当前数据。具体调用示例可参考原子操作中,half类型配置全局非饱和模式示例。。
CTRL[50]用于控制浮点数精度转换时的NaN饱和模式,在CTRL[48]设置为饱和模式时生效。
• 1'b0:NaN输出会被转换为0.0;
• 1'b1:NaN输出会保持NaN。

该控制位仅支持如下数据类型:
fp8_e8m0_t、fp8_e5m2_t、fp8_e4m3fn_t。
1'b0精度转换指令(需要满足数据类型限制)。
CTRL[53]用于控制整数计算指令的饱和模式。
• 1'b0:截断模式,溢出值按目标数据类型位数截断,保留低位,舍弃高位;
• 1'b1:饱和模式,溢出值饱和到±MAX。
1'b0矢量计算API(输入输出数据类型为整数)。
CTRL[59]用于控制浮点数转整数或整数转整数时的精度转换饱和模式,仅在CTRL[60]开启时生效。
• 1'b0:饱和模式:溢出值饱和到±MAX;
• 1'b1:截断模式:溢出值按目标数据类型位数截断,保留低位,舍弃高位。
1'b0精度转换指令。
CTRL[60]用于控制饱和模式的全局生效方式。
• 1'b0:单指令设置饱和;
• 1'b1:全局设置饱和。
1'b1该控制位可与Reg矢量计算API Cast配合使用,或与CTRL[48]、CTRL[59]配合使用,具体配置信息参考Ascend 950PR/Ascend 950DT饱和模式全局或单指令生效配置表。

表4Atlas A3 训练系列产品/Atlas A3 推理系列产品常用CTRL寄存器比特位说明

CTRL寄存器比特位功能默认值配合使用的API
CTRL[48]用于控制浮点数计算和浮点数精度转换时的饱和模式。
• 1'b0:饱和模式,inf输出会被饱和为±MAX, NaN输出会被饱和为0;
• 1'b1:非饱和模式,inf/NaN保持原输出。

该控制位仅支持如下数据类型:
•浮点数计算时支持half、bfloat16_t数据类型;
•浮点数精度转换时支持如下数据类型:half、bfloat16_t。
1'b0不涉及

注:针对Atlas A3 训练系列产品/Atlas A3 推理系列产品,推荐使用SetSaturationFlag.md)和GetSaturationFlag.md)来设置和获取CTRL[48]以控制饱和模式。

表5Atlas A2 训练系列产品/Atlas A2 推理系列产品常用CTRL寄存器比特位说明

CTRL寄存器比特位功能默认值配合使用的API
CTRL[48]用于控制浮点数计算和浮点数精度转换时的饱和模式。
• 1'b0:饱和模式,inf输出会被饱和为±MAX, NaN输出会被饱和为0;
• 1'b1:非饱和模式,inf/NaN保持原输出。

该控制位仅支持如下数据类型:
•浮点数计算时支持half、bfloat16_t数据类型;
•浮点数精度转换时支持如下数据类型:half、bfloat16_t。
1'b0不涉及

注:针对Atlas A2 训练系列产品/Atlas A2 推理系列产品,推荐使用SetSaturationFlag.md)和GetSaturationFlag.md)来设置和获取CTRL[48]以控制饱和模式。

表6Ascend 950PR/Ascend 950DT饱和模式全局或单指令生效配置表

全局开启位控制位功能描述
CTRL[60] = 1'b0Reg矢量计算Cast API的trait模板参数中satMode设置为SatMode::NO_SAT。单指令非饱和模式。
CTRL[60] = 1'b0Reg矢量计算Cast API的trait模板参数中satMode设置为SatMode::SAT。单指令饱和模式。
CTRL[60] = 1'b1CTRL[48] = 1'b1全局非饱和模式(浮点数计算和浮点数精度转换)。
CTRL[60] = 1'b1CTRL[48] = 1'b0全局饱和模式(浮点数计算和浮点数精度转换)。
CTRL[60] = 1'b1CTRL[59] = 1'b1全局非饱和模式(浮点数转整数或整数转整数时的精度转换)。
CTRL[60] = 1'b1CTRL[59] = 1'b0全局饱和模式(浮点数转整数或整数转整数时的精度转换)。

数据类型

本接口为寄存器访问接口,不涉及张量数据类型操作。参数value类型固定为int64_t。

返回值说明

约束说明

  • Ascend 950PR/Ascend 950DT仅支持CTRL[8:6]、CTRL[10:9]、CTRL[45]、CTRL[48]、CTRL[50]、CTRL[53]、CTRL[59]、CTRL[60]比特位。
  • Atlas A3 训练系列产品/Atlas A3 推理系列产品仅支持CTRL[48]比特位。
  • Atlas A2 训练系列产品/Atlas A2 推理系列产品仅支持CTRL[48]比特位。
  • Ascend 950PR/Ascend 950DT对于CTRL[8:6]和CTRL[10:9]的设置,已封装原子操作API,建议通过这些原子操作API进行配置。
    • SetAtomicType
    • DisableDmaAtomic
    • SetAtomicAdd
    • SetAtomicMax.md)
    • SetAtomicMin.md)

调用示例

  • 如下示例中开启非饱和模式,数据类型为half。

    AscendC::SetCtrlSpr<48, 48>(1);
  • 原子操作中,half类型配置全局非饱和模式示例。

    AscendC::SetCtrlSpr<6, 8>(2); AscendC::SetAtomicAdd<half>(); AscendC::DataCacheCleanAndInvalid<half, AscendC::CacheLine::ENTIRE_DATA_CACHE, AscendC::DcciDst::CACHELINE_ATOMIC>(dstTensor); AscendC::SetCtrlSpr<48, 48>(1); ...

更多示例请参考CtrlSpr样例。

【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C++标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考