Declspec A Struct,在创建缓冲区以发送到 OpenCL 内核时

Posted

技术标签:

【中文标题】Declspec A Struct,在创建缓冲区以发送到 OpenCL 内核时【英文标题】:Declspec A Struct, when Creating a buffer to send into OpenCL kernel 【发布时间】:2016-03-08 21:00:35 【问题描述】:

我尝试通过论坛搜索此内容,但找不到任何内容。我想将一个结构传递给我的 OpenCL 文件,但似乎无法理解 declspec_align 函数。基本上,我有两个结构,这就是我尝试这样做的方式:

struct 2Floats 
  float x, y;


_declspec(align(8)) struct pos 
    _declspec(align(8)) 2Floats posi;

但这似乎没有正确传递,我只是想知道是否有人可以告诉我 Id 传递了多少字节?我以为浮点数是 4,但似乎我错了。

【问题讨论】:

您要调用 OpenCL 中的哪个 api? 【参考方案1】:

听起来您可能想要做的是在 16 位字节边界对齐数据。应该是这样的:

_declspec(align(16)) struct pos 
    2Floats posi;

请注意,数字不是数据的大小,而是您需要的对齐方式。在幕后,我确信 OpenCL 正在尝试使用一些需要内存对齐的 SIMD 操作。如果您可以提供您尝试调用的函数的名称,我相信文档说明了必要的对齐方式。大多数 SIMD 操作需要在 16 位边界上对齐。

再一次,因为数字询问的是字节边界而不是数据的大小,所以 2float 有多大并不重要。但是,它们是两个 32 位浮点数,因此是 8 个字节。

【讨论】:

以上是关于Declspec A Struct,在创建缓冲区以发送到 OpenCL 内核时的主要内容,如果未能解决你的问题,请参考以下文章

struct.unpack() struct.error: unpack 需要 124 字节的缓冲区

c# - 如何调用分配输出缓冲区以在c#中返回数据的非托管c++函数?

Python 可写缓冲区/内存视图到数组/字节数组/ctypes 字符串缓冲区

如何在 C# struct 中声明和使用固定大小的字符缓冲区

struct-计算机学习日志

生成一个使用协议缓冲区的 DLL