ClenqueEndRangeKernel处的OpenCl分段错误

ClenqueEndRangeKernel处的OpenCl分段错误,opencl,convolution,Opencl,Convolution,我一直在使用Eclipse上的OpenCL进行卷积运算。它在EnqueuenRangeKernel之后给出了一个分段错误。 这是我的主机代码:- 我使用OpenCV拍摄了输入图像,然后:- const int width = image.size().width; const int height = image.size().height; std::cout<<"width: \t"<<width<<"\t height: "<<height&

我一直在使用Eclipse上的OpenCL进行卷积运算。它在EnqueuenRangeKernel之后给出了一个分段错误。 这是我的主机代码:-

我使用OpenCV拍摄了输入图像,然后:-

const int width = image.size().width;
const int height = image.size().height;
std::cout<<"width: \t"<<width<<"\t height: "<<height<<std::endl;
std::size_t in_imagesize = (width*height)*sizeof(float);

std::vector<float> ptr(width*height,0);

const float filter[3] = {1,2,3};
float filter_size = 3*sizeof(float);
const int FilterRadius = 1;

cv::Mat result_image = cv::Mat(cvSize(width,height), CV_32FC1);
std::size_t out_imagesize = sizeof(float)*(width*height);
std::vector<float> read_buffer(width*height,0);
const int width=image.size().width;
const int height=image.size().height;
标准::cout
  • 局部大小(1,1)通常是一个非常糟糕的选择
  • 你在哪个站台上跑步?什么设备(例如CPU、GPU)
  • 这可能是因为您没有处理边界条件和访问超出边界的缓冲区,所以正在进行分段故障

  • 你可以自己找出是什么给了你一个问题。首先注释掉内核的内容,并检查它在
    enqueueNDRangeKernel
    /
    queue.finish()
    之后是否仍然存在seg故障。如果不是,那么问题就出在内核中。然后一步一步地逐行取消注释(或者如果你想做得更快的话,取消内核的某些部分注释)并重新测试。请添加一个可以构建和运行的最小工作示例。您忽略了一些重要的部分,比如如何设置内核参数。只是想澄清一下,虽然(1,1)的局部大小是次优的,但它不应该导致任何错误(假设内核本身没有bug)。
    cl::Buffer input_dev, filter_kernel, output_dev;
    
    input_dev = cl::Buffer(ctx,CL_MEM_READ_ONLY|CL_MEM_USE_HOST_PT R,in_imagesize,image.data,&err);
    if(error!= CL_SUCCESS){
    std::cout<<"Input Buffer Failed "<<std::endl;
    }
    
    output_dev =cl::Buffer(ctx,CL_MEM_READ_WRITE,out_imagesize,NU LL,&err);
    if(error!= CL_SUCCESS){
    std::cout<<"Output Buffer Failed "<<std::endl;
    }
    
    filter_kernel = cl::Buffer(ctx,CL_MEM_READ_ONLY,filter_size,NULL,& err);
    if(error!= CL_SUCCESS){
    std::cout<<"Output Buffer Failed "<<std::endl;
    
    
    std::cout<<"filter_kernel write buffer "<<std::endl;
    queue.enqueueWriteBuffer(filter_kernel,CL_TRUE,0,3 *sizeof(float),filter,NULL,NULL);
    
    
    // Create Kernel
    
    std::cout<<"Now try create kernel objects .."<<std::endl;
    
    cl::Kernel kernel(prg,"ConvH_naive",&err);
    if(error!= CL_SUCCESS)
    {
    std::cout<<"create Kernel_naive failed \n"<<std::endl;
    }
    
    cl::NDRange globalsize(width,height);
    cl::NDRange localsize(1,1);
    cl::NDRange offset(0,0);
    
    
    std::cout<<"Enqueuing the Kernel"<<std::endl;
    if(queue.enqueueNDRangeKernel(kernel,offset,global size,localsize,NULL,NULL)!=CL_SUCCESS)
    {
    std::cout<<"Failed enqueuing the Kernel"<<std::endl;
    }
    queue.finish();