c++ - CUDA - 统一内存(至少帕斯卡)
问题描述
我想澄清一下统一内存,它是如何工作的以及如何有效地使用它。
据我所知,我们使用cudaMallocManaged(ptr, size);
统一内存来分配数组。由于 Pascal 架构,可以将大小设置为大于 GPU 上可用的物理内存。
假设现在我有一个 4GB RAM、32GB RAM 用于主机和一个 1TB 文件的 GC。我想处理这个 1TB 的文件,我该如何处理?
如果我理解得很好,我可以将文件放在统一内存中,但是这个统一数组和文件之间的链接是如何进行的呢?这是否意味着我必须memcpy
使用分配的指针中的整个文件cudaMallocManaged
?
最后,告诉我我是否正确。如果 GPU 出现未命中,CPU 将发送它存储在其 RAM 中的数据,如果不是从磁盘发送。它有点简化,但如果它像这样工作,则意味着数据需要在统一数组中。
谢谢您的帮助。
解决方案
我的回复假设您在 Linux 上运行 CUDA 9.x 或更高版本、Pascal 或 Volta GPU。
您将能够超额订阅 GPU 内存,最高可达主机内存的大小(即主机操作系统允许您分配的任何内存),减去任何内存分配过程中常见的合理数量(您不应该期望分配主机内存的每个最后一个字节,同样不应尝试对托管内存分配做同样的事情)。
统一内存与文件或磁盘上存储的任何内容之间没有链接。
就像您可能无法将整个 1TB 文件加载到 32GB 的 RAM 中一样,您也无法使用托管内存一次访问所有文件。无论主机操作系统允许您分配/加载多少,您将拥有 GPU 可用的大小。
因此,为了处理该 1TB 文件,您可能需要提出一种算法,将其分解为适合系统 RAM 的部分。这个概念完全独立于托管内存。此后,如果您想使用 CUDA 访问系统 RAM 中的文件,您可以使用托管内存,包括超额订阅,如果您愿意的话。
将文件分解成碎片的确切过程将取决于您正在执行的处理类型,并且对 CUDA 没有特别的依赖性。
推荐阅读
- rest - 根据 REST 查询中的城市名称检索所有地区
- multithreading - QThread::idealThreadCount() 总是返回“2”
- php - 每块 10 个 ID 更改表格颜色
- android - 当数据来自通知时,Android MapFragment 为空白
- javascript - 你能在这个 HTML/JavaScript 中找到错误吗?
- angular - 一旦我离开视图并重新进入,可观察到的离子 4 角路线不起作用
- java - getInt 中的 Android SharedPreferences 异常
- vue.js - 如何修改 vue-cli 的 vue-loader 来更新 transformAssetsUrl
- r - 如何在 rmarkdown 中使用 results='asis' 显示格式化的 R 输出
- .net - 在获得批准后使用 jenkinsfile 构建促销