【发布时间】:2020-09-16 14:57:25
【问题描述】:
在 Nvidia 开发者博客中:An Even Easier Introduction to CUDA 作者解释道:
要在 GPU 上进行计算,我需要分配可由 显卡。 CUDA 中的统一内存通过提供单个 系统中所有 GPU 和 CPU 可访问的内存空间。到 在统一内存中分配数据,调用
cudaMallocManaged(),即 返回可以从主机 (CPU) 代码或设备访问的指针 (GPU) 代码。
我发现这既有趣(因为它看起来可能很方便)又令人困惑:
返回一个指针,您可以从主机 (CPU) 代码或设备访问该指针 (GPU) 代码。
要做到这一点,cudaMallocManaged() 似乎必须在 VRAM 和 RAM 之间同步 2 个缓冲区。是这样吗?还是我的理解不够?
到目前为止,在我通过GPU.js 在 WebGL 抽象层之上使用 GPU 加速的工作中,我了解到将基于 VRAM 的缓冲区(WebGL 中的纹理)从内核传递到内核(将缓冲区保留在 GPU 上)之间的明显性能差异,高性能)并在内核之外检索缓冲区值以通过 JavaScript 在 RAM 中访问它(将缓冲区从 GPU 中拉出,由于 GPU 上的 VRAM 中的缓冲区不会神奇地移动到 RAM,因此性能受到影响)。
请原谅我对这个主题的高度抽象的理解/描述,因为我知道大多数 CUDA / C++ 开发人员对这个过程有更细致的理解。
-
cudaMallocManaged()在两个 RAM 中创建同步缓冲区也是如此 和 VRAM 以方便开发人员? - 如果是这样,在以下情况下这样做不会带来不必要的成本 我们可能永远不需要用 CPU 接触那个缓冲区?
- 编译器是否可能只是检查我们是否曾经引用过该缓冲区 来自 CPU 并且永远不会创建同步缓冲区的 CPU 端,如果它是 不需要?
- 还是我全都错了?我们甚至不是在谈论 VRAM 吗?如何 这项工作?
【问题讨论】:
-
@RobertCrovella 谢谢!啊哈,所以它是在 RAM 和 VRAM 之间复制的,但是您实际上可以对如何完成进行一些控制。