2016-02-16 48 views
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)

+0

你可以弄清楚自己是什麼給你一個問題。首先註釋掉內核的內容,並檢查'enqueueNDRangeKernel' /'queue.finish()'是否仍然存在seg錯誤。如果沒有,那麼問題出現在你的內核中。然後逐步取消逐行註釋(或者如果您想更快地執行內核的某些部分)並重新測試。 – doqtor

+0

請添加一個可以構建和運行的最低工作示例。你忽略了一些重要的部分,比如你如何設置內核參數。 – chippies

回答

0
  1. 當地的大小通常是一個非常不錯的選擇
  2. 什麼平臺,你運行?什麼設備(例如CPU,GPU)?
  3. 這可能是因爲您沒有處理邊界條件和訪問緩衝區出界而導致您進行了劃分。
+0

爲了澄清,儘管(1,1)的局部大小不是最理想的,但它不應該引起任何錯誤(假設內核本身沒有錯誤)。 – chippies