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