Grayscaling OpencL c ++代码错误

时间:2015-09-18 14:49:37

标签: c++ arm opencl gpu

我正在使用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);


}

2 个答案:

答案 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变量。