CUDA入门(9):固定内存和零拷贝内存

来源:互联网 发布:21端口查看 编辑:程序博客网 时间:2024/04/25 05:55

页锁定内存

页锁定内存也称为固定内存,或者不可分页内存。

1.       属性:操作系统不会对这块系统分页,并交换到磁盘,从而确保了该内存始终保留在物理内存中,因此,操作系统能够安全地使某个应用程序访问该内存的物理地址,因为这块内存将不会被破坏和重新定义。由于GPU知道内存的物理地址,因此可以通过直接内存访问(DMA)技术来实现GPU与主机之间的复制数据,而无需CPU的介入。

2.       性能:使用固定内存的负面作用就是对内存消耗较大。

使用分页锁定内存,分页锁定内存和显存之间的拷贝速度大约是6GB/s,普通的分页内存和GPU间的速度大约是3GB/s,(另外:GPU内存间速度是30G,CPU间内存速度是10GB/s),但是这种方法会带来额外的cpu内存间的拷贝时间(因为cpu需要把数据从可分页内存先拷贝到分页锁定内存)

3.       分配锁页内存:cudaHostAlloc(),释放锁页内存:cudaHostFree()。

 

 

可移动的固定内存

1.       固定内存实际上是主机内存,只是该内存页锁定在物理内存中,以便被换出或者重定位。然而,这些内存页对于单个CPU线程来说是“固定的”,也就是说,如果某个线程分配了固定内存,那么这些内存只是对于分配它们的线程来说是页锁定的。如果在线程之间共享指向这块内存的指针,那么其它线程将把这块内存视为标准的、可分页内存。

2.       将固定内存分配为可移动的,这意味着可以在主机线程之间移动这块内存,并且每个线程都视为固定内存,要达到这一目的,需要在使用cudaHostAlloc来分配内存时加一个标志:cudaHostAllocPortable。这个标志也可以与其他的一些标志共同使用。

 

 

零拷贝内存

1.       锁页内存分配函数:

cudaHostAlloc(void** host_pointer,size_t size,unsigned int flags)

flags:cudaHostAllocDefault;cudaHostAllocMapped;cudaHostAllocWriteCombined。

       cudaHostAllocWriteCombined:表示合并式写入,能够提升GPU读取内存时的性能。当CPU也要读取这个内存块时,合并式写入效率将会很低,因此再决定使用此标志时,必须首先考虑应用程序的可能访问方式。

2.       零拷贝内存:cudaHostAlloc的标志为:cudaHostAllocMapped,这种内存称为零拷贝内存,可以在CUDAC核函数中直接访问这种类型的主机内存,不需要复制到GPU。

3.       获得CPU内存在GPU上的指针:cudaHostGetDevicePointer()。

4.       如果程序是计算密集型,那么零复制可能是一项非常有用的技术。它节省了设备显示传输的时间。事实上,是将计算和数据传输操作重叠了,而且无需执行显式的内存管理。

5.       实际上,使用零复制内存,将传输和内核操作分成更小的块,然后以流水线的方式执行它们。

0 0
原创粉丝点击