我有以下的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) – 2014-08-28 00:09:30
使用'typedef struct {...} MyStruct;'和內核參數'__kernel void kernelMain(__ global MyStruct * outputBuffer)' – DarkZeros 2014-08-28 08:33:06