CUDA锁页内存

一下内容是大部分来自http://www.findspace.name/easycoding/1349,还有小部分来自《CUDA专家手册》,整理记录下来作为学习过程中的笔记


主机处理器(CPU)支持虚拟内存系统,允许程序员使用比实际空间更大的内存空间,可以认为虚拟内存是内存容量受限留下的后遗症。

大多数系统中虚拟内存空间被划分成许多页,它们是寻址的单元,页的大小至少4096个字节。虚拟寻址能使一个连续的虚拟地址空间映射到物理内存并不连续的一些页。

锁页内存允许GPU上的DMA控制器请求主机传输,而不需要CPU主机处理器的参与。

锁页是操作系统常用的操作,可以使硬件外设直接访问CPU内存,从而避免过多的复制操作。被锁定的页面已被操作系统标记为不可被操作系统换出的,所以设备驱动程序给这些外设编程时,可以使用页面的物理地址直接访问内存,而CPU仍然可以访问上述锁页内存,但是此内存是不能移动或换页到磁盘上的。

在GPU上分配的内存默认都是锁页内存,这只是因为GPU不支持将内存交换到磁盘上。


在主机上分配锁页内存,使用特殊的cudaHostAlloc函数,或者使用常规的malloc函数,然后再将其注册(cudaHostRegister)为锁页内存。注册为锁页内存只是设置一些内部标志以确保内存不被换出,并告诉CUDA驱动程序,该内存为锁页内存,可以直接使用它而不需要使用临时缓冲区。


如果使用cudaHostAlloc,则需要使用cudaFreeHost函数释放这一块内存,不能调用常规的C语言函数释放,不然会崩溃或者出现一些不常见的错误。


cudaHostAlloc函数的原型是:

cudaError_t cudaHostAlloc( void ** host_pointer, size_t size, unsignedint flags )


然而分页锁定主机存储器是稀缺资源,所以分配太多的分页锁定内存的话,分配会失败,另外由于减少了系统可分页的物理存储器数量,分配太多的分页锁定内存会降低系统的整体性能。

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

采用注册为锁页内存(cudaHostRegister)把普通内存改为分页锁定内存,则不会带来额外的CPU内存拷贝时间开销。

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值