c++ - cudaMallocManaged()是否在RAM和VRAM中创建同步缓冲区?

标签 c++ cuda

在Nvidia开发人员博客中:An Even Easier Introduction to CUDA,作者解释:

To compute on the GPU, I need to allocate memory accessible by the GPU. Unified Memory in CUDA makes this easy by providing a single memory space accessible by all GPUs and CPUs in your system. To allocate data in unified memory, call cudaMallocManaged(), which returns a pointer that you can access from host (CPU) code or device (GPU) code.


我发现这既有趣(因为它看起来可能很方便)又令人困惑:

returns a pointer that you can access from host (CPU) code or device (GPU) code.


为了做到这一点,似乎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吗?如何
    这项工作?
  • 最佳答案

    So is cudaMallocManaged() creating synchronized buffers in both RAM and VRAM for convenience of the developer?


    是的,或多或少。 “同步”在托管内存模型中称为数据迁移。对所有可见的处理器进行虚拟地址划分,然后将数据迁移(即移动到该物理地址并为其提供物理分配)以尝试访问它。

    If so, wouldn't doing so come with an unnecessary cost in cases where we might never need to touch that buffer with the CPU?


    如果您永远不需要触摸CPU上的缓冲区,那么将发生在CPU VA空间中进行VA分割,但是不会对其进行物理分配。当GPU尝试实际访问数据时,它将导致分配“显示”并耗尽GPU内存。尽管要确保有“成本”,但是在这种情况下不会占用CPU(物理)内存。此外,一旦在GPU内存中实例化,GPU对其进行访问就不会产生任何额外的费用;它应该以“全速”运行。实例化/迁移过程是一个复杂的过程,在这里我要描述的是我认为的“主要”模态或行为。有很多因素可能会影响这一点。

    Does the compiler perhaps just check if we ever reference that buffer from CPU and never create the CPU side of the synced buffer if it's not needed?


    不,这是由运行时而不是编译时管理的。

    Or do I have it all wrong? Are we not even talking VRAM? How does this work?


    不,您没有错。是的,我们正在谈论VRAM。
    您引用的博客几乎没有涉及托管内存,这是一个相当复杂的主题。有许多在线资源可了解更多信息。您可能需要查看其中的一些内容。 here是一个。在托管内存上有不错的GTC演示,包括here。 CUDA编程指南中还有一个entire section,涉及托管内存。

    关于c++ - cudaMallocManaged()是否在RAM和VRAM中创建同步缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63922776/

    相关文章:

    python - LoweringError 是什么意思?

    c++ - Cuda 9 RC + VS2017 + CMake 不工作

    cuda - N-Body CUDA 优化

    c++ - 使用头文件/源文件来分离接口(interface)和实现

    cuda - 使用cudaMalloc分配矩阵

    c++ - 分配给引用 c++ 的后增量

    c++ - 使用引用该对象的基类指针 vector 打印派生类对象

    c++ - 为什么这个 CUDA 内核给出与原始代码不同的结果?

    c++ - 为什么我的二维数组不旋转?

    c++ - C++ 方法 ostream::exceptions(iostate state) 的行为应该是什么?