OpenCL 图像对象主机与设备间数据拷贝

使用如下函数实现在主机与设备间对缓冲区对象的数据拷贝:

cl_int clEnqueueReadImage (cl_command_queue command_queue,
                                cl_mem image,
                                cl_bool blocking_read,
                                const size_t *origin,
                                const size_t *region,
                                size_t row_pitch,
                                size_t slice_pitch,
                                void *ptr,
                                cl_uint num_events_in_wait_list,
                                const cl_event *event_wait_list,
                                cl_event *event)
cl_int clEnqueueWriteImage (cl_command_queue command_queue,
                                  cl_mem image,
                                  cl_bool blocking_write,
                                  const size_t *origin,
                                  const size_t *region,
                                  size_t input_row_pitch,
                                  size_t input_slice_pitch,
                                  const void *ptr,
                                  cl_uint num_events_in_wait_list,
                                  const cl_event *event_wait_list,
                                  cl_event *event)
  • 参数command_queue是命令要入队的队列。comand_queue和image必须是同一个OpenCL上下文创建的。

  • 参数image是图像对象或图像阵列对象。

  • 参数blocking_read和blocking_write表明读写操作是阻塞的还是非阻塞的。

  • 参数origin定义了所要读写区域的起始位置(x,y,z),单位为像素。对于2维图像阵列,是偏移量(x,y)以及图像索引;对于1维图像阵列,是偏移量(x)以及图像索引。如果image是2维图像对象,origin[2]必须是0。如果image是1维图像对象或1维图像缓冲区对象,origin[1]和origin[2]都必须是0。如果image是1维图像阵列对象, origin[2]必须是0,origin[1]是图像在阵列中的索引。如果image是2维图像阵列对象,则origin[2]是图像在阵列中的索引。

  • 参数region定义了要读写区域的大小(width,height,depth),单位为像素。对于2维图像阵列对象,即(width,height)以及图像个数。对于1维图像阵列对象,即(width)以及图像个数。如果image是2维图像对象或1维图像阵列对象,region[2]必须是1。如果image是1维图像对象或1维图像缓冲区对象,region[1]和region[2]都必须是0。

  • 参数row_pitch和input_row_pitch为每行的长度,单位为字节。其值必须大于或等于元素大小*width。如果row_pitch或input_row_pitch是0,则会根据元素大小*width自动计算行间距。

  • 参数slice_pitch和input_slice_pitch为3维图像中3维区域中2维平面大小,或者1维、2维图像阵列中每个图像的大小,单位为字节。如果iamge是1维或2维图像,其值必须是0,否则必须大于或等于row_pitch*height。如果slice_pitch或input_slice_pitch是0,则会根据row_pitch*height自动计算行间距。

其余参数与前述函数中同名参数意义一样,在此就不赘述。
如下代码实现了把2维大小为width*height灰度图像数据从设备内存拷贝到主机内存:

……
char *buffer_host = (char *)malloc(width *height);
size_t origin[3] = {0, 0, 0};
size_t region[3] = { width, height, 1};
errNum = clEnqueueReadImage(commandQueue, imageObjects[1],
                                  CL_TRUE,
                                  origin, region, 0, 0, buffer,
                                  0, NULL, NULL);
……

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程