1

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

谁能指出我的错误?

提前致谢!

4

2 回答 2

0

试一试

clSetKernelArg(kernel, 0, Sizeof.cl_mem, new Pointer());
clSetKernelArg(kernel, 1, Sizeof.cl_mem, new Pointer());

这应该创建一个有效的 NULL 指针。

于 2015-02-06T11:18:19.877 回答
0

查看其他使用 local memory 的 JOCL 示例,您正在做正确的事情,但最后一个参数应该是null而不是NULL(前者是 Java 关键字,后者通常用于 C/C++)。

也就是说,您在内核中实际使用本地内存的方式并不完全正确(尽管我很欣赏这可能只是让主机端工作的示例内核)。必须在内核内部显式管理将数据移入/移出本地内存 - 主机无法初始化本地内存(在您的示例中,本地内存缓冲区将包含垃圾值)。您的输入值需要在全局内存缓冲区中传递给内核。

目前,您的调用clSetKernelArg仅为每个本地内存缓冲区分配 4 或 8 个字节 ( Sizeof.cl_mem),这可能不是您想要的。这对于全局内存参数很好,因为您只存储指针 - 实际的缓冲区分配是在您调用clCreateBuffer. 对于本地内存参数,此大小是您希望为缓冲区分配的内存量,因此需要反映您希望存储在本地内存中的数据量(对于每个工作组)。

于 2015-02-06T11:15:23.533 回答