Я определил следующую структуру в коде хоста 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
из определений структуры хоста и устройства, он печатается правильно.
что происходит здесь ?
Я работаю с VS2015 с конфигурацией x64 и использую OpenCL 1.2 на графическом процессоре NVIDIA.