AscendC RoundMode 语义(CAST_ROUND vs CAST_RINT/RNE)
·
在 AscendC 的 Cast / ScalarCast 等精度转换 API 中,CAST_ROUND 与 CAST_RINT 的核心差异在于对「恰好处于中间值」(tie)的处理方式不同。CAST_RINT 即 IEEE 754 标准中的 RNE(Round to Nearest, ties to Even,四舍六入五成双)。
语义对比
| RoundMode | 中文名 | 规则 | 等价标准 |
|---|---|---|---|
| CAST_RINT | 四舍六入五成双 | 向最近的偶数舍入;若待舍入位首位为 1 且后续全为 0(恰好在中间),则看保留位的末位:末位为 0 不进位,末位为 1 进位 | RNE (Round to Nearest Even) |
| CAST_ROUND | 四舍五入 | 若待舍入位首位为 0,则不进位;否则(首位为 1)进位 | 远离零的 Round Half Up |
位级判定逻辑(官方定义)
-
CAST_RINT
- 待舍入部分首位为 0 → 不进位
- 待舍入部分首位为 1 且后续不全为 0 → 进位
- 待舍入部分首位为 1 且后续全为 0(tie)→ 保留位末位为 0 不进位,末位为 1 进位
-
CAST_ROUND
- 待舍入部分首位为 0 → 不进位
- 待舍入部分首位为 1 → 进位(无论后续位是什么)
数值示例
以 float → int32_t 转换为例,输入 [1.4, 1.5, 1.6, 2.4, 2.5, 2.6] :
| 输入 | CAST_RINT (RNE) | CAST_ROUND |
|---|---|---|
| 1.4 | 1 | 1 |
| 1.5 | 2(2 是偶数) | 2 |
| 1.6 | 2 | 2 |
| 2.4 | 2 | 2 |
| 2.5 | 2(2 是偶数,tie 向偶) | 3 |
| 2.6 | 3 | 3 |
枚举定义
enum class RoundMode {
CAST_NONE = 0, // 有精度损失时同 CAST_RINT,无损失时不舍入
CAST_RINT, // RNE,四舍六入五成双
CAST_FLOOR, // 向负无穷舍入
CAST_CEIL, // 向正无穷舍入
CAST_ROUND, // 四舍五入
CAST_TRUNC, // 向零舍入
CAST_ODD, // 向最近的奇数舍入(Von Neumann rounding)
CAST_HYBRID // 随机舍入,特指 hifloat8_t 输出
};
使用建议
- 追求与 GPU / 主流深度学习框架对齐:优先用
CAST_RINT(RNE),这是 IEEE 754 默认舍入模式,也是 NVIDIA GPU 的默认行为。 - 需要严格「四舍五入」语义(如某些量化场景要求):使用
CAST_ROUND。 - 注意硬件限制:不同昇腾芯片对同一类型组合支持的
RoundMode不同。例如 Atlas 训练系列产品对float → half仅支持CAST_ODD / CAST_NONE,而 Atlas A2 / A3 / 950 系列支持更全 。写算子前务必查目标硬件的 Cast 类型支持表。
鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。
更多推荐



所有评论(0)