GpuMmu Model (MSDN翻译)
GpuMmu mode
在GpuMmu模式中,GPU拥有自己的内存管理单元(Mmu),Mmu能够将每个进程使用的GPU VA翻译成物理地址。
每个进程拥有独立的CPUVA和GPUVA地址空间,并分别使用相应的页表。VMM管理者所有进程的GPUVA空间,并且负责分配,增长,更新,保证residency和释放页表。这个硬件格式的页表被GPU MMU使用,对于VMM是无意义的,并且再通过DDI传递时也是抽象过的。这个抽象就提供了对地址的多级翻译特性,这个特性包括了一个固定大小的子叶表和可resizable的根页表。
虽然VMM负责管理GPU VA和隐藏在背后的页表,但是它并不会自动地给Allocation分配GPU VA.这个责任就交给了UMD。
VMM给UMD提供了两套服务。首先UMD可以通过已经有的Allocate接口分配VideoMemory并且通过Deallocate接口来释放VideoMemory。同样的,这个服务器返回给UMD一个指向VMM Allocation的句柄。这个句柄能够被GPU引擎操作。这种VMM Allocation只是代表了真正Allocation的一部分,这部分可以被一个引擎引用,并且通过Allocation list reference被实际的操作访问。
对于运行在虚拟模式下的引擎,要访问一个GPU VA必须先显式的指定给一个Allocation,然后才能被引擎实际访问到。为了这个目的VMM提供给了UMD一些服务来保留(reserve)或释放(free)GPU VA以及将指定的Allocation 内存范围映射(map)到一个进程中的GPUVA空间内。这些服务非常易用,让UMD能够以适当的力度来控制一个进程的GPUVA空间。UMD能够决定指定一块特定的GPUVA给一个Allocation,或者是让VMM自动选择一个有效的GPUVA映射给Allocation,当然也能给这一过程加上一些限制条件,例如限制挑选GPU VA的最大地址和最小地址区间。一个Allocation能够被映射多个GPU VA。这种服务可以让UMD实现Tile Resource contract特性。
类似的,在LDA下,UMD还需要显式的映射GPUVA到指CPU和定的Allocation实例,并且还需要决定每一个映射关系当前GPU有效还是对其他GPU有效。在LDA模式下CPU和GPU VA都被分别映射给一个Allocation.UMD能够决定让VA在两个不同的VA空间中保持一致或者根本不相关。
GPUVA被DDI接口逻辑上固定为4kb一页的力度管理着。GPUVA可以映射的Allocation可以存在于memory segment中或者是System Memory中。System Memory 被逻辑上固定为4kb一页的粒度被管理。而memory segment可以为4kb或64kb一页,这取决于驱动的选择。所有VMM Allocation要求以页面大小来进行对齐和大小分配。
访问一个无效的GPU VA会导致一个访问违规,而一个Context或者device的终止回导致访问失败。对于恢复这样的错误,VMM会初始化一个引擎重置过程,如果这个对设备或context的重置过程失败则会引起整个显卡的TDR。GpuMmu模式图示如下: