为什么可分页内存很慢
了解普通 malloc 后面的暂存缓冲区
为什么可分页内存很慢 是 CoddyKit 上的免费 CUDA Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 CUDA Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 CUDA Academy 课程共包含 4 节课。
数据存放在哪里
使用 malloc 分配的普通 C++ 缓冲区位于可分页的主机内存中。它看似方便,但 GPU 无法直接从中复制数据,这个小细节会降低速度。
什么是可分页内存
当操作系统可以随时移动内存页,或将其换出到磁盘时,这些内存就是可分页的。这种方式灵活性很高,但对于需要固定地址的硬件来说却很棘手。
GPU 使用 DMA
GPU 使用 DMA 拉取数据。DMA 是一种直接硬件传输,需要一个不会移动的物理地址。可分页内存页无法保证这一点,因此不能直接使用。
隐藏的暂存步骤
为了解决这个问题,驱动程序会先将您的可分页缓冲区复制到隐藏的暂存缓冲区,再将其发送到 GPU。您需要为一次自己从未编写过的额外复制付出代价。😮
两次复制,而不是一次
因此,从可分页内存执行一次 cudaMemcpy 实际上包含两次复制:先从主机复制到暂存区,再从暂存区复制到设备。这项翻倍的工作正是可分页传输感觉缓慢的原因。
普通的 malloc
这是每个人最先使用的缓冲区。它确实能工作,但每次从 h_data 传输时,都会悄悄经过暂存区的绕行步骤。
float* h_data = (float*)malloc(N * sizeof(float));
cudaMemcpy(d_data, h_data, bytes, cudaMemcpyHostToDevice);操作系统为何在意
操作系统让内存保持可分页,以便能够超量分配 RAM,同时服务多个程序。这种便利也正是 GPU 无法直接读取您的内存页的原因。
您损失的带宽
可分页传输通常只能达到链路峰值带宽的一半。暂存复制会消耗 CPU 周期和内存流量,而这些资源原本可以用于真正的数据传输。
它也会阻止重叠
由于暂存复制是同步的,可分页传输无法真正与内核重叠。这样您就失去了让流发挥价值的异步技巧。
它何时仍然会造成影响
对于一次很小的复制,没有人会注意到影响。但在每次循环都传输数据的程序中,暂存开销会不断累积,并悄悄占据大部分运行时间。
修复方案即将到来
解决办法是向 CUDA 请求一块无法被换出的缓冲区,这称为锁页内存。GPU 可以直接读取它,无需暂存,也不会产生双重拷贝。
快速检查
为什么从普通可分页内存进行传输时,速度会比应有的更慢?
回顾
可分页缓冲区可以移动,因此 GPU 无法直接通过 DMA 访问它们。驱动程序会先将它们暂存,导致拷贝量翻倍。接下来要介绍的解决办法是使用锁页内存。🚀
用 AI 导师学习 C++ — 免费
在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。
- 课程
- 30
- 课程
- 120
常见问题解答
「为什么可分页内存很慢」课时是免费的吗?
是的 — 「为什么可分页内存很慢」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 CUDA Academy 课程的其余内容,请升级到 CoddyKit PRO。 CUDA Academy 课程共包含 4 节课。
「为什么可分页内存很慢」这节课中我会学到什么?
了解普通 malloc 后面的暂存缓冲区 你通过在浏览器中直接运行的动手代码来练习 CUDA Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 CUDA Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 CUDA Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「为什么可分页内存很慢」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 CUDA Academy 课中编写并运行代码吗?
能。每节 CUDA Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。