开发者
资源

内置数据类型

数据类型列表

Ascend C提供b8~b64(8bit~64bit)四种不同位宽的数据类型,不同位宽对应的数据类型如下表所示。

表1 不同位宽对应的数据类型

位宽

数据类型

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);

数据类型的产品支持情况

产品

支持的数据类型

Atlas 350 加速卡

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。

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

int8_t、uint8_t、int16_t、uint16_t、int32_t、uint32_t、int64_t、uint64_t、half、bfloat16_t、float、double。

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

int8_t、uint8_t、int16_t、uint16_t、int32_t、uint32_t、int64_t、uint64_t、half、bfloat16_t、float、double。

Atlas 200I/500 A2 推理产品

int8_t、uint8_t、int16_t、uint16_t、int32_t、uint32_t、int64_t、uint64_t、half、float、double。

Atlas 推理系列产品AI Core

int8_t、uint8_t、int16_t、uint16_t、int32_t、uint32_t、int64_t、uint64_t、half、float、double。

Atlas 推理系列产品Vector Core

int8_t、uint8_t、int16_t、uint16_t、int32_t、uint32_t、int64_t、uint64_t、half、float、double。

Atlas 训练系列产品

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表示符号位和数值部分的具体数值。

整数数据类型取值范围见下表。

表2 整数数据类型取值范围

类型

取值范围

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比特存储单元。

浮点数

浮点数数据类型的取值范围如下表所示。

表3 浮点数据类型

类型

符号位宽

指数位宽

尾数位宽

取值范围

fp4x2_e2m1_t

1

2

1

[-6, 6]

fp4x2_e1m2_t

1

1

2

[-7 * 2-2, 7 * 2-2]

fp8_e8m0_t

1

8

0

[2-127, 2-127]

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

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

  • fp4x2_e1m2_t

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

  • fp8_e8m0_t(fp8_e8m0_t二进制由bfloat16类型舍弃符号位,小数位得到)

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

  • fp8_e5m2_t

    下图是一个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

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

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

  • hifloat8_t

    hifloat8_t类型相对其他类型增加了指数位宽控制字段D,用于指示指数位和尾数位的编码方式。

    hifloat8_t类型根据点域的不同,有不同的编码方式,下面一一列出。符号、指数和尾数分别缩写成‘S’,‘E’和‘M’。

    图1 S、E、M在不同点域D值下的bit位分布

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

    hifloat8_t类型的取值范围如下表所示:

    表4 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数据类型计算公式如下:

    • 符号位Sv

      s_bit_val为1表示负数,s_bit_val为0表示非负数。

    • 指数位Ev

      由Es、Em组成。

      表5 不同D域值,Es,Em bit大小不同

      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

    • 在Normal和Subnormal模式下,浮点数的取值计算公式不同:

      Normal模式:由Sv、Ev、Mv组成。

      Subnormal模式,由Sv、Mv组成。

  • half

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

    half特殊值bit位表示如下:

  • bfloat16_t

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

    bfloat16_t特殊值bit位表示如下:

  • float

    下图是一个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

当前仅昇腾910_95 AI处理器支持。