具体实施方式
如背景技术中所述,对于第一类页表管理方式,在GPU具有超大显存的情况下,过细粒度的管理会造成页表的内存流量(memory traffic)剧增,从而影响GPU的运行效率。对于第二类页表管理方式,页表之间的转换复杂,导致响GPU的运行效率降低。
具体地,对于第二类页表管理方式,在单页表模式下,PageTablePageSize字段添加到字段DXGK_PTE,能够指示内核模式驱动程序相应页表的类型(使用64KB或4KB页面)。当以下条件成立时,内存管理器会选择在虚拟地址范围内使用64KB页表,仅将64KB对齐的分配映射到该范围:映射到该范围的所有分配的内存段支持64KB页面。当虚拟地址范围由64KB页面映射,并且上述条件不再成立时(例如,分配已提交到***内存段),显存管理器将从64 KB页表切换到4 KB页表。需要执行下面复杂的过程:挂起进程的所有上下文。 更新现有的PTE以指向4KB页面。驱动程序将获得UpdatePageTable页面操作。指向该页表的Level 1PTE将更新以反映新的页面大小(PageTablePageSize = DXGK_PTE_PAGE_TABLE_PAGE_4KB)。驱动程序将获得UpdatePageTable页面操作。 最后在恢复进程的所有上下文。
此外,在单页表模式下,从4KB PTE的页表转换为64KB PTE的页表时,需要当前连续16个4KB都是连续地址,实现难度较大。
本申请技术方案通过在页面目录中设置页表粒度指示信息来指示分页粒度,能够实现对具有不同分页粒度的页表的支持,无需复杂的操作即可实现对内存在不同分页粒度下的切换,提升了对内存管理的灵活性和高效性。
为了能够更好的理解本发明实施例,下面将对内存管理单元(Memory ManagementUnit, MMU)如何实现虚拟地址到内存的物理地址的映射做一个详细的介绍。先简单介绍一下虚拟存储器(virtual memory)的概念。本领域人员可以知道,程序要放到内存中运行。但随着程序规模的不断增大,内存容量很难容纳一个完整的程序,虚拟存储器的概念应运而生。虚拟存储器的基本思想是程序、数据和堆栈的总的大小可以超过物理 存储器的大小,操作***把当前使用的部分保留在内存中,而把其他未被使用的部分保存在磁盘上。例如,若一个计算机只有4M内存,当该计算机需要运行一个16MB的程序时,操作***可以通过选择确定将4M的程序内容缓存在内存中运行,并在需要时在内存和磁盘之间交换程序片段,这样就可以在一个只具有4M内存的计算机上运行16M的程序了。
本领域人员可以知道,在计算机***中,虚拟地址空间是进程能够访问的一段虚拟地址范围。虚拟地址空间的大小通常是由计算机的指令集体系结构(instruction setarchitecture)来确定的。例如,一个32位的GPU,提供的虚拟地址空间为0-0xFFFFFFFF(4G)。虚拟地址空间中的某一个地址我们称之为虚拟地址。与虚拟地址空间和虚拟地址相对应的则是物理地址空间和物理地址。物理地址空间是指内存的物理地址范围。物理地址空间中的某一个地址我们称之为物理地址。通常,物理地址空间小于虚拟地址空间,物理地址空间可以映射到虚拟地址空间中。例如,对于一台内存为256M的32bit x86主机来说,它的虚拟地址空间范围是0-0xFFFFFFFF(4G),而物理地址空间范围是0x000000000-0x0FFFFFFF(256M)。
现有技术中,大多数机器均使用虚拟存储器,虚拟地址(或称线性地址)不是被直接送到内存地址总线上,而是送到内存管理单元 (Memory Management Unit,MMU),MMU把虚拟地址转换为物理地址。也就是说,MMU用于实现程序的虚拟地址到内存的物理地址的映射。
为了实现程序的虚拟地址到内存的物理地址的映射,MMU引入分页(paging)机制。具体地,虚拟地址空间以页(page)为单位被划分,可以将虚拟地址空间中的页称为虚拟页。相应的,物理地址空间也以页为单位被划分,可以将物理地址空间的页称为物理页(或称物理页框),其中,虚拟页和物理页的大小相同。
为使本申请的上述目的、特征和优点能够更为明显易懂,下面结合附图对本申请的具体实施例做详细的说明。
参见图1,内存管理方法的执行主体为MMU,也即由MMU执行下述各个步骤。当然可以理解的是,内存管理方法也可以由其他任意适当的主体来执行。
具体地,内存管理方法具体可以包括以下步骤:
步骤101:接收读请求或写请求,读请求或写请求包括虚拟地址;
步骤102:在页面目录中对虚拟地址进行命中测试,以得到命中结果,页面目录包括页表粒度指示信息,页表粒度指示信息用于指示分页粒度;
步骤103:根据命中结果在对应的页表中查找虚拟地址对应的内存中的物理地址,页表具有页表粒度指示信息指示的分页粒度。
可以理解的是,在具体实施中,上述方法的各个步骤可以采用软件程序的方式实现,该软件程序运行于芯片或芯片模组内部集成的处理器中。该方法也可以采用软件结合硬件的方式实现,本申请不作限制。
与现有的虚拟内存管理为物理地址的过程不同的是,本发明实施例可以通过页面目录(page entry)中的页表粒度指示信息灵活地选择分页粒度。以分页粒度包括4KB和64KB为例,最终转换得到的物理地址的划分单位可以灵活地在4KB和64KB之间切换。并且,通过页表粒度指示信息完成不同页表之间的切换,无需对页表进行二次查询,避免增加访问延迟,提升GPU性能。
此外,在GPU支持多种分页粒度的情况下,在分配缓存(cache allocation)时,通过页表粒度指示信息能够确认当前使用的分页粒度,从而能够准确地分配出对应数量的缓存线(CacheLine),进一步保证内存管理的效率。
本发明实施例中,对于内存中同一物理地址范围,同时具有多个具有不同分页粒度的页表指向该地址范围。以分页粒度包括4KB和64KB为例,则4KB页表和64KB页表同时指向同一地址范围,也就是说,同一地址范围被4KB页表和64KB页表这两种页表管理。
在一个具体应用场景中,选择具有哪种分页粒度的页表来进行地址映射,可以由操作***动态管理,操作***的根据动态切换而通过页表粒度指示信息通知MMU选择相应的页表进行地址映射。通过上述具有多个具有不同分页粒度的页表指向同一地址范围的方式,能够使得同一地址的映射粒度切换可以迅速完成,降低了页表之间切换的复杂度,提升了页表切换效率,进而提升GPU的运行效率。
在步骤101的具体实施中,MMU可以接收来自GPU引擎(Engine)的读请求或写请求。其中,读请求用于请求从内存中读取数据,写请求用于请求向内存中写入数据。读请求或写请求均携带有虚拟地址,该虚拟地址可以被转换为内存的物理地址,该物理地址可以用于数据的读取或写入。
在步骤102的具体实施中,MMU可以在页面目录中对虚拟地址进行命中测试。具体地,页面目录中包括多个虚拟地址及其对应的物理地址,那么通过将读请求或写请求中的虚拟地址对页表目录进行命中测试,可以确定该虚拟地址对应的物理地址。
在一个非限制性的实施例中,MMU采用多级页表的形式实现虚拟地址到内存的物理地址的映射。具体的,在二级管理模式下,这种映射方式依次包括对页目录和页表的查询。其中,页目录中存储有多个页表的基地址,每个页表中存储有多个页表项。页表项中记录有虚拟地址所对应物理页的物理基地址。
在一个非限制性的实施例中,为了减少发生的延迟,在MMU中使用转换后备缓冲区(Transfer Look-aside Table, TLB),也可以称为内存管理旁路缓冲器的缓存结构。如果在TLB中确认了虚拟页面和物理页面之间的关系,即当发生TLB命中时,MMU可以在不访问内存中页表的情况下转换地址,从而极大地提升性能。
具体实施中,MMU根据虚拟地址对至少一级TLB中的页面目录项页目录项(pagedirectory entry,PDE)同时进行命中测试(hit test)。其中,页面目录项PDE指向2M存储块(BLOCK)或者页表。
在一个具体实施例中,TLB也可以有多级,如图2所示,MMU可以同时对多级TLB中的页面目录项PDE进行命中测试。若一级TLB命中(hit),则可以直接利用虚拟地址进行最终PTE的查询。
例如,使用4KB为分页粒度的页存储页表时,为了能够完成49bit的虚拟地址解析,可以采用5级页表,也即四级TLB、三级TLB、二级TLB、一级TLB以及PTE。
具体请参照图3所示的一级TLB的PDE,一级TLB的PDE中包括页表粒度指示信息,用于指示分页粒度,例如4KB或64KB。相应地,一级TLB的PDE中还分别包括4KB地址和64KB地址。
PDE中还包括块/页指示信息,用于指示选择页(page)地址还是块(block)地址。其他信息包含的当前页的有效性、安全、目标区域、稀疏等标识。
进一步地,MMU根据一级TLB的PDE中的上述地址信息以及页表粒度指示信息确定至少一级页表的地址。MMU根据页表的地址从内存中访问页表,然后MMU根据虚拟地址对至少一级页表进行查询,获得对应的物理地址。
具体请参照图4,在多级页表中,除了最后一级页表(也即零级页表)的PTE是直接指向内存的页外,其他级的页表的页表项都是指向下一级页表首地址的,因此其他级的页表被称为分页结构(paging structure)。
本发明实施例中,一级页表的PTE同时指向一个4KB零级页表和一个64KB零级页表。4KB零级页表中的物理地址的分页粒度为4KB,相应地,64KB零级页表中的物理地址的分页粒度为64KB。
进一步地,覆盖同一虚拟地址范围的具有不同分页粒度的零级页表中的PTE分时有效。具体地,一级页表中条目中的两个指针都可能设置了有效标志,但是覆盖相同虚拟地址范围的零级页表中的条目不能同时有效。例如,当一个被4KB PTE覆盖的分配被放置在支持64KB页大小的存储器段中时,64KB PTE将变为无效,对应的4KB PTE将变为有效。
在一个非限制性的实施例中,采用统一缓存(unified cache)存储各个物理地址,统一的设计可以方便实现64KB和4KB页表的灵活切换。
进一步地,如图5所示,指示64KB分页粒度的页面的多个页表的物理地址在所述统一缓存中相邻排放。
本发明实施例为了最大程度的提高缓存的命中率,存放64KB的页表地址可以紧密排放,在同样的缓存大小的情况下,能够实现16倍的覆盖率提升,以及提升缓存的容量和命中率,从而进一步提高MMU内存管理的效率。
继续参照图1,在步骤103的具体实施中,若在页面目录中,如在PTE中的命中结果为命中,则可以确定虚拟地址对应的物理地址。MMU将该物理地址返回至GPU引擎,以供GPU引擎在该物理地址指向的内存空间中进行相应的读操作或写操作。
在一个具体实施例中,若在页面目录中,如在PTE中的命中结果为未命中,则基于一级TLB指定的分页粒度完成PTE统一缓存的分配(allocation)请求,并将读请求或写请求放入等待的队列。
在一个具体实施例中,如果PTE对应的一级TLB未命中,则需要根据一级TLB的上级TLB,如四级TLB/三级TLB/二级TLB的信息恢复对应的一级TLB的物理地址,并发出相应的未命中请求。如果在转换一级TLB所需的地址时,四级TLB/三级TLB/二级TLB 中所需的信息也有未命中,需要按照顺序逐级发出未命中请求,获取地址的顺序,是四级TLB/三级TLB/二级TLB/一级TLB/PTE。
在一个具体的应用场景中,虚拟地址中包含着找到物理地址的信息。例如,虚拟地址的大小为4个字节(32bit),通常该虚拟地址可以被分为3个部分:
第22位到第31位:最高10位对应页目录中的索引;
第12位到第21位:对应页表中的索引;
第0位到第11位:低12位为页内偏移。
本领域人员可以知道,每个进程都有其各自专用的虚拟地址空间以及用于寻址的页目录,***内所有进程共享内核的虚拟地址空间以及内核的页目录,每个进程可以通过***调用进入内核。在GPU中存在一个用于保存页目录基地址的寄存器CR3。在进程调度时,寄存器CR3指向当前进程的页目录基地址。在进程切换时,寄存器CR3切换当前所指向的页目录基地址。对于一个要转换成物理地址的虚拟地址,首先根据寄存器CR3中的值找到页目录所在的物理页。然后根据虚拟地址的第22位到第31位这10位(最高的10bit)的值作为索引,找到相应的页目录项 PDE,也可以称为页面目录,PDE中有这个虚拟地址所对应页表的物理地址。有了页表的物理地址,根据虚拟地址的第12位到第21位这10位的值作为索引,找到该页表中相应的页表项(Page Table Entry,PTE)。页表项中就有这个虚拟地址所对应物理页的物理地址。最后用虚拟地址的最低12位,也就是页内偏移,加上这个物理页的物理地址,就得到了该虚拟地址所对应的物理地址。
通常,一个页目录有1024项,虚拟地址最高的10bit刚好可以索引1024项(2的10次方等于1024)。一个页表也有1024项,虚拟地址中间部分的10bit,刚好用于索引这1024个页表项。虚拟地址最低的12bit(2的12次方等于4096),作为页内偏移,刚好可以索引4KB,也就是一个物理页中的每个字节。
本领域人员可以知道,32bit的指针的寻址范围为0x00000000-0xFFFFFFFF(4GB)。也就是说,一个32bit的指针可以寻址整个4GB地址空间的每一个字节。一个页表项可以负责4K的地址空间和物理内存的映射。一个页表1024项,则一个页表可以负责1024×4k=4M的地址空间的映射。一个页目录项,对应一个页表。一个页目录有1024项,也就对应着1024个页表,每个页表负责4M地址空间的映射,则1024个页表负责1024×4M=4G的地址空间映射。一个进程有一个页目录。所以以页为单位,页目录和页表可以保证4G的地址空间中的每页和物理内存的映射。
每个进程都有自己的4G地址空间,从0x00000000-0xFFFFFFFF。通过每个进程自己的一套页目录和页表来实现进程的虚拟地址到内存的物理地址的映射。由于每个进程有自己的页目录和页表,所以每个进程的地址空间映射的物理内存是不一样的。
关于本实施例的更多具体实施方式可以参照前述实施例,此处不再赘述。
请参照图6,本申请还公开一种图形处理单元60。图形处理单元60可以包括:
引擎601,用于生成读请求或写请求,读请求或写请求包括虚拟地址。
内存管理单元602,用于执行内存管理。具体地,内存管理单元602可以执行前述实施例中内存管理方法的各个步骤。
本实施例中,引擎601将读请求或写请求发送给内存管理单元602。内存管理单元602将虚拟内存管理为物理地址并返回至引擎601。引擎601利用该物理地址进行数据的读取或写入。
本实施例通过在页面目录中设置页表粒度指示信息来指示分页粒度,能够实现对具有不同分页粒度的页表的支持,无需复杂的操作即可实现对内存在不同分页粒度下的切换,提升了对内存管理的灵活性和高效性。
本实施例中,GPU可以包括多组内存管理单元602,内存管理单元602所处位置及数目可以位于GPU的不同模块中。具体请参照图7,内存管理单元602可以位于图形处理器集群(Graphic Processor Cluster, GPC)603的出口,也可以位于动态内存控制器(DynamicMemory Controller, DMC)604的出口。
在一个具体实施例中,图形处理单元60还可以包括图形处理器集群603。内存管理单元602的输入端与图形处理器集群603的输出端耦接。换言之,内存管理单元602可以将来自图形处理器集群603的虚拟地址转换为物理地址,并将物理地址返回至图形处理器集群603。例如,图形处理器集群603可以将其运算结果写入该物理地址指示的内存空间中。
在一个具体实施例中,图形处理单元60还可以包括动态内存控制器604。内存管理单元602的输入端与动态内存控制器604的输出端耦接。换言之,内存管理单元602可以将来自动态内存控制器604的虚拟地址转换为物理地址,并将物理地址返回至动态内存控制器604。例如,动态内存控制器604可以从该物理地址指示的内存空间中读物数据并输出至外部设备。
关于上述实施例中描述的各个装置、产品包含的各个模块/单元,其可以是软件模块/单元,也可以是硬件模块/单元,或者也可以部分是软件模块/单元,部分是硬件模块/单元。例如,对于应用于或集成于芯片的各个装置、产品,其包含的各个模块/单元可以都采用电路等硬件的方式实现,或者,至少部分模块/单元可以采用软件程序的方式实现,该软件程序运行于芯片内部集成的处理器,剩余的(如果有)部分模块/单元可以采用电路等硬件方式实现;对于应用于或集成于芯片模组的各个装置、产品,其包含的各个模块/单元可以都采用电路等硬件的方式实现,不同的模块/单元可以位于芯片模组的同一组件(例如芯片、电路模块等)或者不同组件中,或者,至少部分模块/单元可以采用软件程序的方式实现,该软件程序运行于芯片模组内部集成的处理器,剩余的(如果有)部分模块/单元可以采用电路等硬件方式实现;对于应用于或集成于终端设备的各个装置、产品,其包含的各个模块/单元可以都采用电路等硬件的方式实现,不同的模块/单元可以位于终端设备内同一组件(例如,芯片、电路模块等)或者不同组件中,或者,至少部分模块/单元可以采用软件程序的方式实现,该软件程序运行于终端设备内部集成的处理器,剩余的(如果有)部分模块/单元可以采用电路等硬件方式实现。
本申请实施例还公开了一种存储介质,所述存储介质为计算机可读存储介质,其上存储有计算机程序,所述计算机程序运行时可以执行图1中所示方法的步骤。所述存储介质可以包括只读存储器(Read-Only Memory,ROM)、随机存取存储器(Random AccessMemory,RAM)、磁盘或光盘等。存储介质还可以包括非挥发性存储器(non-volatile)或者非瞬态(non-transitory)存储器等。
本申请实施例还公开了一种终端设备,所述终端设备包括前述的图形处理单元;或者,终端设备包括存储器和处理器,存储器上存储有可在处理器上运行的计算机程序,处理器运行计算机程序时执行前述指令编译方法的步骤。
本申请实施例中出现的“多个”是指两个或两个以上。
本申请实施例中出现的第一、第二等描述,仅作示意与区分描述对象之用,没有次序之分,也不表示本申请实施例中对设备个数的特别限定,不能构成对本申请实施例的任何限制。
上述实施例,可以全部或部分地通过软件、硬件、固件或其他任意组合来实现。当使用软件实现时,上述实施例可以全部或部分地以计算机程序产品的形式实现。所述计算机程序产品包括一个或多个计算机指令或计算机程序。在计算机上加载或执行所述计算机指令或计算机程序时,全部或部分地产生按照本申请实施例所述的流程或功能。所述计算机可以为通用计算机、专用计算机、计算机网络、或者其他可编程装置。所述计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,所述计算机指令可以从一个网站站点、计算机、服务器或数据中心通过有线或无线方式向另一个网站站点、计算机、服务器或数据中心进行传输。
应理解,在本申请的各种实施例中,上述各过程的序号的大小并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本申请实施例的实施过程构成任何限定。
在本申请所提供的几个实施例中,应该理解到,所揭露的方法、装置和***,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的;例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式;例如多个单元或组件可以结合或者可以集成到另一个***,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理包括,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。
上述以软件功能单元的形式实现的集成的单元,可以存储在一个计算机可读取存储介质中。上述软件功能单元存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例所述方法的部分步骤。
虽然本申请披露如上,但本申请并非限定于此。任何本领域技术人员,在不脱离本申请的精神和范围内,均可作各种更动与修改,因此本申请的保护范围应当以权利要求所限定的范围为准。