CastMode#
产品支持情况#
产品 |
是否支持 |
|---|---|
Ascend 950PR/Ascend 950DT |
√ |
Atlas A3 训练系列产品/Atlas A3 推理系列产品 |
√ |
Atlas A2 训练系列产品/Atlas A2 推理系列产品 |
√ |
功能说明#
CastMode定义了数据类型转换时的舍入模式,用于控制浮点数转换时的精度处理方式,确保转换结果的准确性。
原型定义#
class CastMode(enum.Enum):
CAST_NONE = ... # 不指定舍入模式,由框架自动选择默认值
CAST_RINT = ... # 舍入到最近整数,平局时舍入到偶数(IEEE 754默认)
CAST_ROUND = ... # 舍入到最近整数,平局时远离零舍入
CAST_FLOOR = ... # 向下舍入,向负无穷方向舍入
CAST_CEIL = ... # 向上舍入,向正无穷方向舍入
CAST_TRUNC = ... # 截断舍入,向零方向舍入
CAST_ODD = ... # 舍入到奇数,Von Neumann舍入方式
舍入模式详细说明#
CastMode |
说明 |
A2A3支持 |
A5支持 |
|---|---|---|---|
CAST_RINT |
舍入到最近整数,平局时舍入到偶数(IEEE 754默认) |
全部支持 |
全部支持 |
CAST_ROUND |
舍入到最近整数,平局时远离零舍入 |
全部支持 |
全部支持 |
CAST_FLOOR |
向下舍入,向负无穷方向舍入 |
全部支持 |
全部支持 |
CAST_CEIL |
向上舍入,向正无穷方向舍入 |
全部支持 |
全部支持 |
CAST_TRUNC |
截断舍入,向零方向舍入 |
全部支持 |
全部支持 |
CAST_ODD |
舍入到奇数,Von Neumann舍入方式 |
FP32→FP16 |
FP32→FP16 |
注意:CAST_NONE 不是硬件支持的舍入模式,而是框架层面的概念,表示”不指定舍入模式,由框架自动选择默认值”。
使用说明#
默认 CastMode 规则#
当用户使用 CAST_NONE 或指定了硬件不支持的 CastMode 时,框架会自动采用以下默认 CastMode:
转换类型 |
默认 CastMode |
|---|---|
浮点数转整数(FP→INT) |
CAST_TRUNC(向零截断) |
其他转换场景 |
CAST_RINT(舍入到最近偶数) |
类型扩展转换#
类型扩展转换(如 FP16→FP32、INT8→FP16、INT16→INT32 等)本身就是无损转换,不需要舍入处理,此时用户传入的 CastMode 参数会被忽略。
不支持的 CastMode 处理#
当用户为某个转换指定了硬件不支持的 CastMode 时:
框架不会报错
框架自动采用该转换的默认 CastMode(遵循上述默认规则)
二进制舍入规则说明#
在了解精度转换规则之前,需要先了解浮点数的表示方式和二进制的舍入规则:
浮点数的表示方式#
DT_FP16:共16bit,包括1bit符号位(S),5bit指数位(E)和10bit尾数位(M)。
当E不全为0或不全为1时,表示的结果为:(-1)^S × 2^(E-15) × (1 + M)
当E全为0时,表示的结果为:(-1)^S × 2^(-14) × M
当E全为1时,若M全为0,表示的结果为±inf(取决于符号位);若M不全为0,表示的结果为nan。
DT_FP32:共32bit,包括1bit符号位(S),8bit指数位(E)和23bit尾数位(M)。
当E不全为0或不全为1时,表示的结果为:(-1)^S × 2^(E-127) × (1 + M)
当E全为0时,表示的结果为:(-1)^S × 2^(-126) × M
当E全为1时,若M全为0,表示的结果为±inf(取决于符号位);若M不全为0,表示的结果为nan。
DT_BF16:共16bit,包括1bit符号位(S),8bit指数位(E)和7bit尾数位(M)。
当E不全为0或不全为1时,表示的结果为:(-1)^S × 2^(E-127) × (1 + M)
当E全为0时,表示的结果为:(-1)^S × 2^(-126) × M
当E全为1时,若M全为0,表示的结果为±inf(取决于符号位);若M不全为0,表示的结果为nan。
各舍入模式的具体行为#
CAST_RINT:若待舍入部分的第一位为0,则不进位;若第一位为1且后续位不全为0,则进位;若第一位为1且后续位全为0,当M的最后一位为0则不进位,当M的最后一位为1则进位。
CAST_FLOOR:若S为0,则不进位;若S为1,当待舍入部分全为0则不进位,否则,进位。
CAST_CEIL:若S为1,则不进位;若S为0,当待舍入部分全为0则不进位;否则,进位。
CAST_ROUND:若待舍入部分的第一位为0,则不进位;否则,进位。
CAST_TRUNC:总是不进位。
CAST_ODD:若待舍入部分全为0,则不进位;若待舍入部分不全为0,当M的最后一位为1则不进位,当M的最后一位为0则进位。