这是我的OpenCl内核函数
private static String programSource =
"__kernel void "+
"sampleKernel(__local float *a,"+
" __local float *b,"+
" __global float *c,"+
" __global float *d)"+
"{"+
" int gid=get_local_id(0);"+
" c[gid]=a[gid]+b[gid];"+
" d[gid]=a[gid]-1;"+
"}";
clSetKernelArg(kernel, 0, Sizeof.cl_mem, Pointer.to(memObjects[0]));
clSetKernelArg(kernel, 1, Sizeof.cl_mem, Pointer.to(memObjects[1]));
clSetKernelArg(kernel, 2, Sizeof.cl_mem, Pointer.to(memObjects[2]));
clSetKernelArg(kernel, 3, Sizeof.cl_mem, Pointer.to(memObjects[3]));
我使用全局内存来存储数据。现在我尝试将存储位置转换为本地内存。所以我的代码看起来像这样:
private static String programSource =
"__kernel void "+
"sampleKernel(__local float *a,"+
" __local float *b,"+
" __global float *c,"+
" __global float *d)"+
"{"+
" int gid=get_local_id(0);"+
" c[gid]=a[gid]+b[gid];"+
" d[gid]=a[gid]-1;"+
"}";
clSetKernelArg(kernel, 0, Sizeof.cl_mem, NULL);
clSetKernelArg(kernel, 1, Sizeof.cl_mem, NULL);
clSetKernelArg(kernel, 2, Sizeof.cl_mem, Pointer.to(memObjects[2]));
clSetKernelArg(kernel, 3, Sizeof.cl_mem, Pointer.to(memObjects[3]));
当我执行上面的代码时,我得到以下语法错误:
NULL cannot be resolved to a variable.
任何人都可以识别我的错误吗?
提前致谢!
答案 0 :(得分:0)
查看other JOCL examples that use local memory,你做的是正确的,但最后的参数应该是null
而不是NULL
(前者是Java关键字,后者通常用于C / C ++)。
也就是说,你在内核中实际使用本地内存的方式并不完全正确(尽管我很欣赏这可能只是一个让主机端工作的示例内核)。必须在内核中显式管理向/从本地内存移动数据 - 主机无法初始化本地内存(在您的示例中,本地内存缓冲区将包含垃圾值)。您的输入值需要在全局内存缓冲区中传递给内核。
目前,您对clSetKernelArg
的调用仅为每个本地内存缓冲区分配4或8个字节(Sizeof.cl_mem
),这可能不是您想要的。这适用于全局内存参数,因为您只存储指针 - 当您调用clCreateBuffer
时执行实际的缓冲区分配。对于本地内存参数,此大小是您希望为缓冲区分配的内存量,因此需要反映您希望存储在本地内存中的数据量(对于每个工作组)。
答案 1 :(得分:0)
尝试使用
clSetKernelArg(kernel, 0, Sizeof.cl_mem, new Pointer());
clSetKernelArg(kernel, 1, Sizeof.cl_mem, new Pointer());
这应该创建一个有效的NULL指针。