我是新与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),我不知道为什么。
我很感激任何人都可以提供帮助。我想我写了一些你可能需要了解的问题,但如果有东西丢失,请告诉我,我会提供额外的信息。下面
你申报和分配错误?图像是否正确打开?上下文是否正确初始化? – Austin
另外,你的数据是char *,但是clImageFormat被设置为CL_FLOAT – Austin
有两个问题可能有帮助:(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不支持? –