具有映射内存、统一虚拟寻址和统一内存的 GPU 内存超额订阅
GPU memory oversubscription with mapped memory, Unified Virtual Addressing and Unified Memory
我正在考虑在 GPU 上处理数据的可能性,这对 GPU 内存来说太大了,我有几个问题。
如果我理解正确,使用映射内存,数据驻留在主内存中,仅在访问时传输到 GPU,因此分配超过 GPU 内存的内存应该不是问题。
UVA类似于映射内存,但数据可以同时存储在CPU和GPU内存中。但是 GPU 是否有可能在充满自己的数据的同时访问主内存(与映射内存一样)?在这种情况下会发生内存溢出吗?我已经读过,使用映射内存,数据直接进入本地内存,而不是先传输到全局内存,在这种情况下,不应该有任何溢出。这是真的吗?如果是的话,UVA 也是这样吗?
在 CUDA 6.0 中,UM 不允许超额订阅 GPU 内存(并且通常不允许分配比 GPU 拥有的内存更多的内存,即使是在主内存中也是如此),但是对于 CUDA 8.0,它成为可能( https://devblogs.nvidia.com/parallelforall/beyond-gpu-memory-limits-unified-memory-pascal/)。我没看错吗?
是的,使用映射(即固定,"zero-copy")方法,数据保留在主机内存中并按需传输到 GPU,但永远不会驻留在 GPU 内存中(除非 GPU 代码存储它那里)。如果多次访问,可能需要从主机多次传输。
UVA(统一虚拟寻址参见 here) is not the same thing as UM (Unified Memory, see here)或托管内存 (== UM),因此我将这种情况称为 UM,而不是 UVA。
在 pre-pascal 设备上使用 UM,UM "managed" 分配将在 CPU 和 GPU 之间自动移动,但会受到一些限制,但您不能超额订阅 GPU 内存。所有普通GPU分配加上UM分配的最大量不能超过GPU物理内存。
使用 UM 加上 CUDA 8.0 或更高版本加上 Pascal 或更新的 GPU,您可以使用 UM ("managed") 分配超额订阅 GPU 内存。然后这些分配名义上限制为系统内存的大小(减去对系统内存的任何其他需求)。在这种情况下,CUDA 运行时使用请求分页方法自动在主机和设备内存之间来回移动数据。
UVA 并不是 CUDA 中的实际数据管理技术。它是一种支持某些功能的基础技术,例如映射内存的某些方面,并且通常支持 UM 功能。
我正在考虑在 GPU 上处理数据的可能性,这对 GPU 内存来说太大了,我有几个问题。
如果我理解正确,使用映射内存,数据驻留在主内存中,仅在访问时传输到 GPU,因此分配超过 GPU 内存的内存应该不是问题。
UVA类似于映射内存,但数据可以同时存储在CPU和GPU内存中。但是 GPU 是否有可能在充满自己的数据的同时访问主内存(与映射内存一样)?在这种情况下会发生内存溢出吗?我已经读过,使用映射内存,数据直接进入本地内存,而不是先传输到全局内存,在这种情况下,不应该有任何溢出。这是真的吗?如果是的话,UVA 也是这样吗?
在 CUDA 6.0 中,UM 不允许超额订阅 GPU 内存(并且通常不允许分配比 GPU 拥有的内存更多的内存,即使是在主内存中也是如此),但是对于 CUDA 8.0,它成为可能( https://devblogs.nvidia.com/parallelforall/beyond-gpu-memory-limits-unified-memory-pascal/)。我没看错吗?
是的,使用映射(即固定,"zero-copy")方法,数据保留在主机内存中并按需传输到 GPU,但永远不会驻留在 GPU 内存中(除非 GPU 代码存储它那里)。如果多次访问,可能需要从主机多次传输。
UVA(统一虚拟寻址参见 here) is not the same thing as UM (Unified Memory, see here)或托管内存 (== UM),因此我将这种情况称为 UM,而不是 UVA。
在 pre-pascal 设备上使用 UM,UM "managed" 分配将在 CPU 和 GPU 之间自动移动,但会受到一些限制,但您不能超额订阅 GPU 内存。所有普通GPU分配加上UM分配的最大量不能超过GPU物理内存。
使用 UM 加上 CUDA 8.0 或更高版本加上 Pascal 或更新的 GPU,您可以使用 UM ("managed") 分配超额订阅 GPU 内存。然后这些分配名义上限制为系统内存的大小(减去对系统内存的任何其他需求)。在这种情况下,CUDA 运行时使用请求分页方法自动在主机和设备内存之间来回移动数据。
UVA 并不是 CUDA 中的实际数据管理技术。它是一种支持某些功能的基础技术,例如映射内存的某些方面,并且通常支持 UM 功能。