我有一个关于显卡内存使用的问题。当使用的应用程序需要的内存超过显卡所包含的内存时会发生什么?假设保留的主内存也不够用。
我正在谈论的场景是这样的:
考虑一个图形卡,比方说,50 MB 内存可用于纹理信息。为纹理数据保留的主存空间也在 50 MB 左右。我要运行的应用程序包含同时需要的五个数据集,每个 25 MB,因此您总共有 100 MB 内存,但需要 125 MB。
我有一个关于显卡内存使用的问题。当使用的应用程序需要的内存超过显卡所包含的内存时会发生什么?假设保留的主内存也不够用。
我正在谈论的场景是这样的:
考虑一个图形卡,比方说,50 MB 内存可用于纹理信息。为纹理数据保留的主存空间也在 50 MB 左右。我要运行的应用程序包含同时需要的五个数据集,每个 25 MB,因此您总共有 100 MB 内存,但需要 125 MB。
最常见的情况是您无法分配比 GPU 卡物理可用的内存块更大的内存块。但是,根据您的硬件和驱动程序,最大可分配大小可能只是物理安装的总内存的一小部分(例如,旧的 AMD opencl 驱动程序只允许最大 500 MB),因此最好阅读供应商(NVIDIA、AMD 或 Intel)。
如果您的实现的 GPU 内核需要访问的全局或本地/共享内存多于一次可以分配的内存,那么您必须通过分配和释放内存段(小于最大内存)来手动管理内存) 并根据需要在主机和 GPU 之间传输它们。
就我的经验而言,内存管理对于实现 GPU 应用程序的高性能至关重要。其原因在于,对于大多数应用程序而言,通过 PCIe 在主机和 GPU 之间传输数据可能会成为一大瓶颈。为了说明 PCIe 问题,请考虑 PCIe 2.0(x16 通道)的最大双向带宽为 8 GB/s,而从板载 GPU 内存到 GPU 芯片的带宽为 +140 GB/s。此外,GPU 的所有微小内核每秒可以共同处理数 TB 的数据,因此大多数高性能 GPU 内核还需要有效利用共享/本地和寄存器内存(这比访问全局内存快几个数量级) .
显式内存管理的一种替代方法是使用 opencl 扩展,其中 GPU 内核可以从离散的 GPU 芯片直接访问驻留在主机上的内存段(据我所知,AMD 允许这样做)。在这种情况下,GPU 将停止执行,直到从主机接收到数据,从 GPU 线程的角度来看,这可能是一个很长的时间。
当 CPU 和 GPU 集成在同一个芯片中时,会发生更有趣的情况。在这种情况下,CPU 和 GPU 共享主机内存(考虑 AMD 的融合架构),因此不需要在主机和设备之间复制数据。
至少在 NVIDIA 卡上,可以在 CPU 上分配固定内存供显卡使用。指向此内存块的指针位于 GPU 的全局内存空间中(因此您的内核可以访问它们),但对它们的读/写仍必须通过 PCI-E 总线。缺点是你不能使用太多的内存,否则你的操作系统会生你的气。这就是您所说的“保留主内存”吗?
也可以一次处理计算/内存传输,因此如果应用程序不需要一次所有数据,您可以让内核在下一批传输时处理一段数据,对结果进行处理,然后继续处理和传输。
编辑:参考您的具体示例,也可以在纹理内存中存储 50 kB,在全局中存储 50 kB(我假设这就是您的意思是 main?),然后找到其他地方来压缩最后的 25kB,就像永恒的记忆。您将只能阅读最后 25 kB,因此这可能不适用于所有情况。如前所述,另一种选择是使用固定内存。常量内存的优点是数据实际上是在设备上,但只读限制对于某些应用程序可能过于繁重。