本文将会介绍Intel GPU的内存管理。由于不同GPU的参数可能不一致,本文给出的参数是demo性质的,如果想要查看GPU的具体参数,请参考HARDWARE SPECIFICATION - PRMS

对于GPU的应用而言,GPU的virtual memory address space分为两部分,分别是global graphic memory和local graphic memory。在本文接下来的内容中,我们将global graphic memory和local graphic memory的大小设置为2GB。

global graphic memory

对于GPU的global graphic memory,是所有进程共享的:即所有的进程共用这2GB的虚拟地址空间。

当GPU访问global graphic memory时,利用global graphics translation table (GGTT) 来完成虚拟地址到物理地址的映射,过程如下图所示(可以将GGTT看作是GPU的页表,同时GGTT是一级页表,而寻址过程是由硬件来完成的)。

global graphic memory的部分内存,可以handle tilling的细节,我们称之为aperture。CPU的虚拟地址空间与GPU的虚拟地址空间是相互独立的,因此,CPU如果想要访问aperture,就需要将aperture mmap到CPU的虚拟地址空间。

如上图所示,在GPU的global graphic memory中,0~FFFFFF的内容是aperture,而CPU将aperture内存mmap到C000000~CFFFFFF地址范围内,这样CPU就可以访问aperture了。

对于global graphic memory的访问, 如果没有tiling的要求,可以直接map mem page to CPU VA,并使用CPU VA就可以了。

如果是有tiling的话,将aperture映射到CPU VA即可。(GPU aperture用来帮着handle tiling的细节)。 当然,非tiling的时候,也可以这样mapping aperture。

local graphic memory

对于GPU的local graphic memory,每个进程都有2GB的虚拟地址空间。GPU通过per-process graphics translation table(PPGTT)来完成地址翻译,过程如下图所示。

值得注意的是:

  • PPGTT是多级页表(具体级数跟GPU的架构相关)
  • CPU是无法访问local graphic memory的

Summary

GPU memory management
I915/GEM CRASHCOURSE BY DANIEL VETTER


参考资料:

  1. HARDWARE SPECIFICATION - PRMS