首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JOCL中的CL_INVALID_KERNEL_ARGS (OpenCL绑定)。

JOCL中的CL_INVALID_KERNEL_ARGS (OpenCL绑定)。
EN

Stack Overflow用户
提问于 2015-08-05 15:57:09
回答 2查看 473关注 0票数 1

有人在JOCL中做矩阵乘法时遇到这样的错误吗?

代码语言:javascript
运行
复制
Exception in thread "main" org.jocl.CLException: CL_INVALID_KERNEL_ARGS
at org.jocl.CL.checkResult(CL.java:787)
at org.jocl.CL.clEnqueueNDRangeKernel(CL.java:20802)
at org.jocl.samples.JOCLSample.main(JOCLSample.java:147)

我编辑了他们的示例HelloJOCL.java来做矩阵乘法计算,同时也做了matrixMul.cl (内核代码)。下面是导致错误的内核参数:

代码语言:javascript
运行
复制
// Create the kernel
    cl_kernel kernel = clCreateKernel(program, "matrixMul", null);

    long time = nanoTime();
    // Set the arguments for the kernel
    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]));

工作项维度代码:

代码语言:javascript
运行
复制
// Set the work-item dimensions
    long global_work_size[] = new long[]{n};
    long local_work_size[] = new long[]{1};


// Execute the kernel
    clEnqueueNDRangeKernel(commandQueue, kernel, 1, null,
    global_work_size, null, 0, null, null);

和核心代码:

代码语言:javascript
运行
复制
private static String programSource =
        "__kernel void "+
                "matrixMul(__global float* C,"+ 
                "          __global float* A,"+ 
                "          __global float* B,"+ 
                "          int wA, int wB)"+
                "{"+
                   "int x = get_global_id(0);"+ 
                   "int y = get_global_id(1);"+

                   "float value = 0;"+
                   "for (int k = 0; k < wA; ++k)"+
                   "{"+
                   "   float elementA = A[y * wA + k];"+
                   "   float elementB = B[k * wB + x];"+
                   "   value += elementA * elementB;"+
                   "}"+
                  "C[y * wA + x] = value;"+
                "}";
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-07 15:28:04

核函数被定义为

代码语言:javascript
运行
复制
__kernel void matrixMul(__global float* C,
                        __global float* A,
                        __global float* B,
                        int wA, int wB)

因此需要五个论点。您只提供前三个参数,即表示float*值的内存对象。为了启动这个内核,您必须传递所有参数的值。在您的例子中,这可能大致如下所示:

代码语言:javascript
运行
复制
int a=0;
clSetKernelArg(kernel, a++, 
    Sizeof.cl_mem, Pointer.to(memObjects[0]));
clSetKernelArg(kernel, a++, 
    Sizeof.cl_mem, Pointer.to(memObjects[1]));
clSetKernelArg(kernel, a++, 
    Sizeof.cl_mem, Pointer.to(memObjects[2]));

// These have been missing:
clSetKernelArg(kernel, a++, 
    Sizeof.cl_int, Pointer.to(new int[]{ wA }));
clSetKernelArg(kernel, a++, 
    Sizeof.cl_int, Pointer.to(new int[]{ wB }));
票数 1
EN

Stack Overflow用户

发布于 2015-08-05 20:37:18

内核代码显示了5个输入参数,C、A、B、wA wB。但我只看到这里列出了3个clSetKernelSrg调用。

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

https://stackoverflow.com/questions/31837360

复制
相关文章

相似问题

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