gpt4 book ai didi

c++ - OpenCL 结构对齐错误

转载 作者:搜寻专家 更新时间:2023-10-31 02:02:21 24 4
gpt4 key购买 nike

我在 OpenCL 中对齐主机和设备之间的结构时遇到了麻烦。我在主机和设备上定义了许多自定义结构,除了一个之外,它们似乎都运行良好。

我正在发送数组中的两个结构。第一个结构 (sObject[0]) 中的所有值都在设备中被正确读取,但第二个 (sObject[1]) 正在以一种看似损坏的方式读取,其中所有值都混淆了,有些值丢失了。

根据我的阅读,这可能是数据对齐的问题,主机和设备可能具有不同的类型分配或填充,但我已经验证主机和设备上的数据类型具有相同的大小,并且我尝试使用对齐方式,例如 #pragma pack(8)__attribute__ ((aligned (128)))__attribute__ ((packed)) 虽然我不确定它们是否能正确使用编译器 (VS2017)。

这是主机和设备上的结构代码:

主持人:

typedef struct _cl_tag_sObject {
cl_double3 m_vCenter;
cl_double3 m_vBounds1;
cl_double3 m_vBounds2;
cl_double m_dRadius;
cl_bool m_type;
} sObject;

设备:

typedef struct _cl_tag_sObject {
double3 m_vCenter;
double3 m_vBounds1;
double3 m_vBounds2;
double m_dRadius;
bool m_type;
} sObject;

以下是主机上分配的值和从设备读取的值:

主持人:

m_vCenter = (0,-100.5,0)
m_vBounds1 = (2,2,2)
m_vBounds2 = (3,3,3)
m_dRadius = 100
m_type = 0

设备:

m_vCenter = (0,0,2)
m_vBounds1 = (2,0,3)
m_vBounds2 = (3,0,100)
m_dRadius = 1
m_type = 0

似乎值 -100.5 被省略,(2,2,2)(3,3,3) 中的中间值 正在取代填充,尽管我是 OpenCL 的新手并且不确定这个过程实际上是如何工作的。

是什么导致了这个问题,如何解决?

谢谢。

最佳答案

WRT 结构包装:__attribute__ ((packed))在 GCC 和 LLVM 上的结构元素之间导致零填充。我不知道您的设备的实现是否使用它们。我几乎没有使用 VS 的经验,但我认为 #pragma pack(1)是您在主机端获得零填充所需要的。

除了包装,您还需要注意 cl_<type>3类型定义为 cl_<type>4 CL/cl_platform.h header 中的类型。所以在主机方面,它们本质上是相同的。

所以即使打包,你的结构也有 cl_double4 和 4 个元素,并且在主机内存中应该看起来像这样(转换为 double 组):

0 100.5 0 0 | 2 2 2 0 | 3 3 3 0 | 100

怀疑您设备的编译器会忽略主机约定并为 double3 使用真正的 3 元素 vector 。您可以通过将设备端结构更改为使用 double4 来简单地进行验证:

    double4 m_vCenter;
double4 m_vBounds1;
double4 m_vBounds2;

不幸的是,结构在 OpenCL 中是一个灰色区域。最好避免在结构中使用 3 元素 vector 。

关于c++ - OpenCL 结构对齐错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57364066/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com