JOCL本地内存访问语法

时间:2015-02-06 10:06:23

标签: parallel-processing opencl gpu amd-processor jocl

这是我的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. 

任何人都可以识别我的错误吗?

提前致谢!

2 个答案:

答案 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指针。