Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.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
C++ OpenCL:clSetKernelArg返回CL\u无效参数\u大小_C++_Opencl - Fatal编程技术网

C++ OpenCL:clSetKernelArg返回CL\u无效参数\u大小

C++ OpenCL:clSetKernelArg返回CL\u无效参数\u大小,c++,opencl,C++,Opencl,我是OpenCL的新手。我试图将5个参数传递到内核中:一个输入缓冲区、一个输出缓冲区、一个整数和两个输入缓冲区大小的本地数组 //Create input/output cl_mem objects cl_mem inputBuffer = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, inputVector.size(), (void *)inputVector.data(), NULL); cl_me

我是OpenCL的新手。我试图将5个参数传递到内核中:一个输入缓冲区、一个输出缓冲区、一个整数和两个输入缓冲区大小的本地数组

//Create input/output cl_mem objects
cl_mem inputBuffer = clCreateBuffer(context, CL_MEM_READ_ONLY |
    CL_MEM_COPY_HOST_PTR, inputVector.size(), (void *)inputVector.data(), NULL);
cl_mem outputBuffer = clCreateBuffer(context, CL_MEM_WRITE_ONLY,
    inputVector.size(), NULL, NULL);

//get iterator from command line
cl_uint iterations = (cl_uint) atoi(argv[3]);
//std::cout << "iterations: " << iterations << std::endl
//cout confirms I'm getting this correctly

//Set kernel arguments
bool argOK = (CL_SUCCESS == clSetKernelArg(kernel, 0, sizeof(cl_mem), (void*)&inputBuffer));
argOK = argOK && (CL_SUCCESS == clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *)&outputBuffer));
argOK = argOK && (CL_SUCCESS == clSetKernelArg(kernel, 2, sizeof(cl_uint), &iterations));
argOK = argOK && (CL_SUCCESS == clSetKernelArg(kernel, 3, sizeof(inputBuffer), NULL));
argOK = argOK && (CL_SUCCESS == clSetKernelArg(kernel, 4, sizeof(inputBuffer), NULL));
//Check for failure
if(!argOK) {
    std::cerr << "Error: clSetKernelArg failed\n";
    return SDK_FAILURE;
}
我做了一些挖掘/调试,最终发现这一行:

argOK = argOK && (CL_SUCCESS == clSetKernelArg(kernel, 2, sizeof(cl_uint), &iterations));
他是罪魁祸首。将其更改为:

argOK = argOK && (CL_INVALID_ARG_SIZE == clSetKernelArg(kernel, 2, sizeof(cl_uint), &iterations));
让程序成功继续因此,clSetKernelArg(kernel,2,…)语句返回CL_INVALID_ARG_SIZE。这很奇怪,因为看起来我传递了迭代变量的正确大小

以下是我的内核供参考:

__kernel void do_the_thing (__global uchar* in, __global uchar* out,
    __global uint * numIterations, __local uchar* arr1, __local uchar* arr2)
{
    //Do stuff that I haven't written yet.  

}

TL;DR:为什么setKernelArg调用返回CL\u无效的参数大小?内核的第三个参数(index=2)是缓冲区(
\uu全局uint*
)而不是标量

将内核更改为:

__kernel void do_the_thing (__global uchar* in, __global uchar* out, uint numIterations, __local uchar* arr1, __local uchar* arr2)
{
     //Do stuff that I haven't written yet.  

}

内核的第三个参数(index=2)是缓冲区(
\uu全局uint*
),而不是标量

将内核更改为:

__kernel void do_the_thing (__global uchar* in, __global uchar* out, uint numIterations, __local uchar* arr1, __local uchar* arr2)
{
     //Do stuff that I haven't written yet.  

}

这似乎可以做到,谢谢!所以uu global*意味着它是一个缓冲区,而把它像一个普通的c函数一样放进去,使它成为一个参数,那么?好吧,它不仅仅是
\uu global
。这同样适用于
\u常量
。似乎就是这样,谢谢!所以uu global*意味着它是一个缓冲区,而把它像一个普通的c函数一样放进去,使它成为一个参数,那么?好吧,它不仅仅是
\uu global
。这同样适用于
\u常量