您的位置:首页 > 移动开发 > Objective-C

浅析OpenCL memory(2)——memory object creation flag 以及 data transfer mode

2012-08-09 15:32 211 查看
       

         memory object 的数据传输有两种方式,显示的读写以及数据映射(Map)。

        读写buffer/Image由CL函数 clEnqueueWrite/ReadBuffer和clEnqueueWrite/ReadImage实现。

        映射buffer/Image主要由三步骤:

       (1).映射buffer/Image到主机端内存指针host_ptr,映射可以使用读、写方式,表示需要读取还是修改buffer/Image的内容。

       (2).对主机端内存的读/写(产生实际的数据传输)

       (3).解除映射关系,必要时更新buffer/Image内容

 

       对dGPU来说,数据传输经过PCI-E实现;对于APU来说,数据传输经过Radeon Memory Bus.对于CPU访问dGPU显存,以及APU中CPU、GPU内存的互访都要经过PCI-E或者Radeon总线。

 

       当读取buffer(非zero copy)内容时候,映射步骤需要将Buffer的有效内容复制到主机端内存,并提供有效的指针host_ptr,这个过程需要数据传输代价;解除映射时候,开销很小。

       当更新buffer(非zero copy)内容时候,映射步骤需要提供有效的指针host_ptr,这个过程开销很小,无需数据传输;解除映射时候,需要更新buffer,这需要有数据传输的开销。

       而对于zero copy Buffer来说,解除映射与映射的开销都很小。所谓的zero copy是指buffer始终驻留在设备端或者主机端,在映射和解映射时候不发生数据传输(copy)的特性。表现在映射操作这个buffer的代价很小。

 

       在memory object的创建时候,程序员需要制定一个memory object的flag, 这个flag决定了buffer驻留的位置以及有利的传输特性。比较常用的flag有

(1).CL_MEM_READ_ONLY/CL_MEM_WRITE_ONLY

 ( 2 ) .CL_MEM_USE_HOST_PTR/CL_MEM_ALLOC_HOST_PTR/CL_MEM_COPY_HOST_PTR

 ( 3 ).CL_MEM_USE_PERSISTENT_MEM_AMD

        其中flag CL_MEM_USE_PERSISTENT_MEM_AMD和CL_MEM_ALLOC_HOST_PTR分别实现设备端和主机端zero copy buffer。

 

 

       在Zero copy模式下,数据的交互访问通过总线来实现。在dGPU中,zero copy buffer由host-visible device memory 实现,从名称来看这是一块可以被主机端寻址到的内存区域,所以对这块memory进行映射、解映射的开销很小;在APU下,zero copy由 CPU exclusive host memory 和device visible host memory实现。也就是说,CL_MEM_USE_PERSISTENT_MEM_AMD和CL_MEM_ALLOC_HOST_PTR分别对应device
visible host memory和CPU exclusive host memory。

       对CL_MEM_ALLOC_HOST_PTR来说,读写这块内存的峰值带宽都等同于主机端访存的峰值带宽;而对CL_MEM_USE_PERSISTENT_MEM_AMD来说,读取和写入的效率是完全不等价的,由于采用了uncached host ptr 对它的读取相当耗时,由于同时取消了缓存一致性协议的开销,对它的写入则相当高效。

  

      在使用上,如果host 端内存过大且GPU访问有限,或者有多个设备共享CPU内存的情况,则首选CL_MEM_ALLOC_HOST_PTR作为buffer的创建flag;

      若原始数据作为只读输入,且只有一个GPU参与,则可以考虑CL_MEM_USE_PERSISTENT_MEM_AMD来进行存储。

     

               
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  object buffer 存储