华为/CANN:内置数据类型

华为/CANN:内置数据类型
内置数据类型【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkitSIMD与SIMT混合编程提供了一系列适用于Device侧的数据类型包括标量、短向量和dim3结构体。标量类型标量数据类型覆盖布尔型bool、整型uint8/int8到uint64/int64、浮点型float8_e4m3_t、float8_e5m2_t、hifloat8_t、half、bfloat16_t、float。布尔型bool全0代表false否则代表true占用8bit内存取值为true或false。整型uint8_tunsigned char占用8bit内存取值范围为[0, 255]。int8_tsigned char占用8bit内存取值范围为[-128, 127]。uint16_tunsigned short占用16bit内存取值范围为[0, 65535]。int16_tsigned short占用16bit内存取值范围为[-32768, 32767]。uint32_tunsigned int占用32bit内存取值范围为[0, 4294967295]。int32_tsigned int占用32bit内存取值范围为[-2147483648, 2147483647]。uint64_tunsigned long占用64bit内存取值范围为[0, 18446744073709551615]。int64_tsigned long占用64bit内存取值范围为[-9223372036854775808, 9223372036854775807]。浮点型float8_e4m3_t符号位宽1指数位宽4尾数位宽3占用8bit内存取值范围为[2^6 - 2^9, 2^9 - 2^6]。float8_e5m2_t符号位宽1指数位宽5尾数位宽2占用8bit内存取值范围为[2^13 - 2^16, 2^16 - 2^13]。hifloat8_t符号位宽1点域位宽2指数与尾数位宽由点域编码决定占用8bit内存点域编码决定数据精度与取值范围。half符号位宽1指数位宽5尾数位宽10占用16bit内存取值范围为[2^5 - 2^16, 2^16 - 2^5]。bfloat16_t符号位宽1指数位宽8尾数位宽7占用16bit内存取值范围为[2^120 - 2^128, 2^128 - 2^120]。float符号位宽1指数位宽8尾数位宽23占用32bit内存取值范围为[2^104 - 2^128, 2^128 - 2^104]。短向量类型短向量类型是一种在SIMD与SIMT混合编程模型中提供的固定长度向量类型用于简化向量数据的表示和操作。该类型适用于处理包含多个分量的数据如坐标、颜色、向量运算等。内存特点紧凑存储短向量类型在内存中连续存储无填充。对齐要求遵循自然对齐原则提升访问效率。跨线程共享可存储在Unified Buffer中供线程块内共享。直接内存访问支持直接从Global Memory加载和存储。应用场景颜色处理RGB/RGBA颜色值的操作。向量运算物理模拟、图形渲染中的向量计算。数据打包将多个相关值打包处理。内存访问优化通过向量化提升内存带宽利用率。短向量变量访问变量通过.x、.y、.z、.w的方式进行访问。当前已支持的短向量数据类型如下表1短向量数据类型元素数据类型Vector X2Vector X4unsigned charuchar2uchar4signed charchar2char4unsigned short (16bit)ushort2ushort4signed short (16bit)short2short4unsigned intuint2uint4signed intint2int4unsigned long long (64bit)ulonglong2ulonglong4signed long long (64bit)longlong2longlong4unsigned long (64bit)ulong2ulong4signed long (64bit)long2long4浮点型1符号位2指数位1尾数位float4_e2m1x2_t-浮点型1符号位1指数位2尾数位float4_e1m2x2_t-浮点型1符号位4指数位3尾数位float8_e4m3x2_t-浮点型1符号位5指数位2尾数位float8_e5m2x2_t-浮点型hif8hifloat8x2_t-浮点型1符号位5指数位10尾数位half2-浮点型1符号位8指数位7尾数位bfloat16x2_t-浮点型1符号位8指数位23尾数位float2float4每种短向量的内存大小与地址对齐大小如下表2短向量数据类型内存大小数据类型内存大小字节地址对齐字节char2, uchar222char4, uchar444short2, ushort244short4, ushort488int2, uint288int4, uint41616long2, ulong288long4, ulong41616longlong2, ulonglong21616longlong4, ulonglong43232float288float41616float4_e2m1x2_t, float4_e1m2x2_t11float8_e4m3x2_t, float8_e5m2x2_t, hifloat8x2_t22half2, bfloat16x2_t44SIMD与SIMT混合编程提供了用于构造短向量的函数。这些构造函数可以将固定个数的同类型标量值组合成一个短向量类型如make_int2函数功能为将两个int类型的标量作为输入组合成一个int2类型的短向量类型作为输出。函数列表如下make_int2inline int2 make_int2(int x, int y)make_int4inline int4 make_int4(int x, int y, int z, int w)make_uint2inline uint2 make_uint2(unsigned int x, unsigned int y)make_uint4inline uint4 make_uint4(unsigned int x, unsigned int y, unsigned int z, unsigned int w)make_ulonglong2inline ulonglong2 make_ulonglong2(unsigned long long int x, unsigned long long int y)make_ulonglong4inline ulonglong4 make_ulonglong4(unsigned long long int x, unsigned long long int y, unsigned long long int z, unsigned long long int w)make_longlong2inline longlong2 make_longlong2(long long int x, long long int y)make_longlong4inline longlong4 make_longlong4(long long int x, long long int y, long long int z, long long int w)make_ulong2inline ulong2 make_ulong2(unsigned long int x, unsigned long int y)make_ulong4inline ulong4 make_ulong4(unsigned long int x, unsigned long int y, unsigned long int z,unsigned long int w)make_long2inline long2 make_long2(long int x, long int y)make_long4inline long4 make_long4(long int x, long int y, long int z, long int w)make_float2inline float2 make_float2(float x, float y)make_float4inline float4 make_float4(float x, float y, float z, float w)make_short2inline short2 make_short2(short x, short y)make_short4inline short4 make_short4(short x, short y, short z, short w)make_ushort2inline ushort2 make_ushort2(unsigned short x, unsigned short y)make_ushort4inline ushort4 make_ushort4(unsigned short x, unsigned short y, unsigned short z,unsigned short w)make_uchar2inline uchar2 make_uchar2(unsigned char x, unsigned char y)make_uchar4inline uchar4 make_uchar4(unsigned char x, unsigned char y, unsigned char z, unsigned char w)make_char2inline char2 make_char2(signed char x, signed char y)make_char4inline char4 make_char4(signed char x, signed char y, signed char z, signed char w)make_half2inline half2 make_half2(half x, half y)make_bfloat162inline bfloat16x2_t make_bfloat162(bfloat16_t x, bfloat16_t y)使用短向量构造函数需要包含simt_api/vector_functions.h调用示例如下#include simt_api/vector_functions.h __simt_vf__ __launch_bounds__(1024) inline void kernel_make_int2(__gm__ int2* dst, __gm__ int* x, __gm__ int* y) { int idx threadIdx.x blockIdx.x * blockDim.x; dst[idx] make_int2(x[idx], y[idx]); }dim3用于指定和获取线程网格Grid、线程块Thread Block在x、y、z维度上的内置结构体。dim3由3个无符号整数组成结构体定义为{dimx, dimy, dimz}用于指定3个不同维度的大小三维总数为dimx * dimy * dimz。开发者可以通过如下方式创建dim3结构。dim3(x); // 创建一维结构dimy和dimz为默认值1 dim3(x, y); // 创建二维结构dimz为默认值1 dim3(x, y, z); // 创建三维结构【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考