我正在考虑处理GPU上数据的可能性,对于GPU内存来说太大了,我有几个问题。
如果我正确理解了这一点,则使用映射内存,数据驻留在主内存中,并且仅在访问时才传输到GPU,因此分配比适合GPU内存的更多问题。
UVA类似于映射的内存,但是数据可以存储在CPU和GPU内存中。但是,GPU是否有可能在充满自己的数据时访问主内存(如映射内存)吗?在这种情况下,内存溢出会发生吗?我读到,使用映射的内存,数据直接进入本地内存而不会首先传输到全局的内存,在这种情况下,没有任何溢出。这是真的吗?
在CUDA 6.0中,UM不允许超级订阅GPU内存(并且通常不允许分配比GPU更多的内存,即使在主内存中),但是使用CUDA 8.0,这是可能的(https:https:https://devblogs.nvidia.com/parallelforall/beyond-gpu-memory-limits-unimied-memory-pascal/)。我做对了吗?
是的,使用映射(即固定,"零拷贝")方法,数据停留在主机内存中,并转移到GPU ON-DEMAND中,但永远不会居住在GPU内存中(除非GPU代码将其存储在此处)。如果多次访问它,则可能需要从主机多次转移。
uva(统一的虚拟地址请参见此处)与UM(统一内存,请参见此处)或托管内存(== UM)不同,因此我将这种情况称为UM,而不是UVA。
使用UM在Pascal设备上,UM"托管"分配将自动在CPU和GPU之间受到一些限制,但是您不能超额订阅GPU内存。所有普通GPU分配以及UM分配的最大数量不能超过GPU物理记忆。
使用UM Plus CUDA 8.0或更高版本以及Pascal或较新的GPU,您可以通过UM("托管")分配对GPU内存进行订阅。然后,这些分配名义上仅限于系统内存的大小(减去对系统内存的其他要求)。在这种情况下,使用需求要求方法,通过CUDA运行时,在主机和设备内存之间自动移动数据。
UVA不是CUDA中的实际数据管理技术。这是一项基础技术,可以启用某些功能,例如映射内存的某些方面,并且通常可以启用UM功能。