Declspec 一个结构,在创建缓冲区以发送到 OpenCL 内核时
Declspec A Struct, when Creating a buffer to send into OpenCL kernel
我尝试通过论坛搜索此内容,但找不到任何内容。我想将一个结构传递给我的 OpenCL 文件,但似乎无法理解 declspec_align 函数。基本上,我有两个结构,这就是我尝试这样做的方式:
struct 2Floats {
float x, y;
}
_declspec(align(8)) struct pos {
_declspec(align(8)) 2Floats posi;
}
但这似乎没有正确传递,我只是想知道是否有人可以告诉我传递了多少字节?我以为浮点数是 4,但我好像错了。
听起来您可能想要做的是将数据对齐到 16 位字节边界。那应该是这样的:
_declspec(align(16)) struct pos {
2Floats posi;
}
请注意,数字不是数据的大小,而是您需要的对齐方式。在幕后,我确信 OpenCL 正在尝试使用一些需要内存对齐的 SIMD 操作。如果您可以提供您尝试调用的函数的名称,我相信文档会说明必要的对齐方式。大多数 SIMD 操作需要在 16 位边界上对齐。
同样,由于数字询问的是字节边界而不是数据的大小,因此 2float 有多大并不重要。但是,它们是两个 32 位浮点数,所以 8 个字节。
我尝试通过论坛搜索此内容,但找不到任何内容。我想将一个结构传递给我的 OpenCL 文件,但似乎无法理解 declspec_align 函数。基本上,我有两个结构,这就是我尝试这样做的方式:
struct 2Floats {
float x, y;
}
_declspec(align(8)) struct pos {
_declspec(align(8)) 2Floats posi;
}
但这似乎没有正确传递,我只是想知道是否有人可以告诉我传递了多少字节?我以为浮点数是 4,但我好像错了。
听起来您可能想要做的是将数据对齐到 16 位字节边界。那应该是这样的:
_declspec(align(16)) struct pos {
2Floats posi;
}
请注意,数字不是数据的大小,而是您需要的对齐方式。在幕后,我确信 OpenCL 正在尝试使用一些需要内存对齐的 SIMD 操作。如果您可以提供您尝试调用的函数的名称,我相信文档会说明必要的对齐方式。大多数 SIMD 操作需要在 16 位边界上对齐。
同样,由于数字询问的是字节边界而不是数据的大小,因此 2float 有多大并不重要。但是,它们是两个 32 位浮点数,所以 8 个字节。