概述【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit类型转换包括隐式转换和显式转换。隐式转换在类型不匹配时由系统自动执行。显式转换则通过调用类型转换API来主动完成API会将输入数据从源类型转换为目标类型并返回转换结果。整个转换过程遵循规定的处理规则。类型转换的结果受舍入模式和饱和模式的影响。关于浮点数的表示方式和舍入规则请参见类型转换的相关说明。隐式转换隐式转换是指在不显式指定目标类型的情况下系统自动将数据从源类型转换为目标类型的行为。以下是一个隐式转换的示例。int32_t a; a 2.2f; // a 2输入整型输出整型 输入、输出为int8_t/uint8_t/int16_t/uint16_t/int32_t/uint32_t/int64_t/uint64_t舍入规则遵循CAST_TRUNC。输入浮点型输出整型输入为float输出为int32_t/uint32_t/int64_t/uint64_t输入为half或bfloat16_t输出为int32_t/uint32_t舍入规则遵循CAST_TRUNC。宽范围数据转成窄范围数据时如果输入为inf或者超出该类型所能表示的最大值转换结果为最大值。如果输入为-inf或者小于该类型所能表示的最小值转换结果为最小值。如果输入为nan转换结果为0。输入整型输出浮点型输入为int32_t/uint32_t输出为float/half/bfloat16_t输入为int64_t/uint64_t输出为float 舍入规则遵循CAST_RINT。宽范围数据转成窄范围数据时如果输入超出该类型所能表示的范围转换结果为对应符号的inf值。输入浮点型输出浮点型输入为float输出为half/bfloat16_t输入为half输出为float/bfloat16_t输入为bfloat16_t输出为float/half舍入规则遵循CAST_RINT。宽范围数据转成窄范围数据时如果输入超出该类型所能表示的范围转换结果为对应符号的inf值。如果输入为nan转换结果为nan。隐式转换示例如下// int8_t转uint8_t int8_t a -100; uint8_t b a; // b 156 // half转int32_t half a 60000.6; int32_t b a; // b 60000 // int32_t转half int32_t a 100000; half b a; // b inf100000超出half类型能表示的范围 // float转half float a -100000.0f; half b a; // b -inf-100000.0f超出half类型能表示的范围舍入模式舍入模式控制转换过程中精度损失的处理方式。表1类型转换类接口支持的舍入模式舍入模式描述接口名格式CAST_RINT四舍六入五成双取整srctype2dsttype_rnCAST_FLOOR向下取整srctype2dsttype_rdCAST_CEIL向上取整srctype2dsttype_ruCAST_ROUND四舍五入取整srctype2dsttype_rnaCAST_TRUNC向零取整srctype2dsttype_rzCAST_ODD最近邻奇数舍入srctype2dsttype_roCAST_HYBRID目前特指输出结果为hi8数据时会用到的一种随机舍入srctype2dsttype_rh上表说明了各个输入模式对应的接口名格式其中srctype表示输入源操作数类型dsttype表示输出目标类型。例如float类型转成half类型并使用CAST_RINT模式进行舍入接口名为__float2half_rn。饱和行为饱和行为控制对nan、inf特殊值以及转换后超出目标类型范围结果的处理方式。表2饱和行为的模式说明模式描述接口名格式非饱和模式默认模式。如果输入超出该类型所能表示的范围转换结果为对应符号的inf值。如果输入为nan转换结果为nan。srctype2dsttype_r[xx]饱和模式饱和模式下如果输入为inf或者超出该类型所能表示的最大值转换结果为最大值。如果输入为-inf或者小于该类型所能表示的最小值转换结果为最小值。如果输入为nan转换结果为0。srctype2dsttype_r[xx]_sat控制饱和行为的方式饱和行为受寄存器CTRL[60]、CTRL[48]和接口功能同时控制SIMD与SIMT混合编程场景下CTRL寄存器的设置请参考SetCtrlSpr(ISASI).md)接口。SIMT编程场景暂不支持设置CTRL寄存器。宽范围数据转成窄范围数据且转换的目标类型不是float时包括float转half、float转bfloat16_t、bfloat16_t转half、float或half转hifloat8_t、fp8_e4m3fn_t或fp8_e5m2_t接口的饱和行为受硬件寄存器CTRL[60]和CTRL[48]的影响。具体行为如下当CTRL[60] 0时饱和行为受接口独立控制。后缀__sat的接口转换结果为饱和模式。不带__sat后缀的接口转换结果为非饱和模式。当CTRL[60] 1时饱和行为只受CTRL[48]全局控制。当CTRL[48] 1时接口转换结果为非饱和模式。当CTRL[48] 0时接口转换结果为饱和模式。表3宽范围数据转窄范围数据的最终饱和行为Ctrl[60]Ctrl[48]接口名格式最终饱和行为0/不带__sat非饱和11/非饱和0/__sat饱和10/饱和对如下两种情况饱和行为只受ctrl[48]控制。窄范围数据转换为宽范围数据且转换的目的操作数类型不是float即half转bfloat16_t、hifloat8_t转half。half转half、bfloat16_t转bfloat16_t。具体行为如下当CTRL[48] 1时接口转换结果为非饱和模式。当CTRL[48] 0时接口转换结果为饱和模式。表4窄范围数据转宽范围数据、同类型数据转换最终饱和行为Ctrl[60]Ctrl[48]最终饱和行为/1非饱和/0饱和对于转换的目标类型为float的情况所有类型转换接口只支持非饱和模式。浮点数转换为整数时转换结果均采用饱和模式。数据类型转换规则示例输入数据类型为float输出数据类型为float将src按照舍入模式精度转换处理模式参见表1取整仍以float格式存入dst中。示例输入0.5CAST_RINT模式输出0.0CAST_FLOOR模式输出0.0CAST_CEIL模式输出1.0CAST_ROUND模式输出1.0CAST_TRUNC模式输出0.0。输出数据类型为half示例1输入0.5 2^(-12)写成float的表示形式2^(-1) * (1 2^(-11))因此E -1 127 126M 2^(-11)。half的指数位可以表示出2^(-1)E -1 15 14但half只有10 bit尾数位因此要进行舍入。CAST_RINT模式舍入得尾数0000000000E 14M 0最终表示的结果为0.5CAST_FLOOR模式舍入得尾数0000000000E 14M 0最终表示的结果为0.5CAST_CEIL模式舍入得尾数0000000001E 14M 2^(-10)最终表示的结果为0.5 2^(-11)CAST_ROUND模式舍入得尾数0000000001E 14M 2^(-10)最终表示的结果为0.5 2^(-11)CAST_TRUNC模式舍入得尾数0000000000E 14M 0最终表示的结果为0.5CAST_ODD模式舍入得尾数0000000001E 14M 2^(-10)最终表示的结果为0.5 2^(-11)。float转half的最终饱和行为请见表3。示例2输入inf饱和模式输出65504非饱和模式输出inf。示例3输入-inf饱和模式输出-65504非饱和模式输出-inf。示例4输入nan饱和模式输出0非饱和模式输出nan。输出数据类型为bfloat16_t示例1输入0.5 2^(-9) 2^(-11)写成float的表示形式2^(-1) * (1 2^(-8) 2^(-10))因此E -1 127 126M 2^(-8) 2^(-10)。bfloat16_t的指数位位数和float的相同有E 126但bfloat16_t只有7bit尾数位因此要进行舍入。CAST_RINT模式舍入得尾数0000001E 126M 2^(-7)最终表示的结果为0.5 2^(-8)CAST_FLOOR模式舍入得尾数0000000E 126M 0最终表示的结果为0.5CAST_CEIL模式舍入得尾数0000001E 126M 2^(-7)最终表示的结果为0.5 2^(-8)CAST_ROUND模式舍入得尾数0000001E 126M 2^(-7)最终表示的结果为0.5 2^(-8)CAST_TRUNC模式舍入得尾数0000000E 126M 0最终表示的结果为0.5。float转bfloat16_t的最终饱和行为请见表3。示例2输入inf饱和模式输出约3.39*10^38非饱和模式输出inf。示例3输入-inf饱和模式输出约-3.39*10^38非饱和模式输出-inf。示例4输入nan饱和模式输出0非饱和模式输出nan。输出数据类型为int32_t示例1输入2^22 0.5CAST_RINT模式输出2^22CAST_FLOOR模式输出2^22CAST_CEIL模式输出2^22 1CAST_ROUND模式输出2^22 1CAST_TRUNC模式输出2^22。示例2输入inf输出2^31-1。示例3输入-inf输出-2^31。示例4输入nan输出0。输出数据类型为uint32_t示例1输入2^22 0.5CAST_RINT模式输出2^22CAST_FLOOR模式输出2^22CAST_CEIL模式输出2^22 1CAST_ROUND模式输出2^22 1CAST_TRUNC模式输出2^22。示例2输入inf输出2^32-1。示例3输入-inf输出0。示例4输入nan输出0。输出数据类型为int64_t示例1输入2^22 0.5CAST_RINT模式输出2^22CAST_FLOOR模式输出2^22CAST_CEIL模式输出2^22 1CAST_ROUND模式输出2^22 1CAST_TRUNC模式输出2^22。示例2输入inf输出2^63-1。示例3输入-inf输出-2^63。示例4输入nan输出0。输出数据类型为uint64_t示例1输入2^22 0.5CAST_RINT模式输出2^22CAST_FLOOR模式输出2^22CAST_CEIL模式输出2^22 1CAST_ROUND模式输出2^22 1CAST_TRUNC模式输出2^22。示例2输入inf输出2^64-1。示例3输入-inf输出0。示例4输入nan输出0。输出数据类型为hifloat8_t将src按照舍入模式取整以hifloat8_t格式溢出默认按照饱和处理存入dst中。示例输入1.75CAST_ROUND模式输出2CAST_HYBRID参考表9输出。输出数据类型为fp8_e4m3fn_t将src按照舍入模式取整以fp8_e4m3fn_t格式溢出默认按照饱和处理存入dst中。示例输入2.5CAST_RINT模式输出2。输出数据类型为fp8_e5m2_t将src按照舍入模式取整以fp8_e5m2_t格式溢出默认按照饱和处理存入dst中。示例输入2.5CAST_RINT模式输出2。输入数据类型为half输出数据类型为half将src按照舍入模式取整仍以half格式存入dst中。示例输入0.5CAST_RINT模式输出0.0CAST_FLOOR模式输出0.0CAST_CEIL模式输出1.0CAST_ROUND模式输出1.0CAST_TRUNC模式输出0.0。输出数据类型为float不存在精度转换问题舍入模式不起作用。示例1输入1.5 - 2^(-10)输出1.5 - 2^(-10)。half转float仅支持非饱和模式。示例2输入inf输出inf。示例3输入-inf输出-inf。示例4输入nan输出nan。输出数据类型为bfloat16_t示例1输入0.5 2^(-9) 2^(-11)写成half的表示形式2^(-1) * (1 2^(-8) 2^(-10))因此E -1 15 14M 2^(-8) 2^(-10)。bfloat16_t的指数位可以表示出2^(-1)E -1 127 126但bfloat16_t只有7bit尾数位因此要进行舍入。CAST_RINT模式舍入得尾数0000001E 126M 2^(-7)最终表示的结果为0.5 2^(-8)CAST_FLOOR模式舍入得尾数0000000E 126M 0最终表示的结果为0.5CAST_CEIL模式舍入得尾数0000001E 126M 2^(-7)最终表示的结果为0.5 2^(-8)CAST_ROUND模式舍入得尾数0000001E 126M 2^(-7)最终表示的结果为0.5 2^(-8)CAST_TRUNC模式舍入得尾数0000000E 126M 0最终表示的结果为0.5。half转bfloat16_t的最终饱和行为请见表4。示例2输入inf饱和模式输出约3.39*10^38非饱和模式输出inf。示例3输入-inf饱和模式输出约-3.39*10^38非饱和模式输出-inf。示例4输入nan饱和模式输出0非饱和模式输出nan。输出数据类型为int32_t示例1输入2^9 0.5CAST_RINT模式输出2^9CAST_FLOOR模式输出2^9CAST_CEIL模式输出2^9 1CAST_ROUND模式输出2^9 1CAST_TRUNC模式输出2^9。示例2输入inf输出2^31-1。示例3输入-inf输出-2^31。示例4输入nan输出0。输出数据类型为uint32_t示例1输入2^9 0.5CAST_RINT模式输出2^9CAST_FLOOR模式输出2^9CAST_CEIL模式输出2^9 1CAST_ROUND模式输出2^9 1CAST_TRUNC模式输出2^9。示例2输入inf输出2^32-1。示例3输入-inf输出0。示例4输入nan输出0。输出数据类型为hifloat8_t将src按照舍入模式取整以hifloat8_t格式溢出默认按照饱和处理存入dst中。示例输入1.75CAST_ROUND模式输出2CAST_HYBRID模式参考表10输出。输入数据类型为bfloat16_t输出数据类型为bfloat16_t将src按照舍入模式取整仍以bfloat16_t格式存入dst中。示例输入0.5CAST_RINT模式输出0.0CAST_FLOOR模式输出0.0CAST_CEIL模式输出1.0CAST_ROUND模式输出1.0CAST_TRUNC模式输出0.0。输出数据类型为float不存在精度转换问题舍入模式不起作用。示例1输入1.5 - 2^(-6)输出1.5 - 2^(-6)。bfloat16_t转float仅支持非饱和模式。示例2输入inf输出inf。示例3输入-inf输出-inf。示例4输入nan输出nan。输出数据类型为half示例1输入1.5 - 2^(-6)输出1.5 - 2^(-6)。bfloat16转half的最终饱和行为请见表3。示例2输入inf饱和模式输出65504非饱和模式输出inf。示例3输入-inf饱和模式输出-65504非饱和模式输出-inf。示例4输入nan饱和模式输出0非饱和模式输出nan。输出数据类型为int32_t示例1输入2^6 0.5CAST_RINT模式输出2^6CAST_FLOOR模式输出2^6CAST_CEIL模式输出2^6 1CAST_ROUND模式输出2^6 1CAST_TRUNC模式输出2^6。示例2输入inf输出2^31-1。示例3输入-inf输出-2^31。示例4输入nan输出0。输出数据类型为uint32_t示例1输入2^6 0.5CAST_RINT模式输出2^6CAST_FLOOR模式输出2^6CAST_CEIL模式输出2^6 1CAST_ROUND模式输出2^6 1CAST_TRUNC模式输出2^6。示例2输入inf输出2^32-1。示例3输入-inf输出0。示例4输入nan输出0。输入数据类型为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。输入数据类型为int32_t输出数据类型为float示例1输入2^25 3写成float的表示形式2^25 * (1 2^(-24) 2^(-25))要求E 25 127 152M 2^(-24) 2^(-25)。由于float只有23bit尾数位因此要进行舍入。CAST_RINT模式舍入得尾数00000000000000000000001E 152M 2^(-23)最终表示的结果为2^25 4CAST_FLOOR模式舍入得尾数00000000000000000000000E 152M 0最终表示的结果为2^25CAST_CEIL模式舍入得尾数00000000000000000000001E 152M 2^(-23)最终表示的结果为2^25 4CAST_ROUND模式舍入得尾数00000000000000000000001E 152M 2^(-23)最终表示的结果为2^25 4CAST_TRUNC模式舍入得尾数00000000000000000000000E 152M 0最终表示的结果为2^25 。输出数据类型为half示例1输入2^12 3写成half的表示形式2^12 *(1 2^(-11) 2^(-12))要求E 12 15 27M 2^(-11) 2^(-12)。由于half只有10bit尾数位因此要进行舍入。CAST_RINT模式舍入得尾数0000000001E 27M 2^(-10)最终表示的结果为2^12 4CAST_FLOOR模式舍入得尾数0000000000E 27M 0最终表示的结果为2^12CAST_CEIL模式舍入得尾数0000000001E 27M 2^(-10)最终表示的结果为2^12 4CAST_ROUND模式舍入得尾数0000000001E 27M 2^(-10)最终表示的结果为2^12 4CAST_TRUNC模式舍入得尾数0000000000E 27M 0最终表示的结果为2^12 。示例2输入2^31 - 1SAT模式返回65504.0NO_SAT模式返回inf。示例3输入-2^31SAT模式返回-65504.0NO_SAT模式返回-inf。输出数据类型为bfloat16_t示例1输入2^9 3写成bfloat16_t的表示形式2^9 *(1 2^(-8) 2^(-9))要求E 9 127 136M 2^(-8) 2^(-9)。由于bfloat16_t只有7bit尾数位因此要进行舍入。CAST_RINT模式舍入得尾数0000001E 136M 2^(-7)最终表示的结果为2^9 4CAST_FLOOR模式舍入得尾数0000000E 136M 0最终表示的结果为2^9CAST_CEIL模式舍入得尾数0000001E 136M 2^(-7)最终表示的结果为2^9 4CAST_ROUND模式舍入得尾数0000001E 136M 2^(-7)最终表示的结果为2^9 4CAST_TRUNC模式舍入得尾数0000000E 136M 0最终表示的结果为2^9 。输入数据类型为uint32_t输出数据类型为float示例1输入2^25 3写成float的表示形式2^25 * (1 2^(-24) 2^(-25))要求E 25 127 152M 2^(-24) 2^(-25)。由于float只有23bit尾数位因此要进行舍入。CAST_RINT模式舍入得尾数00000000000000000000001E 152M 2^(-23)最终表示的结果为2^25 4CAST_FLOOR模式舍入得尾数00000000000000000000000E 152M 0最终表示的结果为2^25CAST_CEIL模式舍入得尾数00000000000000000000001E 152M 2^(-23)最终表示的结果为2^25 4CAST_ROUND模式舍入得尾数00000000000000000000001E 152M 2^(-23)最终表示的结果为2^25 4CAST_TRUNC模式舍入得尾数00000000000000000000000E 152M 0最终表示的结果为2^25 。输出数据类型为half示例1输入2^12 3写成half的表示形式2^12 *(1 2^(-11) 2^(-12))要求E 12 15 27M 2^(-11) 2^(-12)。由于half只有10bit尾数位因此要进行舍入。CAST_RINT模式舍入得尾数0000000001E 27M 2^(-10)最终表示的结果为2^12 4CAST_FLOOR模式舍入得尾数0000000000E 27M 0最终表示的结果为2^12CAST_CEIL模式舍入得尾数0000000001E 27M 2^(-10)最终表示的结果为2^12 4CAST_ROUND模式舍入得尾数0000000001E 27M 2^(-10)最终表示的结果为2^12 4CAST_TRUNC模式舍入得尾数0000000000E 27M 0最终表示的结果为2^12 。示例2输入2^32 - 1SAT模式返回65504.0NO_SAT模式返回inf。输出数据类型为bfloat16_t示例1输入2^9 3写成bfloat16_t的表示形式2^9 *(1 2^(-8) 2^(-9))要求E 9 127 136M 2^(-8) 2^(-9)。由于bfloat16_t只有7bit尾数位因此要进行舍入。CAST_RINT模式舍入得尾数0000001E 136M 2^(-7)最终表示的结果为2^9 4CAST_FLOOR模式舍入得尾数0000000E 136M 0最终表示的结果为2^9CAST_CEIL模式舍入得尾数0000001E 136M 2^(-7)最终表示的结果为2^9 4CAST_ROUND模式舍入得尾数0000001E 136M 2^(-7)最终表示的结果为2^9 4CAST_TRUNC模式舍入得尾数0000000E 136M 0最终表示的结果为2^9 。输入数据类型为int64_t输出数据类型为float示例1输入2^25 3写成float的表示形式2^25 * (1 2^(-24) 2^(-25))要求E 25 127 152M 2^(-24) 2^(-25)。由于float只有23bit尾数位因此要进行舍入。CAST_RINT模式舍入得尾数00000000000000000000001E 152M 2^(-23)最终表示的结果为2^25 4CAST_FLOOR模式舍入得尾数00000000000000000000000E 152M 0最终表示的结果为2^25CAST_CEIL模式舍入得尾数00000000000000000000001E 152M 2^(-23)最终表示的结果为2^25 4CAST_ROUND模式舍入得尾数00000000000000000000001E 152M 2^(-23)最终表示的结果为2^25 4CAST_TRUNC模式舍入得尾数00000000000000000000000E 152M 0最终表示的结果为2^25 。输入数据类型为uint64_t输出数据类型为float示例1输入2^25 3写成float的表示形式2^25 * (1 2^(-24) 2^(-25))要求E 25 127 152M 2^(-24) 2^(-25)。由于float只有23bit尾数位因此要进行舍入。CAST_RINT模式舍入得尾数00000000000000000000001E 152M 2^(-23)最终表示的结果为2^25 4CAST_FLOOR模式舍入得尾数00000000000000000000000E 152M 0最终表示的结果为2^25CAST_CEIL模式舍入得尾数00000000000000000000001E 152M 2^(-23)最终表示的结果为2^25 4CAST_ROUND模式舍入得尾数00000000000000000000001E 152M 2^(-23)最终表示的结果为2^25 4CAST_TRUNC模式舍入得尾数00000000000000000000000E 152M 0最终表示的结果为2^25 。【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
Ascend C数据类型转换
概述【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit类型转换包括隐式转换和显式转换。隐式转换在类型不匹配时由系统自动执行。显式转换则通过调用类型转换API来主动完成API会将输入数据从源类型转换为目标类型并返回转换结果。整个转换过程遵循规定的处理规则。类型转换的结果受舍入模式和饱和模式的影响。关于浮点数的表示方式和舍入规则请参见类型转换的相关说明。隐式转换隐式转换是指在不显式指定目标类型的情况下系统自动将数据从源类型转换为目标类型的行为。以下是一个隐式转换的示例。int32_t a; a 2.2f; // a 2输入整型输出整型 输入、输出为int8_t/uint8_t/int16_t/uint16_t/int32_t/uint32_t/int64_t/uint64_t舍入规则遵循CAST_TRUNC。输入浮点型输出整型输入为float输出为int32_t/uint32_t/int64_t/uint64_t输入为half或bfloat16_t输出为int32_t/uint32_t舍入规则遵循CAST_TRUNC。宽范围数据转成窄范围数据时如果输入为inf或者超出该类型所能表示的最大值转换结果为最大值。如果输入为-inf或者小于该类型所能表示的最小值转换结果为最小值。如果输入为nan转换结果为0。输入整型输出浮点型输入为int32_t/uint32_t输出为float/half/bfloat16_t输入为int64_t/uint64_t输出为float 舍入规则遵循CAST_RINT。宽范围数据转成窄范围数据时如果输入超出该类型所能表示的范围转换结果为对应符号的inf值。输入浮点型输出浮点型输入为float输出为half/bfloat16_t输入为half输出为float/bfloat16_t输入为bfloat16_t输出为float/half舍入规则遵循CAST_RINT。宽范围数据转成窄范围数据时如果输入超出该类型所能表示的范围转换结果为对应符号的inf值。如果输入为nan转换结果为nan。隐式转换示例如下// int8_t转uint8_t int8_t a -100; uint8_t b a; // b 156 // half转int32_t half a 60000.6; int32_t b a; // b 60000 // int32_t转half int32_t a 100000; half b a; // b inf100000超出half类型能表示的范围 // float转half float a -100000.0f; half b a; // b -inf-100000.0f超出half类型能表示的范围舍入模式舍入模式控制转换过程中精度损失的处理方式。表1类型转换类接口支持的舍入模式舍入模式描述接口名格式CAST_RINT四舍六入五成双取整srctype2dsttype_rnCAST_FLOOR向下取整srctype2dsttype_rdCAST_CEIL向上取整srctype2dsttype_ruCAST_ROUND四舍五入取整srctype2dsttype_rnaCAST_TRUNC向零取整srctype2dsttype_rzCAST_ODD最近邻奇数舍入srctype2dsttype_roCAST_HYBRID目前特指输出结果为hi8数据时会用到的一种随机舍入srctype2dsttype_rh上表说明了各个输入模式对应的接口名格式其中srctype表示输入源操作数类型dsttype表示输出目标类型。例如float类型转成half类型并使用CAST_RINT模式进行舍入接口名为__float2half_rn。饱和行为饱和行为控制对nan、inf特殊值以及转换后超出目标类型范围结果的处理方式。表2饱和行为的模式说明模式描述接口名格式非饱和模式默认模式。如果输入超出该类型所能表示的范围转换结果为对应符号的inf值。如果输入为nan转换结果为nan。srctype2dsttype_r[xx]饱和模式饱和模式下如果输入为inf或者超出该类型所能表示的最大值转换结果为最大值。如果输入为-inf或者小于该类型所能表示的最小值转换结果为最小值。如果输入为nan转换结果为0。srctype2dsttype_r[xx]_sat控制饱和行为的方式饱和行为受寄存器CTRL[60]、CTRL[48]和接口功能同时控制SIMD与SIMT混合编程场景下CTRL寄存器的设置请参考SetCtrlSpr(ISASI).md)接口。SIMT编程场景暂不支持设置CTRL寄存器。宽范围数据转成窄范围数据且转换的目标类型不是float时包括float转half、float转bfloat16_t、bfloat16_t转half、float或half转hifloat8_t、fp8_e4m3fn_t或fp8_e5m2_t接口的饱和行为受硬件寄存器CTRL[60]和CTRL[48]的影响。具体行为如下当CTRL[60] 0时饱和行为受接口独立控制。后缀__sat的接口转换结果为饱和模式。不带__sat后缀的接口转换结果为非饱和模式。当CTRL[60] 1时饱和行为只受CTRL[48]全局控制。当CTRL[48] 1时接口转换结果为非饱和模式。当CTRL[48] 0时接口转换结果为饱和模式。表3宽范围数据转窄范围数据的最终饱和行为Ctrl[60]Ctrl[48]接口名格式最终饱和行为0/不带__sat非饱和11/非饱和0/__sat饱和10/饱和对如下两种情况饱和行为只受ctrl[48]控制。窄范围数据转换为宽范围数据且转换的目的操作数类型不是float即half转bfloat16_t、hifloat8_t转half。half转half、bfloat16_t转bfloat16_t。具体行为如下当CTRL[48] 1时接口转换结果为非饱和模式。当CTRL[48] 0时接口转换结果为饱和模式。表4窄范围数据转宽范围数据、同类型数据转换最终饱和行为Ctrl[60]Ctrl[48]最终饱和行为/1非饱和/0饱和对于转换的目标类型为float的情况所有类型转换接口只支持非饱和模式。浮点数转换为整数时转换结果均采用饱和模式。数据类型转换规则示例输入数据类型为float输出数据类型为float将src按照舍入模式精度转换处理模式参见表1取整仍以float格式存入dst中。示例输入0.5CAST_RINT模式输出0.0CAST_FLOOR模式输出0.0CAST_CEIL模式输出1.0CAST_ROUND模式输出1.0CAST_TRUNC模式输出0.0。输出数据类型为half示例1输入0.5 2^(-12)写成float的表示形式2^(-1) * (1 2^(-11))因此E -1 127 126M 2^(-11)。half的指数位可以表示出2^(-1)E -1 15 14但half只有10 bit尾数位因此要进行舍入。CAST_RINT模式舍入得尾数0000000000E 14M 0最终表示的结果为0.5CAST_FLOOR模式舍入得尾数0000000000E 14M 0最终表示的结果为0.5CAST_CEIL模式舍入得尾数0000000001E 14M 2^(-10)最终表示的结果为0.5 2^(-11)CAST_ROUND模式舍入得尾数0000000001E 14M 2^(-10)最终表示的结果为0.5 2^(-11)CAST_TRUNC模式舍入得尾数0000000000E 14M 0最终表示的结果为0.5CAST_ODD模式舍入得尾数0000000001E 14M 2^(-10)最终表示的结果为0.5 2^(-11)。float转half的最终饱和行为请见表3。示例2输入inf饱和模式输出65504非饱和模式输出inf。示例3输入-inf饱和模式输出-65504非饱和模式输出-inf。示例4输入nan饱和模式输出0非饱和模式输出nan。输出数据类型为bfloat16_t示例1输入0.5 2^(-9) 2^(-11)写成float的表示形式2^(-1) * (1 2^(-8) 2^(-10))因此E -1 127 126M 2^(-8) 2^(-10)。bfloat16_t的指数位位数和float的相同有E 126但bfloat16_t只有7bit尾数位因此要进行舍入。CAST_RINT模式舍入得尾数0000001E 126M 2^(-7)最终表示的结果为0.5 2^(-8)CAST_FLOOR模式舍入得尾数0000000E 126M 0最终表示的结果为0.5CAST_CEIL模式舍入得尾数0000001E 126M 2^(-7)最终表示的结果为0.5 2^(-8)CAST_ROUND模式舍入得尾数0000001E 126M 2^(-7)最终表示的结果为0.5 2^(-8)CAST_TRUNC模式舍入得尾数0000000E 126M 0最终表示的结果为0.5。float转bfloat16_t的最终饱和行为请见表3。示例2输入inf饱和模式输出约3.39*10^38非饱和模式输出inf。示例3输入-inf饱和模式输出约-3.39*10^38非饱和模式输出-inf。示例4输入nan饱和模式输出0非饱和模式输出nan。输出数据类型为int32_t示例1输入2^22 0.5CAST_RINT模式输出2^22CAST_FLOOR模式输出2^22CAST_CEIL模式输出2^22 1CAST_ROUND模式输出2^22 1CAST_TRUNC模式输出2^22。示例2输入inf输出2^31-1。示例3输入-inf输出-2^31。示例4输入nan输出0。输出数据类型为uint32_t示例1输入2^22 0.5CAST_RINT模式输出2^22CAST_FLOOR模式输出2^22CAST_CEIL模式输出2^22 1CAST_ROUND模式输出2^22 1CAST_TRUNC模式输出2^22。示例2输入inf输出2^32-1。示例3输入-inf输出0。示例4输入nan输出0。输出数据类型为int64_t示例1输入2^22 0.5CAST_RINT模式输出2^22CAST_FLOOR模式输出2^22CAST_CEIL模式输出2^22 1CAST_ROUND模式输出2^22 1CAST_TRUNC模式输出2^22。示例2输入inf输出2^63-1。示例3输入-inf输出-2^63。示例4输入nan输出0。输出数据类型为uint64_t示例1输入2^22 0.5CAST_RINT模式输出2^22CAST_FLOOR模式输出2^22CAST_CEIL模式输出2^22 1CAST_ROUND模式输出2^22 1CAST_TRUNC模式输出2^22。示例2输入inf输出2^64-1。示例3输入-inf输出0。示例4输入nan输出0。输出数据类型为hifloat8_t将src按照舍入模式取整以hifloat8_t格式溢出默认按照饱和处理存入dst中。示例输入1.75CAST_ROUND模式输出2CAST_HYBRID参考表9输出。输出数据类型为fp8_e4m3fn_t将src按照舍入模式取整以fp8_e4m3fn_t格式溢出默认按照饱和处理存入dst中。示例输入2.5CAST_RINT模式输出2。输出数据类型为fp8_e5m2_t将src按照舍入模式取整以fp8_e5m2_t格式溢出默认按照饱和处理存入dst中。示例输入2.5CAST_RINT模式输出2。输入数据类型为half输出数据类型为half将src按照舍入模式取整仍以half格式存入dst中。示例输入0.5CAST_RINT模式输出0.0CAST_FLOOR模式输出0.0CAST_CEIL模式输出1.0CAST_ROUND模式输出1.0CAST_TRUNC模式输出0.0。输出数据类型为float不存在精度转换问题舍入模式不起作用。示例1输入1.5 - 2^(-10)输出1.5 - 2^(-10)。half转float仅支持非饱和模式。示例2输入inf输出inf。示例3输入-inf输出-inf。示例4输入nan输出nan。输出数据类型为bfloat16_t示例1输入0.5 2^(-9) 2^(-11)写成half的表示形式2^(-1) * (1 2^(-8) 2^(-10))因此E -1 15 14M 2^(-8) 2^(-10)。bfloat16_t的指数位可以表示出2^(-1)E -1 127 126但bfloat16_t只有7bit尾数位因此要进行舍入。CAST_RINT模式舍入得尾数0000001E 126M 2^(-7)最终表示的结果为0.5 2^(-8)CAST_FLOOR模式舍入得尾数0000000E 126M 0最终表示的结果为0.5CAST_CEIL模式舍入得尾数0000001E 126M 2^(-7)最终表示的结果为0.5 2^(-8)CAST_ROUND模式舍入得尾数0000001E 126M 2^(-7)最终表示的结果为0.5 2^(-8)CAST_TRUNC模式舍入得尾数0000000E 126M 0最终表示的结果为0.5。half转bfloat16_t的最终饱和行为请见表4。示例2输入inf饱和模式输出约3.39*10^38非饱和模式输出inf。示例3输入-inf饱和模式输出约-3.39*10^38非饱和模式输出-inf。示例4输入nan饱和模式输出0非饱和模式输出nan。输出数据类型为int32_t示例1输入2^9 0.5CAST_RINT模式输出2^9CAST_FLOOR模式输出2^9CAST_CEIL模式输出2^9 1CAST_ROUND模式输出2^9 1CAST_TRUNC模式输出2^9。示例2输入inf输出2^31-1。示例3输入-inf输出-2^31。示例4输入nan输出0。输出数据类型为uint32_t示例1输入2^9 0.5CAST_RINT模式输出2^9CAST_FLOOR模式输出2^9CAST_CEIL模式输出2^9 1CAST_ROUND模式输出2^9 1CAST_TRUNC模式输出2^9。示例2输入inf输出2^32-1。示例3输入-inf输出0。示例4输入nan输出0。输出数据类型为hifloat8_t将src按照舍入模式取整以hifloat8_t格式溢出默认按照饱和处理存入dst中。示例输入1.75CAST_ROUND模式输出2CAST_HYBRID模式参考表10输出。输入数据类型为bfloat16_t输出数据类型为bfloat16_t将src按照舍入模式取整仍以bfloat16_t格式存入dst中。示例输入0.5CAST_RINT模式输出0.0CAST_FLOOR模式输出0.0CAST_CEIL模式输出1.0CAST_ROUND模式输出1.0CAST_TRUNC模式输出0.0。输出数据类型为float不存在精度转换问题舍入模式不起作用。示例1输入1.5 - 2^(-6)输出1.5 - 2^(-6)。bfloat16_t转float仅支持非饱和模式。示例2输入inf输出inf。示例3输入-inf输出-inf。示例4输入nan输出nan。输出数据类型为half示例1输入1.5 - 2^(-6)输出1.5 - 2^(-6)。bfloat16转half的最终饱和行为请见表3。示例2输入inf饱和模式输出65504非饱和模式输出inf。示例3输入-inf饱和模式输出-65504非饱和模式输出-inf。示例4输入nan饱和模式输出0非饱和模式输出nan。输出数据类型为int32_t示例1输入2^6 0.5CAST_RINT模式输出2^6CAST_FLOOR模式输出2^6CAST_CEIL模式输出2^6 1CAST_ROUND模式输出2^6 1CAST_TRUNC模式输出2^6。示例2输入inf输出2^31-1。示例3输入-inf输出-2^31。示例4输入nan输出0。输出数据类型为uint32_t示例1输入2^6 0.5CAST_RINT模式输出2^6CAST_FLOOR模式输出2^6CAST_CEIL模式输出2^6 1CAST_ROUND模式输出2^6 1CAST_TRUNC模式输出2^6。示例2输入inf输出2^32-1。示例3输入-inf输出0。示例4输入nan输出0。输入数据类型为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。输入数据类型为int32_t输出数据类型为float示例1输入2^25 3写成float的表示形式2^25 * (1 2^(-24) 2^(-25))要求E 25 127 152M 2^(-24) 2^(-25)。由于float只有23bit尾数位因此要进行舍入。CAST_RINT模式舍入得尾数00000000000000000000001E 152M 2^(-23)最终表示的结果为2^25 4CAST_FLOOR模式舍入得尾数00000000000000000000000E 152M 0最终表示的结果为2^25CAST_CEIL模式舍入得尾数00000000000000000000001E 152M 2^(-23)最终表示的结果为2^25 4CAST_ROUND模式舍入得尾数00000000000000000000001E 152M 2^(-23)最终表示的结果为2^25 4CAST_TRUNC模式舍入得尾数00000000000000000000000E 152M 0最终表示的结果为2^25 。输出数据类型为half示例1输入2^12 3写成half的表示形式2^12 *(1 2^(-11) 2^(-12))要求E 12 15 27M 2^(-11) 2^(-12)。由于half只有10bit尾数位因此要进行舍入。CAST_RINT模式舍入得尾数0000000001E 27M 2^(-10)最终表示的结果为2^12 4CAST_FLOOR模式舍入得尾数0000000000E 27M 0最终表示的结果为2^12CAST_CEIL模式舍入得尾数0000000001E 27M 2^(-10)最终表示的结果为2^12 4CAST_ROUND模式舍入得尾数0000000001E 27M 2^(-10)最终表示的结果为2^12 4CAST_TRUNC模式舍入得尾数0000000000E 27M 0最终表示的结果为2^12 。示例2输入2^31 - 1SAT模式返回65504.0NO_SAT模式返回inf。示例3输入-2^31SAT模式返回-65504.0NO_SAT模式返回-inf。输出数据类型为bfloat16_t示例1输入2^9 3写成bfloat16_t的表示形式2^9 *(1 2^(-8) 2^(-9))要求E 9 127 136M 2^(-8) 2^(-9)。由于bfloat16_t只有7bit尾数位因此要进行舍入。CAST_RINT模式舍入得尾数0000001E 136M 2^(-7)最终表示的结果为2^9 4CAST_FLOOR模式舍入得尾数0000000E 136M 0最终表示的结果为2^9CAST_CEIL模式舍入得尾数0000001E 136M 2^(-7)最终表示的结果为2^9 4CAST_ROUND模式舍入得尾数0000001E 136M 2^(-7)最终表示的结果为2^9 4CAST_TRUNC模式舍入得尾数0000000E 136M 0最终表示的结果为2^9 。输入数据类型为uint32_t输出数据类型为float示例1输入2^25 3写成float的表示形式2^25 * (1 2^(-24) 2^(-25))要求E 25 127 152M 2^(-24) 2^(-25)。由于float只有23bit尾数位因此要进行舍入。CAST_RINT模式舍入得尾数00000000000000000000001E 152M 2^(-23)最终表示的结果为2^25 4CAST_FLOOR模式舍入得尾数00000000000000000000000E 152M 0最终表示的结果为2^25CAST_CEIL模式舍入得尾数00000000000000000000001E 152M 2^(-23)最终表示的结果为2^25 4CAST_ROUND模式舍入得尾数00000000000000000000001E 152M 2^(-23)最终表示的结果为2^25 4CAST_TRUNC模式舍入得尾数00000000000000000000000E 152M 0最终表示的结果为2^25 。输出数据类型为half示例1输入2^12 3写成half的表示形式2^12 *(1 2^(-11) 2^(-12))要求E 12 15 27M 2^(-11) 2^(-12)。由于half只有10bit尾数位因此要进行舍入。CAST_RINT模式舍入得尾数0000000001E 27M 2^(-10)最终表示的结果为2^12 4CAST_FLOOR模式舍入得尾数0000000000E 27M 0最终表示的结果为2^12CAST_CEIL模式舍入得尾数0000000001E 27M 2^(-10)最终表示的结果为2^12 4CAST_ROUND模式舍入得尾数0000000001E 27M 2^(-10)最终表示的结果为2^12 4CAST_TRUNC模式舍入得尾数0000000000E 27M 0最终表示的结果为2^12 。示例2输入2^32 - 1SAT模式返回65504.0NO_SAT模式返回inf。输出数据类型为bfloat16_t示例1输入2^9 3写成bfloat16_t的表示形式2^9 *(1 2^(-8) 2^(-9))要求E 9 127 136M 2^(-8) 2^(-9)。由于bfloat16_t只有7bit尾数位因此要进行舍入。CAST_RINT模式舍入得尾数0000001E 136M 2^(-7)最终表示的结果为2^9 4CAST_FLOOR模式舍入得尾数0000000E 136M 0最终表示的结果为2^9CAST_CEIL模式舍入得尾数0000001E 136M 2^(-7)最终表示的结果为2^9 4CAST_ROUND模式舍入得尾数0000001E 136M 2^(-7)最终表示的结果为2^9 4CAST_TRUNC模式舍入得尾数0000000E 136M 0最终表示的结果为2^9 。输入数据类型为int64_t输出数据类型为float示例1输入2^25 3写成float的表示形式2^25 * (1 2^(-24) 2^(-25))要求E 25 127 152M 2^(-24) 2^(-25)。由于float只有23bit尾数位因此要进行舍入。CAST_RINT模式舍入得尾数00000000000000000000001E 152M 2^(-23)最终表示的结果为2^25 4CAST_FLOOR模式舍入得尾数00000000000000000000000E 152M 0最终表示的结果为2^25CAST_CEIL模式舍入得尾数00000000000000000000001E 152M 2^(-23)最终表示的结果为2^25 4CAST_ROUND模式舍入得尾数00000000000000000000001E 152M 2^(-23)最终表示的结果为2^25 4CAST_TRUNC模式舍入得尾数00000000000000000000000E 152M 0最终表示的结果为2^25 。输入数据类型为uint64_t输出数据类型为float示例1输入2^25 3写成float的表示形式2^25 * (1 2^(-24) 2^(-25))要求E 25 127 152M 2^(-24) 2^(-25)。由于float只有23bit尾数位因此要进行舍入。CAST_RINT模式舍入得尾数00000000000000000000001E 152M 2^(-23)最终表示的结果为2^25 4CAST_FLOOR模式舍入得尾数00000000000000000000000E 152M 0最终表示的结果为2^25CAST_CEIL模式舍入得尾数00000000000000000000001E 152M 2^(-23)最终表示的结果为2^25 4CAST_ROUND模式舍入得尾数00000000000000000000001E 152M 2^(-23)最终表示的结果为2^25 4CAST_TRUNC模式舍入得尾数00000000000000000000000E 152M 0最终表示的结果为2^25 。【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考