cuda的Pinned Memory(分页锁定内存)
cuda的Pinned Memory(分页锁定内存)
版权声明:本文为博主原创文章,未经博主允许不得转载。
当为了提高CUDA程序的主机内存和设备内存传输消耗时,可以尝试一下两种方案
一:使用分页锁定内存,分页锁定内存和显存之间的拷贝速度大约是6GB/s,普通的分页内存和GPU间的速度大约是3GB/s,(另外:GPU内存间速度是30G,CPU间内存速度是10GB/s),但是这种方法会带来额外的cpu内存间的拷贝时间
二:使用内存映射(Zero Copy)让GPU直接使用CPU的内存,减少主机和设备间内存传输的时间,但是这种方法对于2.2以后的cuda版本未必管用
三:通过函数cudaHostRegister()把普通内存改为分页锁定内存,和一的方法类似,但不会带来额外的cpu内存拷贝时间,实验证明该方法有效果。
========================================================================================================
cuda运行时提供了使用分页锁定主机存储器(也称为pinned)的函数(与常规的使用malloc()分配的可分页的主机存储器不同):
cudaHostAlloc()和cudaFreeHost()分配和释放分页锁定主机存储器;
cudaHostRegister()分页锁定一段使用malloc()分配的存储器。
如前文(可阅读以上文章)提到的,在某些设备上,设备存储器和分页锁定主机存储器间数据拷贝可与内核执行并发进行;
在一些设备上,分页锁定主机内存可映射到设备地址空间,减少了和设备间的数据拷贝,详见3.2.4.3节;
在有前端总线的系统上,如果主机存储器是分页锁定的,主机存储器和设备存储器间的带宽会高些,如果再加上3.2.4.2节所描述的写结合(write-combining)的话,带宽会更高。
然而分页锁定主机存储器是稀缺资源,所以可分页内存分配得多的话,分配会失败。另外由于减少了系统可分页的物理存储器数量,分配太多的分页锁定内存会降低系统的整体性能。 SDK中的simple zero-copy例子中有分页锁定API的详细文档
1、可分享存储器(portable memory)
一块分页锁定存储器可被系统中的所有设备使用(参看前文以了解更多的多设备系统细节),但是默认的情况下,上面说的使用分布锁定存储器的好处只有分配它时,正在使用的设备可以享有(如果可能的话,所有的设备共享同一个地址空间,参见“相关阅读”中的文章)。为了让所有线程可以使用分布锁定共享存储器的好处,可以在使用cudaHostAlloc()分配时传入cudaHostAllocPortable标签,或者在使用cudaHostRegister()分布锁定存储器时,传入cudaHostRegisterPortable标签。
2、写结合存储器
默认情况下,分页锁定主机存储器是可缓存的。可以在使用cudaHostAlloc()分配时传入cudaHostAllocWriteCombined标签使其被分配为写结合的。写结合存储器没有一级和二级缓存资源,所以应用的其它部分就有更多的缓存可用。另外写结合存储器在通过PCI-e总线传输时不会被监视(snoop),这能够获得高达40%的传输加速。 从主机读取写结合存储器极其慢,所以写结合存储器应当只用于那些主机只写的存储器。
3、被映射存储器
在一些设备上,在使用cudaHostAlloc()分配时传入cudaHostAllocMapped标签或者在使用cudaHostRegister()分布锁定一块主机存储器时使用cudaHostRegisterMapped标签,可分配一块被映射到设备地址空间的分页锁定主机存储器。这块存储器有两个地址:一个在主机存储器上,一个在设备存储器上。主机指针是从cudaHostAlloc()或malloc()返回的,设备指针可通过cudaHostGetDevicePointer()函数检索到,可以使用这个设备指针在内核中访问这块存储器。唯一的例外是主机和设备使用统一地址空间时,参见前文(可阅读“相关阅读”的文章)。
从内核中直接访问主机存储器有许多优点:
①无须在设备上分配存储器,也不用在这块存储器和主机存储器间显式传输数据;数据传输是在内核需要的时候隐式进行的。
②无须使用流(参见3.2.5.4节)重叠数据传输和内核执行;数据传输和内核执行自动重叠。
由于被映射分页锁定存储器在主机和设备间共享,应用必须使用流或事件(参见3.2.5节)来同步存储器访问以避免任何潜在的读后写,写后读,或写后写危害。
为了在给定的主机线程中能够检索到被映射分页锁定存储器的设备指针,必须在调用任何CUDA运行时函数前调用cudaSetDeviceFlags(),并传入cudaDeviceMapHost标签。否则,cudaHostGetDevicePointer()将会返回错误。
一块分页锁定存储器可同时分配为被映射的和可分享的(前面的文章中提过),这种情况下,每个要映射这块存储器的主机线程必须调用cudaHostGetDevicePointer()检索设备指针,因为每个主机线程持有的设备指针一般不同。
如果设备不支持被映射分页锁定存储器,cudaHostGetDevicePointer()将会返回错误。应用可以检查canMapHostMemory属性应用以查询这种能力,如果支持映射分页锁定主机存储器,将会返回1。 注意:从主机和其它设备的角度看,操作被映射分页锁定存储器的原子函数不是原子的
cuda的Pinned Memory(分页锁定内存)相关推荐
- 明明有内存报错CUDA out of memory
RuntimeError: CUDA out of memory. Tried to allocate 2.42 GiB (GPU 0; 24.00 GiB total capacity; 113.8 ...
- 【Pytorch】内存够用但还是 RuntimeError: CUDA out of memory 问题解决
这里简述一下我遇到的问题: 可以看到可用内存是大于需要被使用的内存的,但他依旧是报CUDA out of memory的错误 我的解决方法是:修改num_workers的值,把它改小一点,就行了,如果 ...
- python pytorch爆显存,内存溢出问题解决方法(总结)RuntimeError: CUDA out of memory.
问题描述 在运行python程序时,随运行时间增长,内存疯狂增加,直至运行内存爆满,出现以下错误: RuntimeError: CUDA out of memory. 解决方法: 1.在模型验证和测试 ...
- 数据库服务器禁用虚拟内存,SQLServer因为OS虚拟内存不足而hang住异常解决-锁定内存页 (LPIM)...
SQLServer因为OS虚拟内存不足而hang住异常解决-锁定内存页 (LPIM) 发布时间:2020-08-13 12:30:03 来源:ITPUB博客 阅读:73 作者:guocun09 异常: ...
- CUDA out of memory. Tried to allocate 392.00 MiB (GPU 0; 10.76 GiB total capacity; 652.77 MiB alread
在使用Pytorch中,出现CUDA out of memory. Tried to allocate 392.00 MiB (GPU 0; 10.76 GiB total capacity; 652 ...
- RuntimeError: CUDA out of memory. Tried to allocate 132.00 MiB (GPU 2; 3.95 GiB total capacity; 3.41
pytorch报错:RuntimeError: CUDA out of memory. Tried to allocate 132.00 MiB (GPU 2; 3.95 GiB total capa ...
- pytorch出现RuntimeError: CUDA out of memory.
无论batch-size设置多小也是会出现这个问题的,我的原因是我将pytorch升级到了1.0.1,然后出现了这个问题 RuntimeError: CUDA out of memory. Tried ...
- 如何启用“锁定内存页”选项 (Windows)
默认情况下,禁用 Windows 策略"锁定内存页"选项.必须启用此权限才能配置地址窗口化扩展插件 (AWE).此策略将确定哪些帐户可以使用进程将数据保留在物理内存中,从而阻止系统 ...
- 内存溢出(out of memory)是内存不足吗?Outofmemory error怎么解决?
内存溢出(out of memory)是内存不足吗?Outofmemory error怎么解决? 内存溢出(out of memory)通俗理解就是内存不够,通常在运行大型软件或游戏时,软件或游戏所需 ...
- CUDA out of memory怎么解决
"CUDA out of memory" 错误可以通过以下几种方法解决: 减少 batch size 使用 GPU memory 压缩 重新分配 GPU 内存 卸载不必要的显存占用 ...
最新文章
- 阿里云大数据计算服务MaxCompute(下篇)
- [云炬创业管理笔记]第九章为创业成败而准备测试4
- 【TensorFlow篇】--Tensorflow框架实现SoftMax模型识别手写数字集
- C++(5)--运算符、表达式、条件结构(if, switch)
- 特斯拉再因致命Autopilot车祸被起诉 遭索赔逾1.5万美元
- 状态压缩动态规划 - 总结【普及+,提高-】
- VC++编程中的文件操作API和CFile类
- ButterKnife的安装与使用以及ButterKnife右键不显示的大坑
- Keil系列教程(汇总)
- Unity 导入图片安卓和IOS自动转换格式ETC2或者ASTC
- python的拼音_python 汉字按拼音排序
- 洛谷 3373 线段树
- 【SSM框架 一】Mybatis
- Flink教程(03)- Flink环境搭建
- 【夏令营QA】2021年中国人民大学信息学院 | 高瓴人工智能学院夏令营经验分享帖
- Java流程控制(一)
- 高仿糗事百科,完整版项目源码,带服务器部分
- 如何查看物理CPU和逻辑CPU
- java+SQL做学生信息管理系统(增删改查)
- 上市公司财务报告的那点事(9):用自己的语言解读《投资中最简单的事:投资方法》)
热门文章
- 2020牛客暑期多校训练营The Flee Plan of Groundhog(树形DP)
- Task5 | 结构方程 | “老年病”与身份的关系
- java 回归分析_机器学习的回归是什么
- aws打开慢_亚马逊AWS服务器访问较慢,如何快速访问AWS服务器呢?
- 银行的SWIFT CODE 和 IBAN CODE 和 ABA CODE 分别是什么意思
- android 加速度过滤,如何校准Android加速度计并降低噪音,消除重力
- python聊天小程序支持私聊和多人_Python 使用 django 框架实现多人在线匿名聊天的小程序...
- tailwindcss:弟弟们都往后稍稍
- GWAS 总体流程理解版
- a轮b轮c轮天使轮区别是什么?