我是新與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不支持? –