映射内存和 gpu::CudaMem 用法

Tho*_*oth 1 opencv cuda gpu

我想知道是否有可能避免 gpu 和设备之间的内存传输。我最近读到映射内存就是为此目的,如果我错了,请纠正我。

  1. 可以分配多少映射内存?
  2. 当我们使用映射内存时,gpu 的全局内存未使用?
  3. 相反,在上传数据的gpu::GpuMatOpenCV中可以使用我们ALLOC_ZEROCOPY
    GPU :: CudaMem节省上传时间像这样
  4. 如果是的话,你能举个例子吗?

谢谢!

Rog*_*ahl 5

可以分配多少映射内存?

这取决于操作系统和可用的物理内存量。CUDA 驱动程序从 OS 非分页池分配映射内存。例如,对于 64 位 Windows 7,这可以是物理内存的 75% 或 128GB,以较小者为准。有关详细信息,请参阅http://blogs.technet.com/b/markrussinovich/archive/2009/03/26/3211216.aspx

当我们使用映射内存时,gpu 的全局内存未使用?

对于问题所暗示的离散 GPU,GPU 内存保持未使用状态。请参阅 NVIDIA 关于映射和固定内存的白皮书:https : //devtalk.nvidia.com/cmd/default/download-comment-attachment/50683/

我们可以在 gpu::CudaMem 中使用 ALLOC_ZEROCOPY 来节省像这样的上传时间,而不是在 opencv 中的 gpu::GpuMat 中上传数据吗?

“zerocopy”缓冲区被映射和固定。请记住,分配映射和固定内存时,内存配置的物理现实不会改变。对于离散 GPU,数据仍然必须通过 PCI 或 PCIe 总线从主机复制到设备。它只是隐式发生而不是显式发生。您可以编写更少的代码,但可能无法提高性能(在独立 GPU 上)。

如果是的话,你能举个例子吗?

帮不了你这个。