GPU-内存拷贝

发布时间:2022-06-27 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了GPU-内存拷贝脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

在 CUDA 编程中,内存拷贝是非常费时的一个动作。CPU 和 GPU 之间的总线是 PCI-Express,是双向传输的,之间通过 DMA(Direct Memory Access,直接内存访问)机制进行数据拷贝。

1.CUDA 固定内存(Pinned Memory)

对于 CUDA 架构而言,主机端的内存可分为两种:

  • 1)可分页内存(Pageable Memory)
  • 2)页锁定内存(Page-locked Memory),或称固定内存(Pinned Memory)

对于页锁定内存,操作系统不会对其进行分页和交换操作,一定是存储在物理内存,不会存储在虚拟内存,因此,GPU 可直接通过 DMA 机制,在主机和 GPU 之间快速复制数据。而对于可分页内存,CUDA 驱动会首先将 Pageable Memory 的数据拷贝到临时的 Pinned Memory,然后再通过 DMA 机制进行数据传输。如下图所示:

 

GPU-内存拷贝

 

 

 

可见,从主机的页锁定内存拷贝数据到 GPU 要更快的多

但是,页锁定内存也是更消耗物理内存的。当计算机的物理内存充足时,可以设置为页锁定内存。当计算机的物理内存不足或内存交换过多时,不建议使用页锁定内存,否则会严重影响应用程序的性能。

C++ 中,通过操作系统接口 malloc() 在主机上分配可分页内存,通过 CUDA 函数 cudaHostAlloc() 在主机上分配页锁定内存

 Host: CPU

Device: GPU

 

DMA概述

DMA的英文拼写是“Direct Memory Access”,汉语的意思就是直接内存访问。DMA既可以指内存和外设直接存取数据这种内存访问的计算机技术,又可以指实现该技术的硬件模块(对于通用计算机PC而言,DMA控制逻辑由CPU和DMA控制接口逻辑芯片共同组成,嵌入式系统的DMA控制器内建在处理器芯片内部,一般称为DMA控制器,DMAC)。

DMA内存访问技术

使用DMA的好处就是它不需要CPU的干预而直接服务外设,这样CPU就可以去处理别的事务,从而提高系统的效率,对于慢速设备,如UART,其作用只是降低CPU的使用率,但对于高速设备,如硬盘,它不只是降低CPU的使用率,而且能大大提高硬件设备的吞吐量。因为对于这种设备,CPU直接供应数据的速度太低。 因CPU只能一个总线周期最多存取一次总线,而且对于ARM,它不能把内存中A地址的值直接搬到B地址。它只能先把A地址的值搬到一个寄存器,然后再从这个寄存器搬到B地址。也就是说,对于ARM,要花费两个总线周期才能将A地址的值送到B地址。而DMA就不同了,一般系统中的DMA都有突发(Burst)传输的能力,在这种模式下,DMA能一次传输几个甚至几十个字节的数据,所以使用DMA能使设备的吞吐能力大为增强。

使用DMA时我们必须要注意如下事实:

  • DMA使用物理地址,程序是使用虚拟地址的,所以配置DMA时必须将虚拟地址转化成物理地址。
  • 因为程序使用虚拟地址,而且一般使用cache地址,所以Cache中的内容与其物理地址(内存)的内容不一定一致,所以在启动DMA传输前一定要将该地址的cache刷新,即写入内存。
  • OS并不能保证每次分配到的内存空间在物理上是连续的。尤其是在系统使用过一段时间而又分配了一块比较大的内存时。所以每次都需要判断地址是不是连续的,如果不连续就需要把这段内存分成几段让DMA完成传输

脚本宝典总结

以上是脚本宝典为你收集整理的GPU-内存拷贝全部内容,希望文章能够帮你解决GPU-内存拷贝所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: