1、Opencl应用程序经常要处理大型数组或者多维矩阵。在能够开始执行之前,需要这些数据实际存在于设备之上。 2、为了将数据传输到设备上,首先必须将其封装成内存对象。 3、Opencl定义了两种不同的内存对象,buffer和image。 4、任何时候,只要是新建的内存对象,它都只在一个上下文中有效。Opencl运行时根据依赖关系的需要来管理特定设备的数据传输。
1、类似于c语言中的数组,由malloc()创建,buffer中的数据元素在内存中连续存储。 2、API函数
cl_mem clCreateBuffer( cl_context context, cl_mem_flags flags, size_t size, void *host_ptr, cl_int *errcode_ret)3、新建一个buffer,需要提供buffer的大小和与其关联的上下文,它对所有与该上下文相关联的设备是可见的。 与其他入队操作类似,读或者写buffer需要一个命令队列来管理指令的执行和调度。 4、写buffer API
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_lsit, cl_event *event)5、与其他入队操作类似,读或者写buffer需要一个命令队列来管理指令的执行和调度。 6、入队列函数需要buffer、数据传输的字节数以及在buffer内偏移量。
1、image被设计成不透明的对象,以便进行数据填充和其他可能改善设备性能的优化。 2、image是考虑到具体内存设备优化而对实际数据存储进行抽象的Opencl内存对象。 3、和buffer一样,image不能向数组一样直接进行引用,此外,相邻的元素不能保证被放在连续的内存中。 4、使用image的目的是允许硬件利用空间局部性来进行硬件加速。 5、image依赖于底层的硬件设备。 6、pitch是指一幅图像数据中两行之间差距所站的字节数。
cl_mem clCreateImage2D( cl_context context, cl_mem_flags flags, const cl_image_format *image_format, size_t image_width, size_t image_height, size_t image_row_pitch, void* host_ptr, cl_int *errcode_ret)