【发布时间】:2013-08-08 07:32:06
【问题描述】:
我正在学习 OpenCL 中的内存缓冲区和图像。据我了解,OpenCL 中的图像只是一种抽象数据结构,与类似照片的图像(x、y、r、g、b 或 x、y、h、s、l、a , 或者...随便)。
在我正在阅读的这本书中,他们提供了一个function 从硬盘读取 .bmp 文件并将其转换为浮点数组
然后他们将浮点数组写入 cl_mem 变量:
// GET THE .BMP AS A FLOAT[]
float* inputImage = readImage(inputFile, &imageWidth, &imageHeight);
// DEFINE THE IMAGE AND FORMAT
cl_image_desc desc;
desc.image_type = CL_MEM_OBJECT_IMAGE2D;
desc.image_width = imageWidth;
desc.image_height = imageHeight;
desc.image_depth = 0;
desc.image_array_size = 0;
desc.image_row_pitch = 0;
desc.image_slice_pitch = 0;
desc.num_mip_levels = 0;
desc.num_samples = 0;
desc.buffer = NULL;
cl_image_format format;
format.image_channel_order = CL_R;
format.image_channel_data_type = CL_FLOAT;
// DEFINE AND WRITE THE IMAGE
cl_mem d_inputImage = clCreateImage(context, CL_MEM_READ_ONLY, &format, &desc, NULL, NULL);
ize_t origin[3] = { 0, 0, 0 };
size_t region[3] = { imageWidth, imageHeight, 1 };
clEnqueueWriteImage(queue, d_inputImage, CL_FALSE, origin, region, 0, 0, inputImage, 0, NULL, NULL);
那么这是否告诉 OpenCL 我们正在处理类似照片的图像,或者我们只是在定义一个数据结构?在本书的内核中,他们使用:
// sourceImage is d_inputImage from the previous block of code. its type is image2d_t
float4 pixel;
pixel = read_imagef(sourceImage, sampler, coords);
sum.x += pixel.x * filter[filterIdx++];
OpenCL 是否只是将这些数据结构松散地用作类似照片的图像,还是以任何类似于 .NET 的方式使用,您可以从许多不同的来源创建位图对象,然后一旦有了该对象,您就可以做任何您想做的事情有吗?
【问题讨论】:
标签: opencl