Ascend C提供b8~b64(8bit~64bit)四种不同位宽的数据类型,不同位宽对应的数据类型如下表所示。
位宽 |
数据类型 |
|---|---|
b8 |
bool、int8_t、uint8_t、fp4x2_e2m1_t、fp4x2_e1m2_t、hifloat8_t、fp8_e5m2_t、fp8_e4m3fn_t、fp8_e8m0_t、int4x2_t。 |
b16 |
int16_t、uint16_t、half、bfloat16_t。 |
b32 |
int32_t、uint32_t、float、complex32。 |
b64 |
int64_t、uint64_t、double、complex64。 |
为了方便描述这些数据类型,提供如下的数据类型简写:
数据类型简写(位宽从低到高) |
对应数据类型 |
|---|---|
S4 |
int4b_t |
U8 |
uint8_t |
S8 |
int8_t |
U16 |
uint16_t |
S16 |
int16_t |
U32 |
uint32_t |
S32 |
int32_t |
U64 |
uint64_t |
S64 |
int64_t |
FP8_E4M3 |
fp8_e4m3fn_t |
HiF8 |
hifloat8_t |
FP16 |
half |
BF16 |
bfloat16_t |
FP32 |
float |
其中,只有bool、int8_t、uint8_t、int16_t、uint16_t、half、int32_t、uint32_t、float、int64_t、uint64_t这些数据类型支持使用立即数进行赋值和初始化。
示例:
1 2 | int8_t scalar = 1; int32_t valueOut = AscendC::Cast<float, int32_t, AscendC::RoundMode::CAST_ROUND>((float)1); |
产品 |
支持的数据类型 |
|---|---|
Ascend 950PR/Ascend 950DT |
bool、int8_t、uint8_t、fp4x2_e2m1_t、fp4x2_e1m2_t、hifloat8_t、fp8_e5m2_t、fp8_e4m3fn_t、fp8_e8m0_t、int4x2_t、int16_t、uint16_t、half、bfloat16_t、int32_t、uint32_t、float、complex32、int64_t、uint64_t、double、complex64。 |
int8_t、uint8_t、int16_t、uint16_t、int32_t、uint32_t、int64_t、uint64_t、half、bfloat16_t、float、double。 |
|
int8_t、uint8_t、int16_t、uint16_t、int32_t、uint32_t、int64_t、uint64_t、half、bfloat16_t、float、double。 |
|
int8_t、uint8_t、int16_t、uint16_t、int32_t、uint32_t、int64_t、uint64_t、half、float、double。 |
|
int8_t、uint8_t、int16_t、uint16_t、int32_t、uint32_t、int64_t、uint64_t、half、float、double。 |
|
int8_t、uint8_t、int16_t、uint16_t、int32_t、uint32_t、int64_t、uint64_t、half、float、double。 |
|
int8_t、uint8_t、int16_t、uint16_t、int32_t、uint32_t、int64_t、uint64_t、half、float、double。 |
bool类型占8比特,全0时代表false,否则代表true。
整数由符号位(S)和数值部分(M)组成,不同类型的整数在符号位和数值部分的比特分配上有所不同。无符号整数没有符号位,所有比特均用于表示数值。
下图是一个int8_t类型的示例,其符号位占用1位,数值部分占用7位。Sv=1,Mv = 25 + 26,表示的结果为96。下标v表示符号位和数值部分的具体数值。

整数数据类型取值范围见下表。
类型 |
取值范围 |
|---|---|
int4x2_t(int4b_t) |
[-8, 7] |
int8_t |
[-128, 127] |
uint8_t |
[0, 255] |
int16_t |
[-32768, 32767] |
uint16_t |
[0, 65535] |
int32_t |
[-2147483648, 2147483647] |
uint32_t |
[0, 4294967295] |
int64_t |
[-9223372036854775808, 9223372036854775807] |
uint64_t |
[0,18446744073709551615] |
int4x2_t数据类型会将两个独立的四位整形数打包为一个8比特存储单元。
浮点数数据类型的取值范围如下表所示。
类型 |
符号位宽 |
指数位宽 |
尾数位宽 |
取值范围 |
|---|---|---|---|---|
fp4x2_e2m1_t |
1 |
2 |
1 |
[-6, 6] |
fp4x2_e1m2_t |
1 |
1 |
2 |
[-7 * 2-2, 7 * 2-2] |
fp8_e8m0_t |
0 |
8 |
0 |
[2-127, 2127] |
fp8_e5m2_t |
1 |
5 |
2 |
[213 - 216, 216 - 213] |
fp8_e4m3fn_t |
1 |
4 |
3 |
[26 - 29, 29 - 26] |
half |
1 |
5 |
10 |
[25 - 216, 216 - 25] |
bfloat16_t |
1 |
8 |
7 |
[2120 - 2128, 2128 - 2120] |
float |
1 |
8 |
23 |
[2104 - 2128, 2128 - 2104] |
double |
1 |
11 |
52 |
[2971 - 21024, 21024 - 2971] |
fp4x2_e2m1_t和fp4x2_e1m2_t数据类型会将两个独立的四位浮点数打包为一个8比特存储单元。
浮点数由符号位(S)、指数(E)、尾数(M)三个部分组成,不同类型的浮点数,三个部分所占的比特数可能不同。
下图是一个fp4x2_e2m1_t类型的示例,其符号位占用1位,指数位占用2位,尾数位占用1位。

下图是一个fp4x2_e1m2_t类型的示例,其符号位占用1位,指数位占用1位,尾数位占用2位。

下图是一个fp8_e8m0_t类型的示例,其没有符号位和尾数位,指数位占用8位。

下图是一个fp8_e5m2_t类型的示例,其符号位占用1位,指数占用5位,尾数占用2位,表示的结果为 (-1)^0 × (2 - 0.25) × 2^(30 -15)=1.75 × 2^15。

fp8_e5m2_t的特殊值bit位表示如下:

下图是一个fp8_e4m3fn_t类型的示例,其符号位占用1位,指数占用4位,尾数占用3位,表示的结果为 (-1)^1 × 2^-3 × 2^-6。

fp8_e4m3fn_t的特殊值bit位表示如下:

hifloat8_t类型相对其他类型增加了指数位宽控制字段D,用于指示指数位和尾数位的编码方式。
hifloat8_t类型根据点域的不同,有不同的编码方式,下面一一列出。符号、指数和尾数分别缩写成‘S’,‘E’和‘M’。

下图示例中,其符号位占用1位,指数占用2位,尾数占用3位,D字段为2比特b01,Sv=1,Ev=3,Mv = 2-1 + 2-2,表示的结果为14。下标v表示各部分的具体数值。

hifloat8_t类型的取值范围如下表所示:
符号位宽 |
指数位宽控制字段位宽 |
指数位宽 |
尾数位宽 |
指数位宽控制字段取值 |
符号取值范围(Sv) |
指数取值范围(Ev) |
尾数取值范围(Mv) |
取值范围计算公式 |
|---|---|---|---|---|---|---|---|---|
1 |
4 |
0 |
3 |
4'b0000 |
±1 |
- |
[0, 7] |
Sv * 2Mv - 23 |
1 |
4 |
0 |
3 |
4'b0001 |
±1 |
0 |
[0, 7 * 2-3] |
Sv * 2Ev * (1 + Mv) |
1 |
3 |
1 |
3 |
4'b001 |
±1 |
±1 |
[0, 7 * 2-3] |
|
1 |
2 |
2 |
3 |
2'b01 |
±1 |
±[2, 3] |
[0, 7 * 2-3] |
|
1 |
2 |
3 |
2 |
2'b10 |
±1 |
±[4, 7] |
[0, 3 * 2-2] |
|
1 |
2 |
4 |
1 |
2'b11 |
±1 |
±[8, 15] |
[0, 2-1] |
hifloat8_t特殊值bit位表示如下:

hifloat8_t数据类型计算公式如下:
s_bit_val为1表示负数,s_bit_val为0表示非负数。

由Es、Em组成。
D 值 |
Es 值范围 |
Em 值范围 |
|---|---|---|
3b001 |
0-1 |
- |
2b01 |
0-1 |
10~11 |
2b10 |
0-1 |
100~111 |
2b11 |
0-1 |
1000~1111 |
es_bit_val值表示E的最高位,用于计算Ev的符号值,例如E为0b1100,则es_bit_val值为最高位1,例如E为0b011,则es_bit_val为最高位0。
Es计算公式:

Em计算公式如下,Emi表示Em每个bit位的值(0或1),D表示点域值,参考表5。

Ev计算公式:

Mv计算公式,M表示位数值,bitwidth of M表示M的bit宽度大小,参考表5。


Subnormal模式,由Sv、Mv组成。


下图是一个half类型的示例,其符号位占用1位,指数占用5位,尾数占用10位。Sv=1,Ev=15,Mv = 2-1 + 2-2,表示的结果为1.75。下标v表示各部分的具体数值。

half特殊值bit位表示如下:

下图是一个bfloat16_t数据类型的示例,其符号位占用1位,指数占用8位,尾数占用7位。

bfloat16_t特殊值bit位表示如下:

下图是一个float类型的示例,其符号位占用1位,指数占用8位,尾数占用23位。

float特殊值bit位表示如下:

Ascend C提供了复数数据类型,complex32和complex64。
定义是:
using complex32 = AscendC::Complex<half>; using complex64 = AscendC::Complex<float>;
其中Complex定义结构见complex32/complex64。
complex32即实部和虚部都是half类型的复数,
complex64即实部和虚部都是float类型的复数。
示例:
complex32 value0(1, 2); value0将代表实部为1,虚部为2的复数,即1+2j complex32 value1(3); value1将代表实部为3,虚部为0的复数,即3+0j complex64 value2 = 4; value2将代表实部为4,虚部为0的复数,即4+0j
当前仅Ascend 950PR/Ascend 950DT支持。