Распределение структуры OpenCL на GPU приводит к мусору - PullRequest
0 голосов
/ 02 июля 2018

Я определил следующую структуру в коде хоста 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.

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Я могу только посоветовать не использовать структуры в OpenCL, не только из-за проблем выравнивания и заполнения, но также и доступ к памяти будет медленнее с массивами структур, поскольку обычно в любой момент времени доступ только к одному полю оставляет большой дыры в кешах памяти.

Поскольку это всего лишь одна структура, почему бы просто не указать ей два аргумента для ядра? Я знаю, что это больше кода, но я боюсь, что это только разумный способ сделать это.

0 голосов
/ 02 июля 2018

Кажется, может быть проблема с выравниванием. int3, вероятно, имеет 16-байтовое выравнивание, тогда как тип C cl_int3 может иметь только 4-байтовое выравнивание. Поэтому ядро ​​будет искать его по смещению 16, тогда как процессор предоставляет его по смещению 4.

Хорошей проверкой будет распечатка sizeof(MyNode) на хосте и ядре. Если они расходятся, я предлагаю попробовать явное количество аннотаций заполнения или выравнивания для полей структуры.

...