【具体实施方式】
为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
基于GPU进行计算的应用程序包括两部分:主机代码(Host Code)和设备代码(Device Code),其中主机代码在CPU上执行,而设备代码也称为核函数(Kernel Function),在GPU上执行。现有基于GPU进行计算的应用程序的大致运行流程如图1所示,包括以下步骤:
(1)在CPU控制下,将需要处理的数据从计算机内存复制到GPU显存中;
(2)CPU将设备代码发送给GPU;
(3)GPU的多处理器对显存中的数据执行设备代码,在计算过程中,GPU多次读写显存数据,并且设备代码的运算结果也会保存在显存中;
(4)在CPU控制下,显存中的运算结果被复制到计算机内存。
发明人经研究发现,现有基于GPU的应用程序是面向单块GPU设计的,上述流程适用于单GPU的场景,若要在单机多卡的硬件结构上运行应用程序,程序设计员需要重新设计应用程序,使应用程序能够根据单机多卡的底层硬件细节(例如显存容量、计算单元数、由几块GPU构成等)使用硬件资源,以适应单机多卡的硬件结构,这种实现方式代价较高。
针对上述问题,本申请提供一种资源管理方法。通过该方法,基于GPU进行计算的应用程序可运行于包括GPU和CPU的设备上,且应用程序不需要考虑底层硬件细节,不需要重新设计应用程序,在有效利用GPU资源的基础上,可降低实现代价。
在介绍本申请方法流程之前,简单描述一下本申请方法的运行环境。
为便于描述,将包括GPU和CPU的设备称为第一设备。第一设备可以是任何设备。从实质上来说,第一设备是一台单机多卡设备,即是一台设备上同时配置有至少一块GPU,并且同时包括CPU。
在计算机领域中,从底层硬件到上层应用程序,中间分为多个层次,如图2所示,一种最为常见的层次结构包括:至少一块GPU、驱动程序、操作系统、库函数和应用程序。
其中,驱动程序是专门与硬件设备通信的模块,一般由硬件生产厂商提供,例如NVIDIA提供NVIDIA GPU驱动,AMD提供AMD GPU驱动。驱动程序将硬件抽象化为文件操作,为操作系统提供支持。操作系统具有一定资源管理能力,并为多个用户、多个进程提供资源分配服务,防止发生竞争。在操作系统之上,是为应用程序提供的库函数,便于用户通过指定接口与底层硬件交互,可防止用户恶意破坏硬件。
在本申请中,为了支持本申请方法的运行,在图2所示层次结构上增加一虚拟中间件,该虚拟中间件的主要目的是将至少一块GPU可提供的硬件资源映射成统一虚拟GPU资源,即映射成一块虚拟GPU的资源进行处理,并维护至少一块GPU可提供的硬件资源到统一虚拟GPU资源的映射逻辑,使得应用程序不用重新设计,即可运行在单机多卡设备上,降低实现成本。
值得说明的是,该虚拟中间件可位于任意两层之间实现。可选的,如图3所示,该虚拟中间件可位于驱动程序和操作系统之间,执行效率高;利用驱动程序直接管理底层硬件,将至少一块GPU映射成一块虚拟GPU。当然,该虚拟中间件也可以位于操作系统和库函数之间、库函数与应用程序之间。
值得说明的是,上述虚拟中间件可以作为后续实施例中的资源处理装置来实现。
图4为本申请一实施例提供的资源处理方法的流程示意图。如图4所示,该方法包括:
401、接收部署于第一设备上的应用程序中的主机代码发出的资源分配请求。
402、根据资源分配请求和所维护的第一设备的至少一块GPU可提供的硬件资源到统一虚拟GPU资源的映射逻辑,从第一设备的至少一块GPU可提供的硬件资源中为应用程序中的设备代码分配运行所需的资源。
403、将所分配的资源的信息返回给主机代码。
本实施例提供一种资源处理方法,可由资源处理装置来执行。资源处理装置位于第一设备上的GPU与应用程序之间,维护着第一设备的至少一块GPU可提供的硬件资源到统一虚拟GPU资源的映射逻辑,负责按照该映射逻辑统一管理和调度GPU资源,并实现应用程序与底层GPU硬件之间的适配,该资源处理装置具体可作为图3所示层次结构中的虚拟中间件实现。
根据本申请一个实施例,上述方法也可以由操作系统内核层或者驱动层执行,即上述虚拟中间件也可以嵌入操作系统或者驱动层中来实现。
具体的,应用程序中的主机代码运行于第一设备的CPU上,主机代码向资源处理装置发出资源分配请求,或者也可以说是运行主机代码的CPU向资源处理装置发送资源分配请求;资源处理装置接收主机代码发出的资源分配请求,根据该资源分配请求和所维护的第一设备的至少一块GPU可提供的硬件资源到统一虚拟GPU资源的映射逻辑,从至少一块GPU可提供的硬件资源中为应用程序中的设备代码分配运行所需的资源,然后将所分配的资源提供给主机代码,这样主机代码就可以控制设备代码基于所分配的资源成功运行于GPU上。
值得说明的是,资源分配请求可以包括所需资源的类型以及所需资源的数量等信息。资源处理装置具体根据资源分配请求携带的信息,为设备代码分配所需类型的所需数量的资源。
上述至少一块GPU可提供的硬件资源到统一虚拟GPU资源的映射逻辑主要作用是将第一设备的至少一块GPU可提供的硬件资源映射成一块虚拟GPU的资源,这样对外部(例如应用程序)来说,实际上看到的是一块虚拟GPU的资源,而不是至少一块GPU可提供的硬件资源。相应的,上述按照映射逻辑,从至少一块GPU可提供的硬件资源中为应用程序中的设备代码分配运行所需的资源实际上是指,按照映射成的统一虚拟GPU资源,为应用程序中的设备代码分配运行所需的资源。
本实施例在GPU与应用程序之间维护第一设备的至少一块GPU可提供的硬件资源到统一虚拟GPU资源的映射逻辑,使得第一设备的至少一块GPU可提供的硬件资源以统一虚拟GPU资源的形式面向应用程序,具体按照该映射逻辑负责为应用程序中需要运行于GPU上的设备代码分配资源,实现了应用程序与GPU底层硬件细节的隔离,应用程序不需要考虑底层硬件细节,且不需要确定并分配所需的GPU资源,使得设备代码的实现逻辑可以是面向单块GPU设计的,不需要额外实现多块GPU之间的交互等功能,因此不需要重新设计应用程序(主要是不需要重新设计应用程序中的设备代码的实现逻辑)即可有效利用GPU资源,与现有技术相比,实现代价相对较低。
另外,采用本实施例提供的方法,扩展了现有小容量GPU的应用,也解放了GPU开发商,不用再开发更大容量的GPU,降低开发成本。并且,该方法不受底层硬件细节的限制,具有可移植性。
在一可选实施方式中,为便于资源处理装置对GPU可提供的硬件资源进行管理和调度,资源处理装置在从至少一块GPU可提供的硬件资源中为应用程序分配运行所需的资源之前,预先获取至少一块GPU中每块GPU可提供的硬件资源的详情信息(简称为资源详情信息),根据每块GPU的资源详情信息,生成至少一块GPU可提供的硬件资源到统一虚拟GPU资源的映射逻辑。这里的资源详情信息用于描述GPU可提供的硬件资源,例如可以包括硬件资源的类型、数量、使用状态等信息。在本实施例中,每块GPU可提供的硬件资源包括但不限于:显存资源和计算资源。显存资源的详情信息主要包括:类型标识(用于指示是显存资源)、显存容量、显存是否可用等信息;计算资源的详情信息主要包括:类型标识(用于指示是计算资源)、资源数量、使用状态等。
一种获取资源详情信息的方式:资源处理装置向至少一块GPU中每块GPU发送资源详情获取请求,并接收每块GPU根据该资源详情获取请求返回的资源详情信息。可选的,在向GPU发送资源请求获取请求之前,资源处理装置在第一设备初始化时进行监测,以便发现GPU。
另一种获取资源详情信息的方式:资源处理装置接收至少一块GPU中每块GPU发送的注册请求,该注册请求包括资源详情信息;资源处理装置从该注册请求中获取资源详情信息。例如,每块GPU可以在第一设备启动后,主动向资源处理装置进行注册,以便于资源处理装置获取资源详情信息并根据资源详情信息对GPU进行管理。
在一可选实施方式中,考虑到至少一块GPU可提供的硬件资源主要包括显存资源和计算资源。基于此,资源处理装置具体可以根据资源分配请求,读取所维护的第一设备的至少一块GPU可提供的硬件资源到统一虚拟GPU资源的映射逻辑,根据所读取的至少一块GPU可提供的硬件资源到统一虚拟GPU资源的映射逻辑,从计算资源中为设备代码分配所需的计算资源,并从显存资源中为设备代码分配所需的显存资源。为便于描述,将分配给设备代码的计算资源简称为第一计算资源,将分配给设备代码的显存资源简称为第一显存资源。
考虑显存资源主要用于供应用程序存取数据,为了便于数据存取,资源处理装置可以根据至少一块GPU可提供的硬件资源到统一虚拟GPU资源的映射逻辑,从第一设备的系统内存中,申请与至少一块GPU可提供的显存资源总量相同的虚拟内存,并将虚拟内存与至少一块GPU可提供的显存资源进行映射,形成虚拟内存与至少一块GPU可提供的显存资源之间的映射关系。基于此,资源处理装置根据至少一块GPU可提供的硬件资源到统一虚拟GPU资源的映射逻辑,从至少一块GPU可提供的硬件资源中为设备代码分配第一显存资源具体可以是:从虚拟内存中为设备代码分配第一存储资源,并根据上述虚拟内存与至少一块GPU可提供的显存资源之间的映射关系,对所分配的第一存储资源对应的第一显存资源进行标记,以标识将该第一显存资源分配给了应用程序的设备代码。
可选的,虚拟内存与至少一块GPU可提供的显存资源之间的映射关系具体可以是将虚拟内存的地址与显存资源的地址进行映射。
其中,虚拟内存与至少一块GPU可提供的显存资源之间的映射关系可如图5所示。
在一可选实施方式中,资源处理装置可以根据计算资源的使用状况,灵活为应用程序分配计算资源。例如,当计算资源紧张时,资源处理装置可以优先为优先级高、实时性要求高的应用程序分配计算资源,使得这类应用程序优先得到GPU的调度;而延后为IO密集、低效的应用程序分配计算资源。
具体的,资源处理装置可以根据资源分配请求的优先级,确定为应用程序中设备代码分配计算资源的先后顺序;按照该先后顺序和至少一块GPU可提供的硬件资源到统一虚拟GPU资源的映射逻辑,从至少一块GPU可提供的计算资源中为应用程序中的设备代码分配第一计算资源。
其中,资源分配请求的优先级可根据具体应用需求和应用场景而定,例如可以由应用程序对IO密集度、实时性等要求来确定资源分配请求的优先级。
在上述实施方式中,资源处理装置从系统内存中申请一虚拟内存,这对应用程序来说相当于看到一块几乎拥有足够存储资源的虚拟GPU,无需关心底层硬件细节(显存容量、由几块GPU构成等),由资源处理装置通过虚拟内存与显存资源之间的映射关系自动实现应用程序与底层GPU硬件资源之间的适配,不需要重新设计应用程序,简化了开发、部署以及后期维护的工作,降低了成本。
进一步,资源处理装置在为应用程序中的设备代码分配运行所需的资源之后,可以将所分配的资源发送给应用程序中的主机代码,以使得主机代码控制设备代码基于所分配的资源成功运行于GPU上。具体的,资源处理装置可以将第一计算资源的标识和第一存储资源的地址信息发送给主机代码,以使主机代码将设备代码发送给第一计算资源以供第一计算资源运行设备代码并将运行过程中产生的数据存储到第一存储资源中;资源处理装置将运行过程中产生的数据存储到被标记的第一显存资源中。
值得说明的是,对应用程序而言,上述第一存储资源实际上是虚拟内存,而第一存储资源的地址信息也是虚拟内存的地址。
在分得第一存储资源之后,应用程序的主机代码可以访问第一存储资源,例如可以请求向第一存储资源写入数据或从第一存储资源中读数据。基于此,资源处理装置还可以接收主机代码发送的读请求,根据该读请求,从第一存储资源中读取数据并将所读取的数据返回给主机代码。或者,资源处理装置还可以接收主机代码发送的写请求,根据该写请求,向第一存储资源中写入数据,并根据对第一显存资源的标记,向第一显存资源中同步所写入的数据。
值得说明的是,上述读请求一般会携带第一存储资源的地址信息,用于指示从哪块存储空间读取数据。上述写请求一般会携带有第一存储资源的地址信息,用于指示往哪块存储空间写入数据;另外,该写请求还会携带可以指示待写入数据的信息,例如该指示信息可以是待写入数据本身,或该指示信息可以是待写入数据的存储路径。
由上述可见,在应用程序使用存储资源的过程中,资源处理装置可能需要在虚拟内存与GPU可提供的显存资源之间进行数据同步。如果要做到单数据的同步,难以实现,代价较高,所以一般采用全同步,即将整块GPU的显存资源中的数据与该GPU对应的虚拟内存中的数据全部进行同步;这种同步方法会有相当大的延迟,不利于发挥GPU的计算能力,并且还会严重降低资源处理装置的工作效率和性能。
针对上述问题,资源处理装置采用分页管理的方式,即在形成虚拟内存与至少一块GPU可提供的显存资源之间的映射关系时,对虚拟内存进行分页处理,获得内存页;对显存资源进行分页处理,获得显存页;将内存页与显存页进行映射,形成内存页与显存页之间的映射关系。基于此,资源处理装置向第一显存资源中同步写入第一存储资源中的数据的过程具体为:
确定所写入的数据所在的内存页,为便于描述,将该内存页称为第一内存页;将所确定的第一内存页中的数据同步到第一内存页对应的显存页中。
资源处理装置通过分页管理方式,使得在数据同步时,只需同步一页内的数据,无需同步所有数据,有利于减少虚拟内存与显存资源之间交互的数据量,有利于降低延迟,利于GPU充分发挥计算优势,并且可以降低资源处理装置的处理负担,提高资源处理装置的性能。
需要说明的是,对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本申请并不受所描述的动作顺序的限制,因为依据本申请,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本申请所必须的。
在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。
图6为本申请一实施例提供的资源处理装置的结构示意图。如图6所示,该装置包括:接收模块61、分配模块62和发送模块63。
接收模块61,用于接收部署于第一设备上的应用程序中的主机代码发出的资源分配请求。
分配模块62,用于根据第一接收模块61接收的资源分配请求和所维护的所述第一设备的至少一块GPU可提供的硬件资源到统一虚拟GPU资源的映射逻辑,从第一设备的至少一块GPU可提供的硬件资源中为应用程序的设备代码分配运行所需的资源。
发送模块63,用于将分配模块62所分配的资源的信息返回给主机代码。这样主机代码就可以控制设备代码基于所分配的资源成功运行在至少一块GPU上。
在一可选实施方式中,如图7所示,该资源处理装置还包括:信息获取模块64和维护模块69。
信息获取模块64,用于:
向至少一块GPU中每块GPU发送资源详情获取请求,并接收每块GPU根据资源详情获取请求返回的资源详情信息;或者
接收至少一块GPU中每块GPU发送的注册请求,注册请求包括资源详情信息;
其中,资源详情信息用于描述每块GPU可提供的硬件资源。
维护模块69,用于根据信息获取模块64获取的每块GPU的资源详情信息,生成至少一块GPU可提供的硬件资源到统一虚拟GPU资源的映射逻辑。
在一可选实施方式中,上述至少一块GPU可提供的硬件资源包括显存资源和计算资源。分配模块62具体用于:根据资源分配请求,读取至少一块GPU可提供的硬件资源到统一虚拟GPU资源的映射逻辑;根据至少一块GPU可提供的硬件资源到统一虚拟GPU资源的映射逻辑,从计算资源中为设备代码分配第一计算资源,并从显存资源中为设备代码分配第一显存资源。
在一可选实施方式中,如图7所示,该资源处理装置还包括:申请模块65和映射模块66。
申请模块65,用于根据至少一块GPU可提供的硬件资源到统一虚拟GPU资源的映射逻辑,从第一设备的系统内存中,申请与至少一块GPU可提供的显存资源总量相同的虚拟内存。
映射模块66,用于形成申请模块65所申请的虚拟内存与至少一块GPU可提供的显存资源之间的映射关系。
基于上述,分配模块62具体用于:
从计算资源中为设备代码分配第一计算资源,并从虚拟内存中为设备代码分配第一存储资源,根据映射模块36形成的映射关系,对第一存储资源对应的第一显存资源进行标记,以标识将第一显存资源分配给设备代码。
在一可选实施方式中,如图7所示,该资源处理装置还包括:读写处理模块67。
读写处理模块67,用于接收主机代码发送的读请求,根据读请求,从第一存储资源中读取数据并将所读取的数据返回给主机代码;和/或,接收主机代码发送的写请求,根据写请求,向第一存储资源中写入数据,并根据对第一显存资源的标记,向第一显存资源中同步所写入的数据。
在一可选实施方式中,映射模块66具体用于:
对虚拟内存进行分页处理,获得内存页;
对显存资源进行分页处理,获得显存页;
形成内存页和显存页之间的映射关系;
基于上述,读写处理模块67具体用于:
接收主机代码发送的写请求,根据写请求,向第一存储资源中写入数据,并确定所写入的数据所在的第一内存页,将第一内存页中的数据同步到第一内存页对应的显存页中。
在一可选实施方式中,分配模块62具体用于:
根据资源分配请求的优先级,确定为设备代码分配计算资源的先后顺序,按照先后顺序和至少一块GPU可提供的硬件资源到统一虚拟GPU资源的映射逻辑,从计算资源中为设备代码分配第一计算资源,并从显存资源中为设备代码分配第一显存资源。
在一可选实施方式中,发送模块63具体用于:
将第一计算资源的标识和第一存储资源的地址信息发送给主机代码,以使主机代码将设备代码发送给第一计算资源以供第一计算资源运行设备代码并将运行过程中产生的数据存储到第一存储资源中,并将运行过程中产生的数据存储到被标记的第一显存资源中。
本实施例提供的资源处理装置,位于GPU与应用程序之间,维护着第一设备的至少一块GPU可提供的硬件资源到统一虚拟GPU资源的映射逻辑,使得第一设备的至少一块GPU可提供的硬件资源以统一虚拟GPU资源的形式面向应用程序,具体按照该映射逻辑为应用程序中需要运行于GPU上的设备代码分配资源,实现了应用程序与GPU底层硬件细节的隔离,应用程序不需要考虑底层硬件细节,且不需要确定并分配所需的GPU资源,使得设备代码的实现逻辑可以是面向单块GPU设计的,不需要额外实现多块GPU之间的交互等功能,因此不需要重新设计应用程序(主要是不需要重新设计应用程序中的设备代码的实现逻辑)即可有效利用GPU资源,与现有技术相比,实现代价相对较低。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在本申请所提供的几个实施例中,应该理解到,所揭示的系统,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。
上述以软件功能单元的形式实现的集成的单元,可以存储在一个计算机可读取存储介质中。上述软件功能单元存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)或处理器(processor)执行本申请各个实施例所述方法的部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(Read-Only Memory,ROM)、随机存取存储器(Random Access Memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
最后应说明的是:以上实施例仅用以说明本申请的技术方案,而非对其限制;尽管参照前述实施例对本申请进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本申请各实施例技术方案的精神和范围。