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寄存器比特位功能默认值配合使用的APICTRL[8:6]用于控制数据从L0C Buffer/Unified Buffer/L1 Buffer搬运至Global Memory时原子操作的启用及数据类型选择。• 3b000不开启原子操作• 3b001开启原子操作数据类型为float• 3b010开启原子操作数据类型为half• 3b011开启原子操作数据类型为int16_t• 3b100开启原子操作数据类型为int32_t• 3b101开启原子操作数据类型为int8_t• 3b110开启原子操作数据类型为bfloat16_t。3b000配合使用API• 数据搬运API。CTRL[10:9]用于控制原子操作的类型仅在CTRL[8:6]开启原子操作时生效。• 2b00选择ADD操作• 2b01选择MAX操作• 2b10选择MIN操作。2b00不涉及CTRL[45]用于控制左右矩阵数据做Mmad计算时的处理方式。• 1b0按照原数据类型进行处理• 1b1左右矩阵数据均为fp8_e4m3fn_t时数据视为hifloat8_t进行矩阵乘法计算。其他场景按照原数据类型进行处理。1b0不涉及CTRL[48]用于控制浮点数计算和浮点数精度转换时的饱和模式仅在CTRL[60]开启时生效。• 1b0饱和模式inf输出会被饱和为±MAXNaN输出会被饱和为0• 1b1非饱和模式inf/NaN保持原输出。该控制位仅支持如下数据类型•浮点数计算时支持half数据类型•浮点数精度转换时支持如下数据类型hifloat8_t、fp8_e8m0_t、fp8_e5m2_t、fp8_e4m3fn_t、half、bfloat16_t。1b0配合使用的API• 矢量计算API• 原子操作API• 精度转换指令。使用约束• 需要满足数据类型限制。• 执行原子操作过程中如果需要重新配置该控制位需要调用DataCacheCleanAndInvalid先清除当前Cache Line状态并将当前数据写出防止饱和模式变更影响当前数据。具体调用示例可参考原子操作中half类型配置全局非饱和模式示例。。CTRL[50]用于控制浮点数精度转换时的NaN饱和模式在CTRL[48]设置为饱和模式时生效。• 1b0NaN输出会被转换为0.0• 1b1NaN输出会保持NaN。该控制位仅支持如下数据类型fp8_e8m0_t、fp8_e5m2_t、fp8_e4m3fn_t。1b0精度转换指令需要满足数据类型限制。CTRL[53]用于控制整数计算指令的饱和模式。• 1b0截断模式溢出值按目标数据类型位数截断保留低位舍弃高位• 1b1饱和模式溢出值饱和到±MAX。1b0矢量计算API输入输出数据类型为整数。CTRL[59]用于控制浮点数转整数或整数转整数时的精度转换饱和模式仅在CTRL[60]开启时生效。• 1b0饱和模式溢出值饱和到±MAX• 1b1截断模式溢出值按目标数据类型位数截断保留低位舍弃高位。1b0精度转换指令。CTRL[60]用于控制饱和模式的全局生效方式。• 1b0单指令设置饱和• 1b1全局设置饱和。1b1该控制位可与Reg矢量计算API Cast配合使用或与CTRL[48]、CTRL[59]配合使用具体配置信息参考Ascend 950PR/Ascend 950DT饱和模式全局或单指令生效配置表。表4Atlas A3 训练系列产品/Atlas A3 推理系列产品常用CTRL寄存器比特位说明CTRL寄存器比特位功能默认值配合使用的APICTRL[48]用于控制浮点数计算和浮点数精度转换时的饱和模式。• 1b0饱和模式inf输出会被饱和为±MAX NaN输出会被饱和为0• 1b1非饱和模式inf/NaN保持原输出。该控制位仅支持如下数据类型•浮点数计算时支持half、bfloat16_t数据类型•浮点数精度转换时支持如下数据类型half、bfloat16_t。1b0不涉及注针对Atlas A3 训练系列产品/Atlas A3 推理系列产品推荐使用SetSaturationFlag.md)和GetSaturationFlag.md)来设置和获取CTRL[48]以控制饱和模式。表5Atlas A2 训练系列产品/Atlas A2 推理系列产品常用CTRL寄存器比特位说明CTRL寄存器比特位功能默认值配合使用的APICTRL[48]用于控制浮点数计算和浮点数精度转换时的饱和模式。• 1b0饱和模式inf输出会被饱和为±MAX NaN输出会被饱和为0• 1b1非饱和模式inf/NaN保持原输出。该控制位仅支持如下数据类型•浮点数计算时支持half、bfloat16_t数据类型•浮点数精度转换时支持如下数据类型half、bfloat16_t。1b0不涉及注针对Atlas A2 训练系列产品/Atlas A2 推理系列产品推荐使用SetSaturationFlag.md)和GetSaturationFlag.md)来设置和获取CTRL[48]以控制饱和模式。表6Ascend 950PR/Ascend 950DT饱和模式全局或单指令生效配置表全局开启位控制位功能描述CTRL[60] 1b0Reg矢量计算Cast API的trait模板参数中satMode设置为SatMode::NO_SAT。单指令非饱和模式。CTRL[60] 1b0Reg矢量计算Cast API的trait模板参数中satMode设置为SatMode::SAT。单指令饱和模式。CTRL[60] 1b1CTRL[48] 1b1全局非饱和模式浮点数计算和浮点数精度转换。CTRL[60] 1b1CTRL[48] 1b0全局饱和模式浮点数计算和浮点数精度转换。CTRL[60] 1b1CTRL[59] 1b1全局非饱和模式浮点数转整数或整数转整数时的精度转换。CTRL[60] 1b1CTRL[59] 1b0全局饱和模式浮点数转整数或整数转整数时的精度转换。数据类型本接口为寄存器访问接口不涉及张量数据类型操作。参数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进行配置。SetAtomicTypeDisableDmaAtomicSetAtomicAddSetAtomicMax.md)SetAtomicMin.md)调用示例如下示例中开启非饱和模式数据类型为half。AscendC::SetCtrlSpr48, 48(1);原子操作中half类型配置全局非饱和模式示例。AscendC::SetCtrlSpr6, 8(2); AscendC::SetAtomicAddhalf(); AscendC::DataCacheCleanAndInvalidhalf, AscendC::CacheLine::ENTIRE_DATA_CACHE, AscendC::DcciDst::CACHELINE_ATOMIC(dstTensor); AscendC::SetCtrlSpr48, 48(1); ...更多示例请参考CtrlSpr样例。【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考