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 时:

  1. 框架不会报错

  2. 框架自动采用该转换的默认 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则进位。