Cast

产品支持情况

产品

是否支持

Ascend 950PR/Ascend 950DT

√

Atlas A3 训练系列产品 / Atlas A3 推理系列产品

√

Atlas A2 训练系列产品 / Atlas A2 推理系列产品

√

Atlas 200I/500 A2 推理产品

√

Atlas 推理系列产品 AI Core

√

Atlas 推理系列产品 Vector Core

x

Atlas 训练系列产品

√

功能说明

根据源操作数和目的操作数Tensor的数据类型进行精度转换。

在了解精度转换规则之前,需要先了解浮点数的表示方式和二进制的舍入规则:

精度转换规则如下表所示(为方便描述下文描述中的src代表源操作数,dst代表目的操作数):

表1 精度转换规则

src类型

dst类型

精度转换规则介绍

float

float

将src按照roundMode(精度转换处理模式,参见参数说明中的roundMode参数)取整,仍以float格式存入dst中。

示例:输入0.5,

CAST_RINT模式输出0.0,CAST_FLOOR模式输出0.0,CAST_CEIL模式输出1.0,CAST_ROUND模式输出1.0,CAST_TRUNC模式输出0.0。

half

将src按照roundMode取到half所能表示的数,以half格式(溢出默认按照饱和处理)存入dst中。

示例:输入0.5 + 2-12,写成float的表示形式:2-1 * (1 + 2-11),因此E = -1 + 127 = 126,M = 2-11。

half的指数位可以表示出2-1,E = -1 + 15 = 14,但half只有10 bit尾数位,因此灰色部分要进行舍入。

CAST_RINT模式舍入得尾数0000000000,E = 14,M = 0,最终表示的结果为0.5;

CAST_FLOOR模式舍入得尾数0000000000,E = 14,M = 0,最终表示的结果为0.5;

CAST_CEIL模式舍入得尾数0000000001,E = 14,M = 2-10,最终表示的结果为0.5 + 2-11;

CAST_ROUND模式舍入得尾数0000000001,E = 14,M = 2-10,最终表示的结果为0.5 + 2-11;

CAST_TRUNC模式舍入得尾数0000000000,E = 14,M = 0,最终表示的结果为0.5;

CAST_ODD模式舍入得尾数0000000001,E = 14,M = 2-10,最终表示的结果为0.5 + 2-11 。

int64_t

将src按照roundMode取整,以int64_t格式(溢出默认按照饱和处理)存入dst中。

示例:输入222 + 0.5,

CAST_RINT模式输出222,CAST_FLOOR模式输出222,CAST_CEIL模式输出222 + 1,CAST_ROUND模式输出222 + 1,CAST_TRUNC模式输出222。

int32_t

将src按照roundMode取整,以int32_t格式(溢出默认按照饱和处理)存入dst中。

示例:输入222 + 0.5,

CAST_RINT模式输出222,CAST_FLOOR模式输出222 ,CAST_CEIL模式输出222 + 1,CAST_ROUND模式输出222 + 1,CAST_TRUNC模式输出222。

int16_t

将src按照roundMode取整,以int16_t格式(溢出默认按照饱和处理)存入dst中。

示例:输入222 + 0.5,

CAST_RINT模式输出215 - 1(溢出处理),CAST_FLOOR模式输出215 - 1(溢出处理),CAST_CEIL模式输出215 - 1(溢出处理),CAST_ROUND模式输出215 - 1(溢出处理),CAST_TRUNC模式输出215 - 1(溢出处理)。

bfloat16_t

将src按照roundMode取到bfloat16_t所能表示的数,以bfloat16_t格式(溢出默认按照饱和处理)存入dst中。

示例:输入0.5+ 2-9 + 2-11 ,写成float的表示形式:2-1 * (1 + 2-8 + 2-10),因此E = -1 + 127 = 126,M = 2-8 + 2-10 。

bfloat16_t的指数位位数和float的相同,有E = 126,但bfloat16_t只有7bit尾数位,因此灰色部分要进行舍入。

CAST_RINT模式舍入得尾数0000001,E = 126,M = 2-7,最终表示的结果为0.5 + 2-8;

CAST_FLOOR模式舍入得尾数0000000,E = 126,M = 0,最终表示的结果为0.5;

CAST_CEIL模式舍入得尾数0000001,E = 126,M = 2-7,最终表示的结果为0.5 + 2-8;

CAST_ROUND模式舍入得尾数0000001,E = 126,M = 2-7,最终表示的结果为0.5 + 2-8;

CAST_TRUNC模式舍入得尾数0000000,E = 126,M = 0,最终表示的结果为0.5。

float

hifloat8_t

将src按照roundMode取整,以hifloat8_t格式(溢出默认按照饱和处理)存入dst中。

示例:输入1.75,CAST_ROUND模式输出2;CAST_HYBRID参考表9输出。

fp8_e4m3fn_t

将src按照roundMode取整,以fp8_e4m3fn_t格式(溢出默认按照饱和处理)存入dst中。

示例:输入2.5,CAST_RINT模式输出2。

fp8_e5m2_t

将src按照roundMode取整,以fp8_e5m2_t格式(溢出默认按照饱和处理)存入dst中。

示例:输入2.5,CAST_RINT模式输出2。

half

float

将src以float格式存入dst中,不存在精度转换问题,无舍入模式。

示例:输入1.5 - 2-10,输出1.5 - 2-10。

int32_t

将src按照roundMode取整,以int32_t格式存入dst中。

示例:输入-1.5,

CAST_RINT模式输出-2,CAST_FLOOR模式输出-2,CAST_CEIL模式输出-1,CAST_ROUND模式输出-2,CAST_TRUNC模式输出-1。

int16_t

将src按照roundMode取整,以int16_t格式(溢出默认按照饱和处理)存入dst中。

示例:输入27 - 0.5,

CAST_RINT模式输出27,CAST_FLOOR模式输出27 - 1,CAST_CEIL模式输出27,CAST_ROUND模式输出27,CAST_TRUNC模式输出27 - 1。

int8_t

将src按照roundMode取整,以int8_t格式(溢出默认按照饱和处理)存入dst中。

示例:输入27 - 0.5,

CAST_RINT模式输出27 - 1(溢出处理),CAST_FLOOR模式输出27 - 1,CAST_CEIL模式输出27 - 1(溢出处理),CAST_ROUND模式输出27 - 1(溢出处理),CAST_TRUNC模式输出27 - 1。

uint8_t

将src按照roundMode取整,以uint8_t格式(溢出默认按照饱和处理)存入dst中。

负数输入会被视为异常。

示例:输入1.75,

CAST_RINT模式输出2,CAST_FLOOR模式输出1,CAST_CEIL模式输出2,CAST_ROUND模式输出2,CAST_TRUNC模式输出1。

int4b_t

将src按照roundMode取整,以int4b_t格式(溢出默认按照饱和处理)存入dst中。

示例:输入1.5,

CAST_RINT模式输出2,CAST_FLOOR模式输出1,CAST_CEIL模式输出2,CAST_ROUND模式输出2,CAST_TRUNC模式输出1。

half

bfloat16_t

将src按照roundMode取整,以bfloat16_t格式存入dst中。

示例:输入1.75,

CAST_RINT模式输出2,CAST_FLOOR模式输出1,CAST_CEIL模式输出2,CAST_ROUND模式输出2,CAST_TRUNC模式输出1。

half

hifloat8_t

将src按照roundMode取整,以hifloat8_t格式(溢出默认按照饱和处理)存入dst中。

示例:输入1.75,

CAST_ROUND模式输出2,CAST_HYBRID模式参考表9输出。

bfloat16_t

float

将src以float格式存入dst中,不存在精度转换问题,无舍入模式。

示例:输入1.5 - 2-6,输出1.5 - 2-6。

int32_t

将src按照roundMode取整,以int32_t格式(溢出默认按照饱和处理)存入dst中。

示例:输入26 + 0.5

CAST_RINT模式输出26,CAST_FLOOR模式输出26 ,CAST_CEIL模式输出26 + 1,CAST_ROUND模式输出26 + 1,CAST_TRUNC模式输出26。

bfloat16_t

half

将src按照roundMode取整,以half格式(溢出默认按照饱和处理)存入dst中。

示例:输入2.90573e-06

CAST_RINT模式输出2.9e-06,CAST_FLOOR模式输出2.861e-06 ,CAST_CEIL模式输出2.9e-06,CAST_ROUND模式输出2.9e-06,CAST_TRUNC模式输出2.861e-06。

fp4x2_e2m1_t

将src按照roundMode取整,以fp4x2_e2m1_t格式(溢出默认按照饱和处理)存入dst中。

示例:输入2.5

CAST_RINT模式输出2,CAST_FLOOR模式输出2 ,CAST_CEIL模式输出3,CAST_ROUND模式输出3,CAST_TRUNC模式输出2。

fp4x2_e1m2_t

将src按照roundMode取整,以fp4x2_e1m2_t格式(溢出默认按照饱和处理)存入dst中。

示例:输入2.5

CAST_RINT模式输出2,CAST_FLOOR模式输出2 ,CAST_CEIL模式输出3,CAST_ROUND模式输出3,CAST_TRUNC模式输出2。

int4b_t

half

将src以half格式存入dst中,不存在精度转换问题,无舍入模式。

示例:输入1,输出1.0。

int16_t

将src以int16_t格式存入dst中,不存在精度转换问题,无舍入模式。

示例:输入1,输出1。

bfloat16_t

将src以bfloat16_t格式存入dst中,不存在精度转换问题,无舍入模式。

示例:输入1,输出1.0。

uint8_t

half

将src以half格式存入dst中,不存在精度转换问题,无舍入模式。

示例:输入1,输出1.0。

uint8_t

uint16_t

将src以uint16_t格式存入dst中,不存在精度转换问题,无舍入模式。

示例:输入28 - 1,输出28 - 1。

uint32_t

将src以uint32_t格式存入dst中,不存在精度转换问题,无舍入模式。

示例:输入28 - 1,输出28 - 1。

int8_t

half

将src以half格式存入dst中,不存在精度转换问题,无舍入模式。

示例:输入-1,输出-1.0。

int8_t

int16_t

将src以uint16_t格式存入dst中,不存在精度转换问题,无舍入模式。

示例:输入27 - 1,输出27 - 1。

int32_t

将src以uint32_t格式存入dst中,不存在精度转换问题,无舍入模式。

示例:输入27 - 1,输出27 - 1。

uint16_t

uint8_t

将src以uint8_t格式(溢出默认按照饱和处理)存入dst中,不存在精度转换问题,无舍入模式。

示例:输入216 - 1,输出28 - 1。

uint32_t

将src以uint32_t格式存入dst中,不存在精度转换问题,无舍入模式。

示例:输入216 - 1,输出216 - 1。

int16_t

half

将src按照roundMode取到half所能表示的数,以half格式存入dst中。

示例:输入212 + 2,写成half的表示形式:212 * (1 + 2-11),要求E = 12 + 15 = 27,M = 2-11:

由于half只有10bit尾数位,因此灰色部分要进行舍入。

CAST_RINT模式舍入得尾数0000000000,E = 27,M = 0,最终表示的结果为212;

CAST_FLOOR模式舍入得尾数0000000000,E = 27,M = 0,最终表示的结果为212;

CAST_CEIL模式舍入得尾数0000000001,E = 27,M = 2-10,最终表示的结果为212 + 4;

CAST_ROUND模式舍入得尾数0000000001,E = 27,M = 2-10,最终表示的结果为212 + 4;

CAST_TRUNC模式舍入得尾数0000000000,E = 27,M = 0,最终表示的结果为212。

float

将src以float格式存入dst中,不存在精度转换问题,无舍入模式。

示例:输入215 - 1,输出215 - 1。

int16_t

uint8_t

将src以uint8_t格式(溢出默认按照饱和处理)存入dst中,不存在精度转换问题,无舍入模式。

负数输入会被视为异常。

示例:输入215 - 1,输出28 - 1。

uint32_t

将src以uint32_t格式存入dst中,不存在精度转换问题,无舍入模式。

负数输入会默认转换成0。

示例:输入215 - 1,输出215 - 1。

int32_t

将src以int32_t格式存入dst中,不存在精度转换问题,无舍入模式。

示例:输入215 - 1,输出215 - 1。

int4b_t

将src以int4b_t格式(溢出默认按照饱和处理)存入dst中,不存在精度转换问题,无舍入模式。

示例:输入232 - 1,输出23 - 1。

uint32_t

uint8_t

将src以uint8_t格式(溢出默认按照饱和处理)存入dst中,不存在精度转换问题,无舍入模式。

示例:输入232 - 1,输出28 - 1。

uint16_t

将src以uint16_t格式(溢出默认按照饱和处理)存入dst中,不存在精度转换问题,无舍入模式。

示例:输入232 - 1,输出216 - 1。

int16_t

将src以int16_t格式(溢出默认按照饱和处理)存入dst中,不存在精度转换问题,无舍入模式。

示例:输入232 - 1,输出215 - 1。

int32_t

float

将src按照roundMode取到float所能表示的数,以float格式存入dst中。

示例:输入225 + 3,写成float的表示形式:225 * (1 + 2-24 + 2-25),要求E = 25 + 127 = 152, M = 2-24 + 2-25。

由于float只有23bit尾数位,因此灰色部分要进行舍入。

CAST_RINT模式舍入得尾数00000000000000000000001,E = 152,M = 2-23,最终表示的结果为225 + 4;

CAST_FLOOR模式舍入得尾数00000000000000000000000,E = 152,M = 0,最终表示的结果为225;

CAST_CEIL模式舍入得尾数00000000000000000000001,E = 152,M = 2-23,最终表示的结果为225 + 4;

CAST_ROUND模式舍入得尾数00000000000000000000001,E = 152,M = 2-23,最终表示的结果为225 + 4;

CAST_TRUNC模式舍入得尾数00000000000000000000000,E = 152,M = 0,最终表示的结果为225 。

int64_t

将src以int64_t格式存入dst中,不存在精度转换问题,无舍入模式。

示例:输入231 - 1,输出231 - 1。

int16_t

将src以int16_t格式(溢出默认按照饱和处理)存入dst中,不存在精度转换问题,无舍入模式。

示例:输入231 - 1,输出215 - 1。

half

与SetDeqScale(half scale)接口配合使用,输出src / 217 * scale * 217。

int32_t

uint8_t

将src以uint8_t格式(溢出默认按照饱和处理)存入dst中,不存在精度转换问题,无舍入模式。

负数输入会被视为异常。

示例:输入231 - 1,输出28 - 1。

uint16_t

将src以uint16_t格式(溢出默认按照饱和处理)存入dst中,不存在精度转换问题,无舍入模式。

负数输入会被视为异常。

示例:输入231 - 1,输出216 - 1。

int64_t

int32_t

将src以int32_t格式(溢出默认按照饱和处理)存入dst中,不存在精度转换问题,无舍入模式。

示例:输入231,输出231 - 1。

float

将src按照roundMode取到float所能表示的数,以float格式存入dst中。

示例:输入235 + 212 + 211,写成float的表示形式:235 * (1 + 2-23 + 2-24),要求E = 35 + 127 = 162,M = 2-23 + 2-24。

由于float只有23bit尾数位,因此灰色部分要进行舍入。

CAST_RINT模式舍入得尾数00000000000000000000010,E = 162,M = 2-22,最终表示的结果为235 + 213;

CAST_FLOOR模式舍入得尾数00000000000000000000001,E = 162,M = 2-23,最终表示的结果为225 + 212;

CAST_CEIL模式舍入得尾数00000000000000000000010,E = 162,M = 2-22,最终表示的结果为225 + 213;

CAST_ROUND模式舍入得尾数00000000000000000000010,E = 162,M = 2-22,最终表示的结果为225 + 213;

CAST_TRUNC模式舍入得尾数00000000000000000000001,E = 162,M = 2-23,最终表示的结果为225 + 212。

double

将src按照roundMode取到double所能表示的数,以double格式存入dst中。

示例:输入261 + 29 + 28,写成float的表示形式:261 * (1 + 2-52 + 2-53),要求E = 61 + 1023 = 1084,M =2-52 + 2-53。

由于double只有52bit尾数位,因此灰色部分要进行舍入。

CAST_RINT模式舍入得尾数0000000000000000000000000000000000000000000000000010,E = 1084,M = 2-51,最终表示的结果为261 + 210;

CAST_FLOOR模式舍入得尾数0000000000000000000000000000000000000000000000000001,E = 1084,M = 2-52,最终表示的结果为261 + 29;

CAST_CEIL模式舍入得尾数0000000000000000000000000000000000000000000000000010,E = 1084,M =2-51,最终表示的结果为261 + 210;

CAST_ROUND模式舍入得尾数0000000000000000000000000000000000000000000000000010,E = 1084,M = 2-51,最终表示的结果为261 + 210;

CAST_TRUNC模式舍入得尾数0000000000000000000000000000000000000000000000000001,E = 1084,M = 2-52,最终表示的结果为261 + 29。

注:仅支持tensor前n个数据计算接口。

hifloat8_t

float

将src以float格式存入dst中,不存在精度转换问题,无舍入模式。

示例:输入2,输出2。

half

将src以half格式存入dst中,不存在精度转换问题,无舍入模式。

示例:输入2,输出2。

fp8_e4m3fn_t

float

将src以float格式存入dst中,不存在精度转换问题,无舍入模式。

示例:输入2,输出2。

fp8_e5m2_t

float

将src以float格式存入dst中,不存在精度转换问题,无舍入模式。

示例:输入2,输出2。

fp4x2_e2m1_t

bfloat16_t

将src以bfloat16_t格式存入dst中,不存在精度转换问题,无舍入模式。

示例:输入2,输出2。

fp4x2_e1m2_t

bfloat16_t

将src以bfloat16_t格式存入dst中,不存在精度转换问题,无舍入模式。

示例:输入2,输出2。

complex64

complex64

complex64实部和虚部都是float类型,参考float与float之间的精度转换规则。

complex32

complex64实部和虚部都是float类型,complex32实部和虚部都是half类型,参考从float到half的精度转换规则。

complex32

complex64

complex64实部和虚部都是float类型,complex32实部和虚部都是half类型,参考从half到float的精度转换规则。

double

float

将src按照roundMode取到float所能表示的数,以float格式存入dst中。

示例:输入235 + 212 + 211,写成float的表示形式:235 * (1 + 2-23 + 2-24),要求E = 1058 - 1023 + 127 = 162,M = 2-23 + 2-24。

由于float只有8bit指数位,指数部分需要转换,只有23bit尾数位,因此灰色部分要进行舍入。

CAST_RINT模式舍入得尾数00000000000000000000010,E = 162,M = 2-22,最终表示的结果为235 + 213;

CAST_FLOOR模式舍入得尾数00000000000000000000001,E = 162,M = 2-23,最终表示的结果为235 + 212;

CAST_CEIL模式舍入得尾数00000000000000000000010,E = 162,M = 2-22,最终表示的结果为235 + 213;

CAST_ROUND模式舍入得尾数00000000000000000000010,E = 162,M = 2-22,最终表示的结果为235 + 213;

CAST_TRUNC模式舍入得尾数00000000000000000000001,E = 162,M = 2-23,最终表示的结果为235 + 212。

注:仅支持tensor前n个数据计算接口。

bfloat16_t

将src按照roundMode取到bfloat16_t所能表示的数,以bfloat16_t格式存入dst中。

示例:输入235 + 228 + 227,写成bfloat16_t的表示形式:235 * (1 + 2-7 + 2-8),要求E = 1058 - 1023 + 127 = 162,M = 2-7 + 2-8。

由于bfloat16_t只有8bit指数位,指数部分需要转换,只有7bit尾数位,因此灰色部分要进行舍入。

CAST_RINT模式舍入得尾数0000010,E = 162,M = 2-6,最终表示的结果为235 + 229;

CAST_FLOOR模式舍入得尾数0000001,E = 162,M = 2-7,最终表示的结果为235 + 228;

CAST_CEIL模式舍入得尾数0000010,E = 162,M = 2-6,最终表示的结果为235 + 229;

CAST_ROUND模式舍入得尾数0000010,E = 162,M = 2-6,最终表示的结果为235 + 229;

CAST_TRUNC模式舍入得尾数0000001,E = 162,M = 2-7,最终表示的结果为235 + 228。

注:仅支持tensor前n个数据计算接口。

int32_t

将src按照roundMode取整,以int32_t格式(溢出默认按照饱和处理)存入dst中。

示例:输入-1.5,

CAST_TRUNC模式输出-1。

int64_t

将src按照roundMode取整,以int64_t格式(溢出默认按照饱和处理)存入dst中。

示例:输入-1.5,

CAST_TRUNC模式输出-1。

函数原型

参数说明

表2 模板参数说明

参数名

描述

T

目的操作数数据类型。

Ascend 950PR/Ascend 950DT,支持的数据类型见表9

Atlas A3 训练系列产品 / Atlas A3 推理系列产品 ,支持的数据类型见表7

Atlas A2 训练系列产品 / Atlas A2 推理系列产品 ,支持的数据类型见表6

Atlas 200I/500 A2 推理产品 ,支持的数据类型见表8

Atlas 推理系列产品 AI Core,支持的数据类型见表5

Atlas 训练系列产品 ,支持的数据类型见表4

U

源操作数数据类型。

Ascend 950PR/Ascend 950DT,支持的数据类型见表9

Atlas A3 训练系列产品 / Atlas A3 推理系列产品 ,支持的数据类型见表7

Atlas A2 训练系列产品 / Atlas A2 推理系列产品 ,支持的数据类型见表6

Atlas 200I/500 A2 推理产品 ,支持的数据类型见表8

Atlas 推理系列产品 AI Core,支持的数据类型见表5

Atlas 训练系列产品 ,支持的数据类型见表4

isSetMask

是否在接口内部设置mask。

  • true,表示在接口内部设置mask。
  • false,表示在接口外部设置mask,开发者需要使用SetVectorMask接口设置mask值。这种模式下,接口入参中的mask值设置为占位符MASK_PLACEHOLDER,用于占位,无实际含义。
表3 参数说明

参数名

输入/输出

描述

dst

输出

目的操作数。

类型为LocalTensor,支持的TPosition为VECIN/VECCALC/VECOUT。

LocalTensor的起始地址需要32字节对齐。

src

输入

源操作数。

类型为LocalTensor,支持的TPosition为VECIN/VECCALC/VECOUT。

LocalTensor的起始地址需要32字节对齐。

roundMode

输入

精度转换处理模式,类型是RoundMode。

RoundMode为枚举类型,用以控制精度转换处理模式,具体定义为:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
enum class RoundMode {
    CAST_NONE = 0,  // 在转换有精度损失时表示CAST_RINT模式,不涉及精度损失时表示不舍入
    CAST_RINT,      // rint,四舍六入五成双舍入
    CAST_FLOOR,     // floor,向负无穷舍入
    CAST_CEIL,      // ceil,向正无穷舍入
    CAST_ROUND,     // round,四舍五入舍入
    CAST_TRUNC,     // trunc,向零舍入
    CAST_ODD,       // Von Neumann rounding,最近邻奇数舍入
    CAST_HYBRID,    // hybrid,目前特指输出结果是hif8数据时,会用到的一种随机舍入 
};

对于 Atlas 训练系列产品 ,CAST_ROUND表示反向0取整,远离0,对正数x.y变成(x + 1),对负数-x.y,变成-(x + 1)。

count

输入

参与计算的元素个数。

mask/mask[]

输入

mask用于控制每次迭代内参与计算的元素。

  • 逐bit模式:可以按位控制哪些元素参与计算,bit位的值为1表示参与计算,0表示不参与。

    mask为数组形式,数组长度和数组元素的取值范围和操作数的数据类型有关。当操作数为16位时,数组长度为2,mask[0]、mask[1]∈[0, 264-1]并且不同时为0;当操作数为32位时,数组长度为1,mask[0]∈(0, 264-1];当操作数为64位时,数组长度为1,mask[0]∈(0, 232-1]。

    例如,mask=[8, 0],8=0b1000,表示仅第4个元素参与计算。

  • 连续模式:表示前面连续的多少个元素参与计算。取值范围和操作数的数据类型有关,数据类型不同,每次迭代内能够处理的元素个数最大值不同。当操作数为16位时,mask∈[1, 128];当操作数为32位时,mask∈[1, 64];当操作数为64位时,mask∈[1, 32]。

repeatTime

输入

重复迭代次数。矢量计算单元,每次读取连续的256Bytes数据进行计算,为完成对输入数据的处理,必须通过多次迭代(repeat)才能完成所有数据的读取与计算。repeatTime表示迭代的次数,repeatTime∈[0,255]。

关于该参数的具体描述请参考高维切分API。

repeatParams

输入

控制操作数地址步长的参数,UnaryRepeatParams类型。包含操作数相邻迭代间的地址步长,操作数同一迭代内datablock的地址步长等参数。其中dstRepStride/srcRepStride∈[0,255]。

相邻迭代间的地址步长参数说明请参考repeatStride;同一迭代内DataBlock的地址步长参数说明请参考dataBlockStride。

表4 Atlas 训练系列产品 Cast指令参数说明

src数据类型

dst数据类型

支持的roundMode

half

float

CAST_NONE

int32_t

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC

int8_t

CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC/CAST_NONE

uint8_t

CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC/CAST_NONE

float

half

CAST_NONE/CAST_ODD

int32_t

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC

uint8_t

half

CAST_NONE

int8_t

half

CAST_NONE

int32_t

float

CAST_NONE

表5 Atlas 推理系列产品 AI CoreCast指令参数说明

src数据类型

dst数据类型

支持的roundMode

half

int32_t

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC

int16_t

CAST_RINT

float

CAST_NONE

int8_t

CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC/CAST_NONE

uint8_t

CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC/CAST_NONE

int4b_t

CAST_NONE

float

int32_t

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC

half

CAST_NONE/CAST_ODD

uint8_t

half

CAST_NONE

int8_t

half

CAST_NONE

int16_t

half

CAST_NONE

int32_t

float

CAST_NONE

int16_t

CAST_NONE

half

roundMode不生效,与SetDeqScale(half scale)接口配合使用。

表6 Atlas A2 训练系列产品 / Atlas A2 推理系列产品 Cast指令参数说明

src数据类型

dst数据类型

支持的roundMode

half

int32_t

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC

int16_t

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC

float

CAST_NONE

int8_t

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC/CAST_NONE

uint8_t

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC/CAST_NONE

int4b_t

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC/CAST_NONE

float

float

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC

int32_t

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC

half

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC/CAST_ODD/CAST_NONE

int64_t

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC

int16_t

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC

float

bfloat16_t

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC

bfloat16_t

float

CAST_NONE

int32_t

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC

int4b_t

half

CAST_NONE

uint8_t

half

CAST_NONE

int8_t

half

CAST_NONE

int16_t

half

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC/CAST_NONE

float

CAST_NONE

int32_t

float

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC/CAST_NONE

int16_t

CAST_NONE

half

roundMode不生效,与SetDeqScale(half scale)接口配合使用。

int64_t

CAST_NONE

int64_t

int32_t

CAST_NONE

float

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC

表7 Atlas A3 训练系列产品 / Atlas A3 推理系列产品 Cast指令参数说明

src数据类型

dst数据类型

支持的roundMode

half

int32_t

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC

int16_t

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC

float

CAST_NONE

int8_t

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC/CAST_NONE

uint8_t

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC/CAST_NONE

int4b_t

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC/CAST_NONE

float

float

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC

int32_t

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC

half

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC/CAST_ODD/CAST_NONE

int64_t

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC

int16_t

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC

float

bfloat16_t

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC

bfloat16_t

float

CAST_NONE

int32_t

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC

int4b_t

half

CAST_NONE

uint8_t

half

CAST_NONE

int8_t

half

CAST_NONE

int16_t

half

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC/CAST_NONE

float

CAST_NONE

int32_t

float

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC/CAST_NONE

int16_t

CAST_NONE

half

roundMode不生效,与SetDeqScale(half scale)接口配合使用。

int64_t

CAST_NONE

int64_t

int32_t

CAST_NONE

float

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC

表8 Atlas 200I/500 A2 推理产品 Cast指令参数说明

src数据类型

dst数据类型

支持的roundMode

half

int32_t

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC

int16_t

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC

float

CAST_NONE

int8_t

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC/CAST_NONE

uint8_t

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC/CAST_NONE

float

float

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC

int32_t

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC

half

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC/CAST_ODD/CAST_NONE

int64_t

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC

int16_t

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC

float

bfloat16_t

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC

bfloat16_t

float

CAST_NONE

int32_t

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC

uint8_t

half

CAST_NONE

int8_t

half

CAST_NONE

int16_t

half

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC/CAST_NONE

float

CAST_NONE

int32_t

float

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC/CAST_NONE

int16_t

CAST_NONE

half

CAST_NONE

int64_t

CAST_NONE

int64_t

int32_t

CAST_NONE

float

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC

表9 Ascend 950PR/Ascend 950DTCast指令参数说明

src数据类型

dst数据类型

支持的roundMode

float

float

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC

half

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC/CAST_ODD/CAST_NONE

int64_t

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC

int32_t

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC

int16_t

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC

bfloat16_t

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC

hifloat8_t

CAST_ROUND/CAST_HYBRID

fp8_e4m3fn_t

CAST_RINT

fp8_e5m2_t

CAST_RINT

half

float

CAST_NONE

int32_t

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC

int16_t

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC

int8_t

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC

uint8_t

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC

int4b_t

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC

bfloat16_t

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC

hifloat8_t

CAST_ROUND/CAST_HYBRID

bfloat16_t

float

CAST_NONE

int32_t

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC

half

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC

fp4x2_e2m1_t

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC

fp4x2_e1m2_t

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC

int4b_t

half

CAST_NONE

int16_t

CAST_NONE

bfloat16_t

CAST_NONE

uint8_t

half

CAST_NONE

uint16_t

CAST_NONE

uint32_t

CAST_NONE

int8_t

half

CAST_NONE

int16_t

CAST_NONE

int32_t

CAST_NONE

uint16_t

uint8_t

CAST_NONE

uint32_t

CAST_NONE

int16_t

half

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC

float

CAST_NONE

uint8_t

CAST_NONE

uint32_t

CAST_NONE

int4b_t

CAST_NONE

int32_t

CAST_NONE

uint32_t

uint8_t

CAST_NONE

uint16_t

CAST_NONE

int16_t

CAST_NONE

int32_t

float

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC

int64_t

CAST_NONE

int16_t

CAST_NONE

half

roundMode不生效,与SetDeqScale(half scale)接口配合使用。

uint8_t

CAST_NONE

uint16_t

CAST_NONE

int64_t

int32_t

CAST_NONE

float

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC

double

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC

hifloat8_t

float

CAST_NONE

half

CAST_NONE

fp8_e4m3fn_t

float

CAST_NONE

fp8_e5m2_t

float

CAST_NONE

fp4x2_e2m1_t

bfloat16_t

CAST_NONE

fp4x2_e1m2_t

bfloat16_t

CAST_NONE

complex64

complex64

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC

complex32

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC/CAST_ODD/CAST_NONE

complex32

complex64

CAST_NONE

double

float

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC

bfloat16_t

CAST_RINT/CAST_FLOOR/CAST_CEIL/CAST_ROUND/CAST_TRUNC

int32_t

CAST_TRUNC

int64_t

CAST_TRUNC

返回值说明

无

约束说明

调用示例

本样例中只展示Compute流程中的部分代码。本样例的srcLocal为half类型,dstLocal为int32_t类型,计算mask时以int32_t为准。

根据不同的RoundMode取值,输出结果会有差异,下面样例以RoundMode::CAST_CEIL(向正无穷舍入)为例。

结果示例如下:

输入数据(srcLocal): 
[1.4, 1.5, 1.6, 2.4, 2.5, 2.6, ... 2.6]
输出数据(dstLocal): 
[2, 2, 2, 3, 3, 3, ... 3]

当RoundMode为RoundMode::CAST_NONE(half转int32_t有精度损失,此时同CAST_RINT模式)或RoundMode::CAST_RINT(四舍六入五成双舍入)时,结果示例如下:

输入数据(srcLocal): 
[1.4, 1.5, 1.6, 2.4, 2.5, 2.6, ... 2.6]
输出数据(dstLocal): 
[1, 2, 2, 2, 2, 3, ... 3]

当RoundMode为RoundMode::CAST_FLOOR(向负无穷舍入)时,结果示例如下:

输入数据(srcLocal): 
[1.4, 1.5, 1.6, 2.4, 2.5, 2.6, ... 2.6]
输出数据(dstLocal): 
[1, 1, 1, 2, 2, 2, ... 2]

当RoundMode为RoundMode::CAST_ROUND(四舍五入舍入)时,结果示例如下:

输入数据(srcLocal): 
[1.4, 1.5, 1.6, 2.4, 2.5, 2.6, ... 2.6]
输出数据(dstLocal): 
[1, 2, 2, 2, 3, 3, ... 3]

当RoundMode为RoundMode::CAST_TRUNC(向零舍入)时,结果示例如下:

输入数据(srcLocal): 
[1.4, 1.5, 1.6, 2.4, 2.5, 2.6, ... 2.6]
输出数据(dstLocal): 
[1, 1, 1, 2, 2, 2, ... 2]

更多样例

更多地,您可以参考以下样例,了解如何使用Cast指令的tensor高维切分计算接口,进行更灵活的操作、实现更高级的功能。