int4与int2数组内存布局及单字节存储值疑问咨询
一、GPU扩展类型 int4/int2 的内存布局
在NVIDIA CUDA、AMD HIP等GPU编程环境中,int4和int2是编译器扩展的向量类型,本质是打包的多元素整数结构:
int2:包含2个32位有符号整数,内存中按元素顺序连续存储,总占用8字节(2×4字节)。例如int2 vec = {a, b},内存从低地址到高地址依次存储a的4字节、b的4字节。int4:包含4个32位有符号整数,内存中按元素顺序连续存储,总占用16字节(4×4字节)。例如int4 vec = {a, b, c, d},内存顺序为a→b→c→d的4字节块依次排列。
对于数组int4 M[2],内存布局是两个完整的int4实例连续排布:M[0]的16字节数据在前,M[1]的16字节数据在后,无额外填充。
二、示例代码的字节值分析
给出的代码如下:
int4 M[2]; M[0]=0xA; M[1]=0x5;
在GPU编译器中,给向量类型赋值单个整数时,会自动将该值广播到向量的所有元素:
- M[0]的4个int元素(x/y/z/w)均被设为
0xA - M[1]的4个int元素均被设为
0x5
GPU平台普遍采用小端字节序,单个32位int的存储顺序为低字节在前、高字节在后。以0xA为例,这个int值的二进制是0x0000000A,在内存中对应的4字节序列为0x0A 0x00 0x00 0x00。
因此,M数组的字节流(低地址到高地址)片段为:0x0A, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, ..., 0x00, 0x00, 0x00, 0x0A, 0x05, 0x00, 0x00, 0x00, ...
针对问题中“包含M[0]和M[1]的单个字节中,预期值应为0xA5还是0x5A”的疑问:
不存在单个字节同时包含M[0]和M[1]的内容。如果是指M[0]的最后一个字节与M[1]的第一个字节组成的连续字节对,则顺序是0x00(M[0]末尾)→0x05(M[1]开头);如果是指M[0]和M[1]各自元素的低字节,M[0]的相关字节是0x0A,M[1]的是0x05,二者不会在同一个字节中出现。
如果您是误将int4理解为4位整数类型(而非4分量向量),那需要明确:GPU编程中的int4是4个32位int的向量,并非4位宽的整数类型。
内容的提问来源于stack exchange,提问作者B Abali

