当前位置: 首页 > 面试题库 >

为什么CUDA固定内存这么快?

左丘照
2023-03-14
问题内容

当我使用固定内存进行CUDA数据传输时,我发现数据传输速度大大提高。在linux上,实现此目标的底层系统调用是mlock。从mlock的手册页中可以看出,锁定该页可防止将其换出:

mlock()将页面锁定在地址范围内,该地址范围从addr开始并持续len个字节。当调用成功返回时,保证所有包含指定地址范围一部分的页面都驻留在RAM中;

在测试中,我的系统上有几千个可用内存,因此从不存在内存页可以换出的任何风险,但我仍然观察到加速。任何人都可以解释这里的实际情况吗?任何见解或信息都将不胜感激。


问题答案:

CUDA驱动程序 检查
内存范围是否被锁定,然后它将使用其他代码路径。锁定的内存存储在物理内存(RAM)中,因此设备可以不需CPU的帮助即可获取它(DMA,又名异步复制;设备仅需要物理页面列表)。非锁定内存会在访问时产生页面错误,并且不仅存储在内存中(例如可以交换),因此驱动程序需要访问非锁定内存的每一页,将其复制到固定缓冲区中并传递给它。到DMA(同步,逐页复制)。

如此处所述http://forums.nvidia.com/index.php?showtopic=164661

异步mem复制调用使用的主机内存需要通过cudaMallocHost或cudaHostAlloc进行页面锁定。

我还建议您在developer.download.nvidia.com上查看cudaMemcpyAsync和cudaHostAlloc手册。HostAlloc说,CUDA驱动程序可以检测固定内存:

驱动程序跟踪使用this(cudaHostAlloc)函数分配的虚拟内存范围,并自动加速对诸如cudaMemcpy()之类的函数的调用。



 类似资料:
  • 我们的软件正在通过一个从内存流读取数据的GZipStream解压某些字节数据。这些数据以4KB的块解压缩,并写入另一个内存流。 我们已经意识到进程分配的内存远高于实际解压的数据。 示例:具有2425536字节的压缩字节数组被解压缩为23050718字节。我们使用的内存分析器显示了方法MemoryStream。设置容量(Int32值)分配的67104936字节。这是保留内存和实际写入内存之间的2.9

  • 问题内容: 本着Java的精神:为什么存在MaxPermSize?,我想问一下为什么Sun JVM对其内存分配池的大小使用固定的上限。 默认值为物理RAM的1/4(有上限和下限);结果,如果您有一个内存消耗大的应用程序,则必须手动更改限制(参数- Xmx),否则您的应用程序将运行不佳,甚至可能因OutOfMemoryError崩溃而崩溃。 为什么这个固定限制甚至存在?为什么JVM不能像大多数操作系

  • 我运行的是Arch Linux,并从存储库中安装了cuda sdk和cuda工具包。我已经编译了/opt/cudasdk/CUDALibraries中的库。 不,我运行make in /opt/cuda-sdk/C编译sdk示例,得到以下错误: Makefile本身似乎只包含文件/opt/cudasdk/C/common/common。mk,即: Echo$LD_LIBRARY_PATH的输出为空

  • 我目前正试图了解x86_64上某些环路的性能属性(具体来说,我的Intel(R)Core(TM)i3-8145U CPU@2.10GHz处理器)。具体来说,在循环体中添加一条额外的指令来读取内存,几乎可以将性能提高一倍,而细节并不特别重要。 我一直在使用一个由两个主要部分组成的测试程序:一个测试循环和一个正在测试的函数。测试循环运行测试2下的函数32次,每次一个有符号32位整数作为参数(按INT\

  • 问题内容: 我尝试弄清楚当我需要固定(页面锁定)内存时,CUDA(或OpenCL实现)是否能说明问题。 我尝试查看了和的值,并且都保持为0且从未上升(报告也为0)。我曾经使用过页面锁定内存,并且值按预期上升。 因此,此行为的两个可能原因可能是: 我没有从CUDA API获得页面锁定的内存,而cudaSuccess是伪造的 CUDA绕开了页面锁定内存的OS计数器,因为CUDA对Linux内核做了一些

  • 问题内容: 这是所有编程语言所共有的吗?在进行多次打印后再执行println似乎更快,但是将所有内容移动到字符串中并仅进行打印似乎最快。为什么? 编辑:例如,Java可以在不到一秒钟的时间内找到所有高达100万的质数- 但要进行打印,然后在自己的println中将它们全部输出可能需要几分钟!最多可打印100亿小时! 例如: 问题答案: 速度并不慢,而是由主机操作系统提供的与控制台连接的基础。 您可