Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opencl clSetKernelArg返回的CL_对象无效_Opencl - Fatal编程技术网

Opencl clSetKernelArg返回的CL_对象无效

Opencl clSetKernelArg返回的CL_对象无效,opencl,Opencl,我对OpenCL完全没有兴趣。我想在英特尔的网站上找到一个样本,但我不能 我在尝试将整数参数传递给clSetKernelArg时遇到错误CL_INVALID_MEM_OBJECT,如下所示: err = clSetKernelArg(ocl->kernel, 2, sizeof(cl_mem), (void *)&width); if (CL_SUCCESS != err) { LogError("Error: Failed to set argument dstMem,

我对OpenCL完全没有兴趣。我想在英特尔的网站上找到一个样本,但我不能

我在尝试将整数参数传递给clSetKernelArg时遇到错误CL_INVALID_MEM_OBJECT,如下所示:

err = clSetKernelArg(ocl->kernel, 2, sizeof(cl_mem), (void *)&width);
if (CL_SUCCESS != err)
{
    LogError("Error: Failed to set argument dstMem, returned %s\n", TranslateOpenCLError(err));
    return err;
}
本教程旨在处理图像,并特别说明参数应设置为:

err  |= clSetKernelArg(ocl->kernel, 2, sizeof(cl_mem), (void *) &width);
err  |= clSetKernelArg(ocl->kernel, 3, sizeof(cl_mem), (void *) &height);
以下是完整的功能:

cl_uint SetKernelArguments(ocl_args_d_t *ocl, cl_uint width, cl_uint height)
{
    cl_int err = CL_SUCCESS;

    err  =  clSetKernelArg(ocl->kernel, 0, sizeof(cl_mem), (void *)&ocl->srcA);
    if (CL_SUCCESS != err)
    {
        LogError("error: Failed to set argument srcA, returned %s\n", TranslateOpenCLError(err));
        return err;
    }

    err  = clSetKernelArg(ocl->kernel, 1, sizeof(cl_mem), (void *)&ocl->dstMem);
    if (CL_SUCCESS != err)
    {
        LogError("Error: Failed to set argument dstMem, returned %s\n", TranslateOpenCLError(err));
        return err;
    }

    err = clSetKernelArg(ocl->kernel, 2, sizeof(cl_uint), (void *)&width);
    if (CL_SUCCESS != err)
    {
        LogError("Error: Failed to set argument dstMem, returned %s\n", TranslateOpenCLError(err));
        return err;
    }

    err = clSetKernelArg(ocl->kernel, 3, sizeof(cl_mem), (void *)&height);
    if (CL_SUCCESS != err)
    {
        LogError("Error: Failed to set argument dstMem, returned %s\n", TranslateOpenCLError(err));
        return err;
    }

    return err;
}
最后一个注意事项:将clSetKernelArg的大小更改为sizeof(cl_uint)会将错误更改为cl_INVALID_ARG_size

如果这还不够,我会在github上公布源代码


我很确定我很好地遵循了教程中的说明,但我不知道我可能错过了什么。谢谢你抽出时间

我在github上快速浏览了你的代码,我想我可以给你一些建议

首先,在使用“cl_mem”类型的内存对象之前调用“clCreateBuffer”,换句话说,在调用之前确保“width”的类型为“cl_mem”

cl_mem cl_width=clCreateBuffer(上下文,cl_mem_READ_WRITE,cl_mem_COPY_HOST_PTR,
sizeof(宽度)和width,*err);
err=clSetKernelArg(ocl->kernel,2,sizeof(cl\u mem)和cl\u width)

我不确定它是否会起作用

其次,根据我的经验,使用“cl_mem”来传递诸如“int”或“char”之类的值是不可取的。如果我是您,我将省略“clCreateBuffer”子句并编写如下代码:

cl_int width = doSomeThingYouWant();
err=clSetKernelArg(ocl->kernel,2,sizeof(cl_uint),&width)


希望能对你有所帮助。

让我试着简单地回答你的问题

如果我们看一下clSetKernelArg函数的定义:

cl_int clSetKernelArg ( cl_kernel kernel,
    cl_uint arg_index,
    size_t arg_size,
    const void *arg_value)
您可以看到,需要传递给clSetKernelArg的是一个指向参数的指针,以及参数的大小。现在,你的论点只是一个普通的cl_uint变量。因此,我们可以做到以下几点:

const void *arg_value -> &width
size_t arg_size -> sizeof(width)
因此,您的API调用如下所示:

err  |= clSetKernelArg(ocl->kernel, 2, sizeof(width), (void *) &width);
err  |= clSetKernelArg(ocl->kernel, 3, sizeof(height), (void *) &height);

你能写出核函数的参数吗,比如u全局int*a。。。