内置数据类型

数据类型列表

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

数据类型的产品支持情况

产品

支持的数据类型

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。

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

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)三个部分组成,不同类型的浮点数,三个部分所占的比特数可能不同。

复数

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支持。