我正在考虑在GPU上处理数据的可能性,这对GPU内存来说太大了,我有几个问题。
如果我理解正确的话,对于映射内存,数据驻留在主内存中,并且只有在访问时才会传输到GPU,因此分配不仅适合GPU内存不应该是一个问题。 / p>
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/)。我做对了吗?
答案 0 :(得分:2)
是的,使用映射(即固定,"零拷贝")方法,数据保留在主机内存中并按需传输到GPU,但永远不会驻留在GPU内存中(除非GPU代码存储在那里)。如果您多次访问它,则可能需要多次从主机传输它。
UVA(统一虚拟寻址请参阅here)与UM(统一内存,请参阅here)或托管内存(== UM)不同,因此我将此案称为UM,而不是UVA。
在预先帕斯卡设备上使用UM,UM"托管"分配将在CPU和GPU之间自动移动,但受到一些限制,但您不能超额预订GPU内存。所有普通GPU分配和UM分配的最大数量不能超过GPU物理内存。
使用UM + CUDA 8.0或更高版本以及Pascal或更新的GPU,您可以使用UM("托管")分配来超额预订GPU内存。然后,这些分配名义上限于系统内存的大小(减去系统内存上的其他任何要求)。在这种情况下,数据在主机和设备内存之间由CUDA运行时使用请求分页方法自动来回移动。
UVA不是CUDA中的实际数据管理技术。它是一种基础技术,可以启用某些功能,例如映射内存的某些方面,并且通常启用UM功能。