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. 实际上,使用零复制内存,将传输和内核操作分成更小的块,然后以流水线的方式执行它们。
- CUDA入门(9):固定内存和零拷贝内存
- CUDA零拷贝内存(zerocopy memory)
- 浅谈CUDA零拷贝内存
- 关于CUDA零拷贝内存的实验
- CUDA Samples: dot product(使用零拷贝内存)
- CUDA内存拷贝
- CUDA内存拷贝
- CUDA内存拷贝
- CUDA内存拷贝
- CUDA内存拷贝
- CUDA内存拷贝
- CUDA入门(4):CUDA内存模型
- CUDA内存分配、释放、传输,固定内存
- 深拷贝 浅拷贝 内存零拷贝
- 内核零内存拷贝策略
- cuda二维数组内存分配和数据拷贝
- cuda二维数组内存分配和数据拷贝
- 零拷贝内存 or 页锁定内存
- 几个常见分布的英文 哈哈 原创的第一篇
- 动态添加子view,并让其随机分布
- 杭电5591 ZYB's Game
- android观察者模式:EventBus实现GPS定位
- Maven使用
- CUDA入门(9):固定内存和零拷贝内存
- 学习MarkDown流程图写法
- Android使用bit.ly的api获取url 短连接
- 4-6 UVA 508 Morse Mismatches莫尔斯电码
- Push推送
- 面向GC的Java编程
- TextView下划线带颜色
- js 去除数组的重复
- 僵尸进程zombie与孤儿进程orphan