【发布时间】:2018-12-10 11:14:29
【问题描述】:
我在 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。
【问题讨论】: