Cast(float转half/int32_t)
产 品 支 持 情 况
| 产 品 | 是 否 支 持 |
|---|---|
Ascend 950PR/Ascend 950DT | √ |
Atlas A3 训 练 系 列 产 品/Atlas A3 推 理 系 列 产 品 | √ |
Atlas A2 训 练 系 列 产 品/Atlas A2 推 理 系 列 产 品 | √ |
Atlas 200I/500 A2 推 理 产 品 | x |
Atlas 推 理 系 列 产 品AI Core | √ |
Atlas 推 理 系 列 产 品Vector Core | x |
Atlas 训 练 系 列 产 品 | x |
Kirin X90 | √ |
Kirin 9030 | √ |
功 能 说 明
头 文 件 路 径 为:"basic_api/kernel_operator_scalar_intf.h"。
对 标 量 的 数 据 类 型 进 行 转 换。
在 使 用 该 接 口 之 前,用 户 需 要 先 了 解内 置 数 据 类 型和精 度 转 换。
函 数 原 型
C++
template <typename T, typename U, RoundMode roundMode>
__aicore__ inline U Cast(T valueIn)
参 数 说 明
表 1 模 板 参 数 说 明
| 参 数 名 | 描 述 |
|---|---|
| T | valueIn的 数 据 类 型。 |
| U | 转 换 后 的 数 据 类 型。 |
| roundMode | 精 度 转 换 处 理 模 式,类 型 是RoundMode。 RoundMode为 枚 举 类 型,用 以 控 制 精 度 转 换 处 理 模 式,参 考精 度 舍 入 模 式,可 取 值 为: • CAST_NONE:当 转 换 过 程 存 在 精 度 损 失 时,按CAST_RINT模 式 处 理;当 不 存 在 精 度 损 失 时,不 进 行 舍 入; |
表 2 参 数 说 明
| 参 数 名 称 | 输 入/输 出 | 描 述 |
|---|---|---|
| valueIn | 输 入 | 被 转 换 数 据 类 型 的 标 量。 |
数 据 类 型
支 持 的 数 据 类 型 如 下:
- valueIn支 持float。
- 返 回 值 支 持half、int32_t。
返 回 值 说 明
转 换 后 的U类 型 标 量 数 据。
约 束 说 明
支 持 的 数 据 类 型 组 合 及 对 应 支 持 的RoundMode如 下:
| valueIn | 返 回 值 | RoundMode |
|---|---|---|
| float | half | CAST_ODD |
| float | int32_t | CAST_ROUND |
| float | int32_t | CAST_CEIL |
| float | int32_t | CAST_FLOOR |
| float | int32_t | CAST_RINT |
调 用 示 例
C++
float valueIn = 3.14159f;
half halfOut = AscendC::Cast<float, half, AscendC::RoundMode::CAST_ODD>(valueIn); // 返 回3.142578
valueIn = 1.5f;
int32_t intRoundOut = AscendC::Cast<float, int32_t, AscendC::RoundMode::CAST_ROUND>(valueIn); // 使 用CAST_ROUND模 式,四 舍 五 入 返 回2
int32_t intCeilOut = AscendC::Cast<float, int32_t, AscendC::RoundMode::CAST_CEIL>(valueIn); // 使 用CAST_CEIL模 式,向 上 取 整 返 回2
int32_t intFloorOut = AscendC::Cast<float, int32_t, AscendC::RoundMode::CAST_FLOOR>(valueIn); // 使 用CAST_FLOOR模 式,向 下 取 整 返 回1
int32_t intRintOut = AscendC::Cast<float, int32_t, AscendC::RoundMode::CAST_RINT>(valueIn); // 使 用CAST_RINT模 式,1.5向 临 近 偶 数 舍 入 返 回2
valueIn = 2.5f;
intRoundOut = AscendC::Cast<float, int32_t, AscendC::RoundMode::CAST_ROUND>(valueIn); // 使 用CAST_ROUND模 式,四 舍 五 入 返 回3
intCeilOut = AscendC::Cast<float, int32_t, AscendC::RoundMode::CAST_CEIL>(valueIn); // 使 用CAST_CEIL模 式,向 上 取 整 返 回3
intFloorOut = AscendC::Cast<float, int32_t, AscendC::RoundMode::CAST_FLOOR>(valueIn); // 使 用CAST_FLOOR模 式,向 下 取 整 返 回2
intRintOut = AscendC::Cast<float, int32_t, AscendC::RoundMode::CAST_RINT>(valueIn); // 使 用CAST_RINT模 式,2.5向 临 近 偶 数 舍 入 返 回2