OpenCL 编程步骤 5. 创建内存对象

参考《AMD OpenCL 大学教程》

OpenCL 内存对象就是一些 OpenCL 数据,这些数据一般在设备内存中,能够被拷入也能够被拷出。OpenCL 内存对象包括 buffer 对象和 image 对象。

  • Buffer 对象:连续的内存块 ----顺序存储,能够通过指针、行列式等直接访问。
  • Image 对象:是 2 维或 3 维的内存对象,只能通过 read_image() 或 write_image() 来读取。image 对象可以是可读或可写的,但不能同时既可读又可写。

clCreateBuffer

创建一个 buffer 对象,用如下函数:

cl_mem clCreateBuffer(cl_context context,
                      cl_mem_flags flags,
                      size_t size,
                      void* host_ptr,
                      cl_int* errcode_ret);

flags 参数指定 buffer 对象的读写属性,host_ptr 可以是 NULL,如果不为 NULL,一般是一个有效的 host buffer 对象,这时,函数创建 OpenCL buffer 对象后,会把对应 host buffer 的内容拷贝到 OpenCL buffer 中。

clEnqueueWriteBuffer

在 Kernel 执行之前, host 中原始输入数据必须显式的传到 device 中, Kernel 执行完后, 结果也要从 device 内存中传回到 host 内存中。我们主要通过函数 clEnqueue{Read/Write}Buffer/Image} 来实现这两种操作。从 host 到 device, 我们用 clEnqueueWrite, 从 device 到 host, 我们用 clEnqueueRead。clEnqueueWrite 命令包括初始化内存对象以及把 host 数据传到 device 内存这两种操作。当然,像前面一段说的那样,也可以把 host buffer 指针直接用在 CreateBuffer 函数中来实现隐式的数据写操作。

cl_int clEnqueueWriteBuffer(cl_command_queue command_queue,
                            cl_mem buffer,
                            cl_bool blocking_write,
                            size_t offset,
                            size_t cb,
                            const void* ptr,
                            cl_uint num_events_in_wait_list,
                            const cl_event* event_wait_list,
                            cl_event* event);

函数初始化 OpenCL 内存对象, 并把相应的数据写到 OpenCL 内存关联的设备内存中。其中,
blocking_write 参数指定是数据拷贝完成后函数才返回,还是数据开始拷贝后就立即返回(阻塞模式于非阻塞模式)。Events 参数指定这个函数执行之前, 必须要完成的 Event(比如先要创建 OpenCL 内存对象的 Event)。

posted @ 2024-12-24 21:59  turbinee  阅读(78)  评论(0)    收藏  举报