CUDA下在Host端分配的几种内存模式

平时我们使用的内存都是Pageable(交换页)的,而另一个模式就是Pinned(Page-locked),实质是强制让系统在物理内存中完成内存申请和释放的工作,不参与页交换,从而提高系统效率,需要使用cudaHostAlloc和cudaFreeHost来分配和释放。

  优点

  1、带宽更高

  2、内核处理和内存拷贝可同时进行

  3、可以内存映射(mapped)

  缺点

  使用pinned会减少系统内存的可用量,进而影响系统性能。

  在Pinned模式下又有以下几种属性:

  Write-combining

  缺省的话pinned拥有cacheable属性,可以用cudaHostAllocWriteCombined标志替代

  优点

  1、可以释放L1和L2资源,让缓存应用于别的地方

  2、write-combining在通过PCIE总线传输时不会被检测,大约可提高

  40%的性能

  缺点

  无法读取或读取极慢。

  Portable

  对于多线程,只能分配pinned的线程可以得到好处,如果想让别的线程也共享,需要cudaHostAllocPortable标志。

  Mapped

  传入cudaHostAllocMapped标识可以让宿主与设备内存映射(某些设备支持),这样设备和宿主共用一块内存,在内核函数中可以用cudaHostGetDevicePointer得到指针,不同的宿主线程得到的指针是不同的。

  优点

  不用在设备中分配和拷贝内存,数据在需要的时候被内核隐式传输

  不需要用Stream来异步执行,内核函数自动在执行的同时异步传输

  缺点

  由于内存共享,内存访问必须同步

你可能感兴趣的:(GPU)