Использование async_work_group_copy с пользовательским типом данных

Мне нужно скопировать некоторые данные из __global в __local в openCL, используя async_work_group_copy. Проблема в том, что я не использую встроенный тип данных.

Фрагмент кода того, что я пробовал, выглядит следующим образом:

typedef struct Y
{
    ...
} Y;

typedef struct X
{
    Y y[MAXSIZE];
} X;

kernel void krnl(global X* restrict x){ 
    global const Y* l = x[a].y;

    local Y* l2;

    size_t sol2 = sizeof(l);

    async_work_group_copy(l2, l, sol2, 0);
}

где "а" это просто вектор int. Этот код не работает, особенно потому, что gen_type не является встроенным. В спецификации (1.2) говорится:

Мы используем имя общего типа gentype, чтобы указать встроенные типы данных... как тип аргументов, если не указано иное.

так как я могу иначе указать этот тип данных?

1 ответ

Решение

OpenCL async_work_group_copy() предназначен для копирования N элементов базового типа данных. Однако он на самом деле не знает, что копируется. Таким образом, вы можете сказать ему скопировать N байтов, содержащих любой тип внутри (включая структуры). Похожий на memcpy(),

Ты можешь сделать:

kernel void krnl(global X* restrict x){ 
    global const Y* l = x[a].y;
    local Y l2;

    size_t sol2 = sizeof(Y);

    async_work_group_copy((local char *)&l2, (global char *)l, sol2, 0);
}

Однако помните, что вам нужно объявить локальную память явно в стороне от ядра или динамически со стороны API и передать указатель на локальную память. Вы не можете просто создать локальный указатель без какой-либо инициализации и скопировать туда. (см. мой код)

Другие вопросы по тегам