Использование 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 и передать указатель на локальную память. Вы не можете просто создать локальный указатель без какой-либо инициализации и скопировать туда. (см. мой код)