我正在使用c ++开发OpencL灰度代码。我只是一个初学者,这只是OpenCL的第二个代码。它显示了enquecommands中的无效参数错误。我无法解决为什么!!?任何人都可以帮助我。 我也会审查一下,没关系吗?我只是尝试使用缓冲区而不是图像对象。我稍后会尝试使用图像对象。
const int width = 255;
const int height = 255;
std::vector<float> size(width*height,1);
std::string dev_name;
std::vector<cl::Platform> plat;
std::vector<cl::Device>dev;
try
{
//Find OCL platform
cl::Platform::get(&plat);
string value;
if(plat[0].getInfo(CL_PLATFORM_NAME,&value)!=CL_SUCCESS)
{
std::cout<<"No platform found"<<std::endl;
}
else
cout<<"Platform found : "<<value<<endl;
//Find device
if(plat[0].getDevices(CL_DEVICE_TYPE_GPU,&dev)!=CL_SUCCESS)
{
std::cout<<"No device found"<<std::endl;
}
//Create Context
cl::Context ctxt(dev,nullptr,0,0,&error);
//Create CommandQueue
cl::CommandQueue cque(ctxt,dev,CL_QUEUE_PROFILING_ENABLE);
//Create Program
cl::Program prog(ctxt,"/grayscake/Test1.cl",&error);
//BuildProgram
prog.build(dev);
//Create Kernels
cl::Kernel kernel(prog,"Grayscale",&error);
//Memory Objects
cl::Buffer input(ctxt,CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR,size,&size[0],&error);
cl::Buffer output(ctxt,CL_MEM_WRITE_ONLY,size,0,&error);
//Setting Kernel Arguments
if(kernel.setArg(0, input)!=CL_SUCCESS)
{
std::cout<<"Error on input arg"<<std::endl;
}
if(kernel.setArg(1, output)!=CL_SUCCESS)
{
std::cout<<"Error on output arg"<<std::endl;
}
//Profiling Event
cl::Event e1;
const cl::NDRange globalsize = width*height;
//Enqueue Task
cque.enqueueTask(kernel,NULL,&e1);
std::vector<cl::Event> *profilingEvent;
//Write to target device
cque.enqueueWriteBuffer(input,CL_TRUE,0,size*sizeof(float),&size[0],NULL,&e1);
cque.enqueueNDRangeKernel(kernel,0,globalsize,{2,2},NULL,&e1);
cque.enqueueReadBuffer(output,CL_TRUE,0,size*sizeof(float),&size[0],NULL,&e1);
}
答案 0 :(得分:0)
看看以下几行:
const int width = 255;
const int height = 255;
...
const cl::NDRange globalsize = width*height;
...
cque.enqueueNDRangeKernel(kernel,0,globalsize,{2,2},NULL,&e1);
我认为这是自我解释的。您只能在2x2的本地组中划分全局大小255x255。选择另一个本地大小或将全局大小增加1并在内核代码中添加条件:
if(get_global_id(0) < max_x && get_global_id(1) < max_y){
... //Your original kernel code here
}
答案 1 :(得分:0)
这可能是由未发布的事件(cl :: Event)引起的。 在调用另一个函数之前,尝试在每个函数或释放事件中使用不同的cl :: Event变量。