这是我的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. 有人能找出我的错误吗?
提前感谢!
发布于 2015-02-06 19:15:24
查看other JOCL examples that use local memory,您正在做正确的事情,但是最后的参数应该是null而不是NULL (前者是Java关键字,后者通常用于C/C++)。
也就是说,您在内核中实际使用本地内存的方式并不完全正确(尽管我知道这可能只是一个让主机端工作的示例内核)。将数据移入/移出本地内存必须在内核中显式管理-主机不能初始化本地内存(在您的示例中,本地内存缓冲区将包含垃圾值)。您的输入值需要在全局内存缓冲区中传递给内核。
目前,对clSetKernelArg的调用仅为每个本地内存缓冲区分配4或8字节(Sizeof.cl_mem),这可能不是您想要的。这对于全局内存参数很好,因为您只存储指针-实际的缓冲区分配是在您调用clCreateBuffer时执行的。对于本地内存参数,此大小是您希望为缓冲区分配的内存量,因此需要反映您希望存储在本地内存中的数据量(对于每个工作组)。
发布于 2015-02-06 19:18:20
尝试一下,使用
clSetKernelArg(kernel, 0, Sizeof.cl_mem, new Pointer());
clSetKernelArg(kernel, 1, Sizeof.cl_mem, new Pointer());这应该会创建一个有效的空指针。
https://stackoverflow.com/questions/28363202
复制相似问题