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)的特性。表现在