浅析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来进行存储。
相关文章推荐
- 在 .NET 中使用类型化 DataSet 实现 Data Transfer Object
- 解决 OOM( Object Out of Memory)问题以及系统调优
- Data Transfer Object(数据传输对象)
- EJB设计模式之Data Transfer Object
- CoreData 数据传输对象DTO(data transfer object)
- decompress gzip data from object in memory
- pb datawindow中获取datawindowchild的sql以及dataobject
- IntraWeb下Model-View-Presenter开发实战--传递篇之一(DataTransferObject)
- Data Transfer Object(数据传输对象) [转载]
- Data Transfer Object(数据传输对象)
- html5的FormData对象和input的file属性以及window.URL.createObjectURL( ) 方法(转载)
- CoreData 数据传输对象DTO(data transfer object)
- Data transfer object
- 09 - 删除vtkDataObject中的ShouldIReleaseData() and ReleaseDataFlag 方法 VTK 6.0 迁移
- Data Transfer Object(数据传输对象)
- PCI9054 突发模式数据传输 (burst mode data transfer )
- Data Transfer Object (DTO)
- 贫血模型;DTO:数据传输对象(Data Transfer Object);AutoMapper ;Domain Model(领域模型);DDD(领域驱动设计)
- PCI9054 突发模式数据传输 (burst mode data transfer )
- html5的FormData对象和input的file属性以及window.URL.createObjectURL( ) 方法