我有一台配备专用 GPU(Nvidia Quadro P3200)的笔记本电脑。它有 6 GB 的 RAM。
该笔记本电脑还配备 32 GB 的“正常”(CPU?)RAM。
我计划使用 GPU 进行并行计算,运行物理模拟。其中一些涉及相当大的阵列。
我只是想知道,如果我的内核中的总内存(所有变量和所有数组)达到 6 GB 的 GPU RAM,我可以以某种方式使用 CPU 的内存吗?
在计算期间我不会将笔记本电脑用于其他任何用途,因此主 RAM 应该不会很忙。
附言:我正在使用 Dell Precision 7530,Windows 10。
答案1
简短的回答:不可以。
较长的回答:带宽,更重要的是,通过 PCIe 总线的 GPU 和 RAM 之间的延迟比 GPU 和 VRAM 之间的延迟要差一个数量级,所以如果您要这样做,您还不如在 CPU 上进行数字运算。
CPU可以使用部分VRAM(部分映射到 PCI 孔径,通常为 256MB)直接用作 RAM,但由于 PCIe 是瓶颈,因此它会比常规 RAM 慢。将其用于交换之类的用途可能是可行的。
以前可以通过更改 GPU BIOS 上的带位来增加内存孔径大小,但自从 Nvidia Fermi (GeForce 4xx) GPU 以来,我还没有尝试过这种方法。如果它仍然有效,则还需要您的 BIOS 能够完成映射大于标准孔径的任务(在笔记本电脑上测试过的可能性很小)。
例如,Xeon Phi 计算卡需要将其整个 RAM 映射到 PCI 孔径中,因此它需要主机中具有 64 位 BIOS,该 BIOS 知道如何映射传统 4GB(32 位)边界以上的孔径。
答案2
是的。这是 CPU 和 GPU 之间的“共享”内存,并且总是需要少量内存作为缓冲区来在 GPU 上传输数据,但它也可以用作显卡的较慢“备份”,就像页面文件是主内存的较慢备份存储一样。
您可以在内置 Windows 任务管理器中转到“性能”选项卡并单击您的 GPU,找到正在使用的共享内存。
不过,共享内存会比 GPU 内存慢,但可能比磁盘快。共享内存将是您的 CPU 内存,在较新的机器上,其运行速度可能高达 30GB/s,但 GPU 内存可能能够达到 256GB/s 或更高。您还会受到 GPU 和 CPU 之间的链接(即 PCIe 桥)的限制。这可能是您的限制因素,您需要知道您拥有的是 Gen3 还是 Gen4 PCIe,以及它使用了多少个通道(通常为“x16”),才能找出 CPU 和 GPU 内存之间的总理论带宽。
答案3
据我所知,你可以共享主机的 RAM,只要它是页面锁定(固定)内存。在这种情况下,数据传输将会更快,因为您不需要明确传输数据,您只需要确保同步您的工作(例如cudaDeviceSynchronize
,如果使用 CUDA)。
现在,对于这个问题:
我只是想知道,如果我的内核中的总内存(所有变量和所有数组)达到 6 GB 的 GPU RAM,我可以以某种方式使用 CPU 的内存吗?
我不知道是否有办法“扩展” GPU 内存。我不认为 GPU 可以使用比其自身更大的固定内存,但我不确定。我认为在这种情况下您可以做的是分批工作。您的工作是否可以分散,以便您一次只处理 6gb,保存结果,然后处理另一个 6gb?在这种情况下,分批工作可能是一个解决方案。
例如,您可以实现如下简单的批处理方案:
int main() {
float *hst_ptr = nullptr;
float *dev_ptr = nullptr;
size_t ns = 128; // 128 elements in this example
size_t data_size = ns * sizeof(*hst_ptr);
cudaHostAlloc((void**)&hst_ptr, data_size, cudaHostAllocMapped);
cudaHostGetDevicePointer(&dev_ptr, hst_ptr, 0);
// say that we want to work on 4 batches of 128 elements
for (size_t cnt = 0; cnt < 4; ++cnt) {
populate_data(hst_ptr); // read from another array in ram
kernel<<<1, ns>>>(dev_ptr);
cudaDeviceSynchronize();
save_data(hst_ptr); // write to another array in ram
}
cudaFreeHost(hst_ptr);
}
答案4
当使用以下关键词时,这个问题目前是热门搜索结果:游戏可以使用 RAM 而不是 VRAM 吗?
因此,我认为值得补充的是,许多与游戏 RAM 与 VRAM 使用相关的问题已经随着智能访问内存技术而改变,该技术目前由 AMD Zen 3 CPU(如 Ryzen 5 5600X 和 Ryzen 7 5800X)和 AMD 6000 系列 GPU(如 AMD Radeon RX 6800)支持,并且将在未来几周内得到 Nvidia RTX 3000 系列 GPU 的支持,随后第 11 代英特尔 CPU 也将支持该技术,但英特尔版本的技术,以及在某些 AMD 主板上使用的名称,是可调整大小的 BAR。
该技术本质上为 CPU 提供了更多的 VRAM 访问权限,但最终是否也能以相反的方式运行(即 GPU 可以访问更多的 RAM)仍有待观察。