我需要帮助理解OpenCL缓冲区中的数据对齐

Mic*_*lle 3 opencl

鉴于以下结构

typedef struct
{
   float3 position;
   float8 position1;
} MyStruct;
Run Code Online (Sandbox Code Playgroud)

我正在创建一个缓冲区,将其作为指向内核的指针传递,缓冲区将具有先前的缓冲区格式.

我知道在写入三个浮点数之后我要在缓冲区中添加4个字节以获得下一个2的幂(16个字节)但我不明白为什么我要在写入字节之前另外添加16个字节位置1.否则我在position1中得到错误的值.

有人能解释一下为什么吗?

Yan*_*ier 5

float8是8个浮点数的向量,每个浮点数是4个字节.这使得大小为32字节.根据OpenCL 1.2规范的 6.1.5节,类型对齐,类型始终与其大小一致; 所以float8必须是32字节对齐.同一部分还告诉我们float3需要4个字.此外,由于结构的sizeof被安排为允许结构的数组,因此它不会从重新排序这些特定字段中缩小.在更复杂的结构上,您可以通过将较小的字段保持在一起来节省空间.

  • 是.并且该对齐要求也适用于struct和buffer,这就是sizeof(struct MyStruct)为64而不是48的原因. (4认同)
  • 嗨@Yann,谢谢你的快速回复,但是现在你给我的解释我有一个疑问:当你说float8是32字节对齐时,它意味着在缓冲区中它必须位于32字节的任何偏移倍数? (3认同)