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

PS:到目前为止,我司GPU的memory依然是system memory,而非on-die memory。

对于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的部分内存,CPU是可以访问的,这样才能完成GPU与CPU的数据交互。对于CPU能访问的这部分内存,我们称之为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的非aperture部分,CPU是无法访问的。

local graphic memory

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

值得注意的是:

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

参考资料:

  1. HARDWARE SPECIFICATION - PRMS