CUDA 统一内存是否可以解决较新 GPU 上的数据移动问题?

问题描述 投票:0回答:1

CUDA统一内存如何处理数据移动?

假设我有一个如下所示的程序 -

cudaMallocManaged(&y, ...);
host_kernel(y);
device_kernel(y);
host_kernel(y);
device_kernel(y);
host_kernel(y);
device_kernel(y);

设备和主机内核之间的数据移动是否会导致性能下降?

如果依赖于 GPU,那么从哪一代 GPU 开始变得高效?计算能力 6+ (Pascal) 就足够了吗? https://developer.nvidia.com/blog/unified-memory-cuda-beginners/#what_happens_on_pascal_when_i_call_cudamallocmanagement

我是否需要预取主机上的数据以减少数据移动开销? https://developer.nvidia.com/blog/unified-memory-cuda-beginners/#what_happens_on_pascal_when_i_call_cudamallocmanagement

为了获得更好的性能,我是否应该想出一种算法来仅分配适合 GPU 的内存量,然后分配下一批? https://stackoverflow.com/a/50683703/4647107

memory cuda unified-memory
1个回答
0
投票

这里的一般传统观点是,您应该在每一步中将

y
预取到正在使用它的处理器。

在具有任何 GPU 的 Windows 上,或者在具有 Maxwell 或更旧 GPU 的 Linux 上,UM 的运行方式是在您的示例中“自动”预取数据,并且通常是高效的。

如果您在其他情况下(Linux、Pascal 和更新版本)不预取数据,那么您可能会遇到数据移动按需分页且低效的可能性。

设备和主机内核之间的数据移动是否会导致性能下降?

是的,如果您使用的是 Pascal 或更新的 GPU 上的 Linux,并且您没有进行合理的预取,那么您将依赖于数据的按需分页移动,与批量复制相比,批量完成时效率很低例如通过

cudaMemcpy
.

我是否需要预取主机上的数据以减少数据移动开销?

是的,为了避免由于数据的按需分页移动而造成效率损失,在 Linux 上,您通常应该预取数据,即使是在最新的 GPU 上。

为了获得更好的性能,我是否应该想出一种算法来仅分配适合 GPU 的内存量,然后分配下一批?

我一般不建议超额认购,除非作为最后的手段。如果您了解需要如何移动数据,通常最好自己移动它,例如通过预取。超额认购对此没有任何帮助。

© www.soinside.com 2019 - 2024. All rights reserved.