gpt4 book ai didi

c++ - OpenCL 在 GPU 上分配结构导致垃圾

转载 作者:太空宇宙 更新时间:2023-11-04 12:46:51 25 4
gpt4 key购买 nike

我在 C++ 主机代码中定义了以下结构:

    struct __declspec(align(16)) MyNode {
cl_uchar mData;
cl_int3 mPos;
};

在 OpenCL 中:

struct  __attribute__((aligned(16))) MyNode {
uchar mData;
int3 mPos;
};

现在从主机代码我调用:

MyNode node= {0};
node.mPos.x = 1;
node.mPos.y = 2;
node.mPos.z = 3;

cl_mem clnode_mem = clCreateBuffer(
mOpenCLctx,
CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR,
sizeof(MyNode),
&node,
&err);

clSetKernelArg(m_kernel_test, 0, sizeof(cl_mem), &clnode_mem));

然后我在 GPU 上调用一个测试内核,定义为:

__kernel void test(__global MyNode* node)
{
printf("pos = %d,%d,%d\n",
node->mPos.x,
node->mPos.y,
node->mPos.z);
}

但我看到的输出是 pos = 0,0,0,如果我从主机和设备结构定义中删除 mData 成员,那么它正在打印正确。这里发生了什么 ?

我正在使用具有 x64 配置的 VS2015 进行构建,并在 NVIDIA GPU 上运行 OpenCL 1.2。

最佳答案

似乎是对齐问题。 int3 可能有 16 字节对齐,而 C 类型 cl_int3 可能只有 4 字节对齐。所以内核会在偏移量 16 处寻找它,而 CPU 在偏移量 4 处提供它。

一个好的完整性检查是在主机和内核上打印 sizeof(MyNode)。如果出现分歧,我建议尝试对结构字段使用显式填充量或对齐注释。

关于c++ - OpenCL 在 GPU 上分配结构导致垃圾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51132561/

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