2014-01-15 31 views
3

我是新與OPENCL與C++,我試圖創建圖像的cl_mem,但我不明白,使其工作:的OpenCL clCreateImage clCreateImage2D

首先我用clCreateImage2D這樣的:

Mat image=imread("pic.jpg",CV_32FC1); 
int width = image.rows; 
int height = image.cols; 

char *buffer = reinterpret_cast<char *>(image.data); 

cl_image_format clImageFormat; 
    clImageFormat.image_channel_order = CL_INTENSITY ; 
    clImageFormat.image_channel_data_type = CL_FLOAT; 
cl_mem Image2DBuffer =clCreateImage2D(context,CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, &clImageFormat, width,height,0,buffer,&error); 

但它並沒有編譯和Visual Studio 2012給了我這個錯誤:「錯誤C4996:‘clCreateImage2D’:被宣佈棄用」。

我找了一個解決方案,我發現的OpenCL 1.2已經取代clCreateImage2D和clCreateImage3D爲clCreateImage(或至少這是我的理解),所以我改變了下面的代碼:

cl_image_desc image_desc; 
    image_desc.image_type = CL_MEM_OBJECT_IMAGE2D; 
    image_desc.image_width = width; 
    image_desc.image_height = height; 
    image_desc.image_array_size = 1; 
    image_desc.image_row_pitch = 0; 
    image_desc.image_slice_pitch = 0; 
    image_desc.num_mip_levels = 0; 
    image_desc.num_samples = 0; 
    image_desc.buffer = NULL; 

cl_mem ImageBuffer=clCreateImage(context,CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, &clImageFormat, &image_desc, buffer,&error); 

但該程序崩潰在最後一行(未處理的異常在0x0000000000000000),我不知道爲什麼。

我很感激任何人都可以提供幫助。我想我寫了一些你可能需要了解的問題,但如果有東西丟失,請告訴我,我會提供額外的信息。下面

+0

你申報和分配錯誤?圖像是否正確打開?上下文是否正確初始化? – Austin

+0

另外,你的數據是char *,但是clImageFormat被設置爲CL_FLOAT – Austin

+0

有兩個問題可能有幫助:(1)'image_desc'配置的方式,它看起來像是將一個長度爲1的'image2d_array_t'傳遞給內核。這是你打算做什麼?即你的內核簽名是否包含一個'image2d_array_t'參數?如果它只是一個image2d_t(我希望基於你的初始代碼),image_desc中的image_array_size應該設置爲0。在某些情況下,傳輸1個image2d_t類型甚至可能比1個image2d_array_t更快。(2)您是否在Nvidia硬件上運行,但是使用來自AMD/Intel的頭文件 - 支持OpenCL1.2,而Nvidia不支持? –

回答

0

代碼工作VS12上,AMD APP SDK V2。玩第一個分配標誌,我的GPU使用共享內存,所以我選擇CL_MEM_ALLOC_HOST_PTR。

//Let image constructor select row pitch 
std::size_t row_pitch = 0, rows = 768, cols = 1024; 

Mat image(rows, cols, CV_32F, cv::Scalar(0.0f)); 
try{ 
    cl::Image2D img(context, CL_MEM_ALLOC_HOST_PTR | CL_MEM_COPY_HOST_PTR, cl::ImageFormat(CL_LUMINANCE, CL_FLOAT), image.cols, image.rows, row_pitch, (void*)image.data); 
}catch(cl::Error &e){ 
    cerr <<e.what()<<endl; 
} 
0

clCreateImage是1.2函數。

如果您的設備僅支持的OpenCL 1.1,你應該使用clCreateImage2D或clCreateImage3D和包括1.1 CL文件夾。

如果使用clCreateImage功能的設備沒有技術支持點擊​​1.2,運行時,applicatoin會崩潰。

如果您使用clCreateImage2D或clCreateImage3D不包括1.1 CL文件夾將編譯錯誤。

0

我想你應該設置

image_desc.image_row_pitch = width *channel; 
image_desc.image_slice_pitch = width *channel*height;