首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JOCL本地内存访问语法

JOCL本地内存访问语法
EN

Stack Overflow用户
提问于 2015-02-06 18:06:23
回答 2查看 210关注 0票数 1

这是我的OpenCl内核函数

代码语言:javascript
运行
复制
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]));

我使用全局内存来存储数据。现在,我尝试将存储位置转换为本地内存。所以我的代码看起来像这样:

代码语言:javascript
运行
复制
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]));

当我执行上面的代码时,我得到以下语法错误:

代码语言:javascript
运行
复制
NULL cannot be resolved to a variable. 

有人能找出我的错误吗?

提前感谢!

EN

回答 2

Stack Overflow用户

发布于 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时执行的。对于本地内存参数,此大小是您希望为缓冲区分配的内存量,因此需要反映您希望存储在本地内存中的数据量(对于每个工作组)。

票数 0
EN

Stack Overflow用户

发布于 2015-02-06 19:18:20

尝试一下,使用

代码语言:javascript
运行
复制
clSetKernelArg(kernel, 0, Sizeof.cl_mem, new Pointer());
clSetKernelArg(kernel, 1, Sizeof.cl_mem, new Pointer());

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28363202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档