CUDA - 统一内存(至少是帕斯卡)
CUDA - Unified memory (Pascal at least)
我想澄清一下统一内存,它是如何工作的,以及如何有效地使用它。
据我所知,我们使用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 没有特别的依赖性。
在某些系统上可能会超额订阅 CPU 内存。使用 NVLink 上的 Power 9 + V100,可以使用操作系统的地址转换服务 (ATS(,如此处所述。
这样做,即使主机系统上的 RAM 量要小得多,也可以使用来自 GPU 的 1TB 数据。要执行的操作如下:
- 创建一个文件 - 用于备份 1TB 数据 - 您只需要一个可以
mmap
的文件描述符。 - 使用
mmap
将整个文件映射到虚拟地址空间(实验系统上的限制为 49 位,即 512 TB(。 - 将该指针传递给内核调用。
发生的情况是,操作系统分页机制将按需分页出文件的分页块,并且 GPU 将依赖 ATS 进行此操作。
没有提到,也没有在x86_64和/或上一代GPU和/或PCI-Express连接系统上成功测试此类练习。
- C++:试图通过组合和帕斯卡三角形来理解constexpr
- 如何在C++的帕斯卡三角形中打印曲棍球棒的元素?
- CUDA - 统一内存(至少是帕斯卡)
- 找到一个数字平方和是质数(帕斯卡或C++)的数字
- 有人知道一个模仿帕斯卡"range array"的类吗?
- 找到第1500行帕斯卡三角形中的每个数字
- 需要使用帕斯卡三角形 (x+y) 打印二项式系数
- 帕斯卡三角形程序 C++ 上的间距
- 为什么我在计算帕斯卡三角形元素时在递归 C 程序中出现堆栈溢出错误
- C++:如何生成帕斯卡三角形的'nth'线?
- 从C++打电话给斯卡拉帕克
- 帕斯卡三角形|李特码错误答案
- 帕斯卡三角形实现
- 帕斯卡的模数
- 以C++为中心帕斯卡三角形输出
- 帕斯卡的读密钥是否有等效项;在 C 还是C++?
- 我如何解释这个帕斯卡部分C++
- 为什么这个帕斯卡三角形程序不起作用?
- c++生成帕斯卡三角形,输出错误
- C++:帕斯卡三角形 - 奇怪的结果