2014-01-15 32 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;