0
我一直在使用Eclipse上的OpenCL進行卷積處理。它在enqueueNDRangeKernel之後給出分段錯誤。 這裏是我的主代碼: -clEnqueueNDRangeKernel上的OpenCl分段錯誤
我已經使用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);
然後背景下,命令隊列,內核程序,之後: -
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();
在此Readbuffer和imshow之後。但是在這個聲明給出分段錯誤之後,代碼停止。
任何人都可以幫忙?內核代碼有問題嗎?我應該補充一點嗎? (1,1)
你可以弄清楚自己是什麼給你一個問題。首先註釋掉內核的內容,並檢查'enqueueNDRangeKernel' /'queue.finish()'是否仍然存在seg錯誤。如果沒有,那麼問題出現在你的內核中。然後逐步取消逐行註釋(或者如果您想更快地執行內核的某些部分)並重新測試。 – doqtor
請添加一個可以構建和運行的最低工作示例。你忽略了一些重要的部分,比如你如何設置內核參數。 – chippies