У меня есть следующее OpenCL ядро:Каков правильный способ обработки буферов OpenCL структур?
//OPENCL KERNEL
struct MyStruct
{
float A;
float B;
float C;
float D;
float E;
};
__kernel void kernelMain(struct MyStruct* outputBuffer)
{
size_t idx = get_global_id(0);
//Do some stuff here with the outputBuffer
outputBuffer[idx].A = 42.0;
}
Как вы можете видеть, это определяет пользовательский тип, называемый MyStruct.
На принимающей стороне, у меня есть такое же определение структуры (копия-pasta'd):
//HOST SIDE
struct MyStruct
{
float A;
float B;
float C;
float D;
float E;
};
И я пытаюсь создать буфер для написания данных ядра, вновь принимать код на стороне :
//HOST SIDE
cl::Buffer outputBuffer(clContext, CL_MEM_READ_WRITE, (size_t)numElements * sizeof(MyStruct));
clKernel.setArg(0, outputBuffer);
Проблема возникает, когда я вызываю clKernel.setArg. Он выходит из строя с кодом ошибки -51, который, согласно документации OpenCL, является ошибкой размера аргумента ядра.
Я попытался с помощью OpenCL типов данных, переписывание определения хоста структуры быть:
struct MyStruct
{
cl_float A;
cl_float B;
cl_float C;
cl_float D;
cl_float E;
};
Но это также дает ошибку.
Мой вопрос: Что такое правильный способ создания буфера OpenCL для работы с настраиваемыми структурами?
попробовать __kernel аннулированию kernelMain (__ глобальная структура MyStruct * OUTPUTBUFFER) или просто __kernel аннулированию kernelMain (__ глобальной MyStruct * outputBuffer) –
Использовать 'typedef struct {...} MyStruct;' и в ядре args '__kernel void kernelMain (__ global MyStruct * outputBuffer)' – DarkZeros