CN107943592B - 一种面向gpu集群环境的避免gpu资源争用的方法 - Google Patents
一种面向gpu集群环境的避免gpu资源争用的方法 Download PDFInfo
- Publication number
- CN107943592B CN107943592B CN201711326972.XA CN201711326972A CN107943592B CN 107943592 B CN107943592 B CN 107943592B CN 201711326972 A CN201711326972 A CN 201711326972A CN 107943592 B CN107943592 B CN 107943592B
- Authority
- CN
- China
- Prior art keywords
- gpu
- function
- application program
- node
- information
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5027—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5061—Partitioning or combining of resources
- G06F9/5066—Algorithms for mapping a plurality of inter-dependent sub-tasks onto a plurality of physical CPUs
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
本发明公开了一种面向GPU集群环境的避免GPU资源争用的方法,包括支持多应用程序细粒度并发执行的插件,应用程序行为特征抽取和应用程序任务调度。针对同一个NVIDIA GPU节点上运行的多个应用程序可能会引起的GPU资源争用问题,构建一个支持多应用程序细粒度并发执行的平台,使得多个应用程序在同一个GPU节点上可以尽可能的并发执行。其次,抽取每个应用程序的GPU行为特征,包括GPU使用模式和GPU资源需求信息。根据应用程序的GPU行为特征,以及当前GPU集群中各个GPU节点的资源使用状态,调度应用程序到适合的GPU节点上,从而最小化多个独立应用程序在同一个GPU节点上的资源争用。
Description
技术领域
本发明涉及GPU高性能计算领域,尤其涉及一种面向GPU集群环境的避免GPU资源争用的方法。
背景技术
GPU加速计算是指同时利用图形处理器(GPU)和CPU,加快科学、分析、工程、消费和企业应用程序的运行速度。GPU加速计算可以提供非凡的应用程序性能,能将应用程序计算密集部分的工作负载转移到GPU,同时仍由CPU运行其余程序代码。从用户的角度来看,应用程序的运行速度明显加快。利用GPU加速应用程序的执行,目前已经越来越流行。如在科学计算领域,科研人员使用GPU加速蒙特卡洛仿真实验;使用GPU加速数值计算;在图像处理领域,人们利用GPU处理大规模医学影像数据;在数据挖掘领域,利用GPU加速数据挖掘算法的执行;在人工智能领域,利用GPU加速算法的训练等。目前,国内外许多大规模云服务提供商均已支持GPU服务,如亚马逊EC2、微软Azure、百度云等。
随着技术的发展,新一代的GPU中容纳了更多的多流处理器(StreamingMultiprocessors,SM、SMX)和流处理器(Streaming processors,SP),也支持了更多有用的特性,如Hyper-Q、动态并行(Dynamic Parallelism)等。但是,GPU利用率低下问题日趋凸显。其主要原因在于:
1)受限于当前GPU计算模型。目前GPU编程通常经过以下步骤:首先,使用CPU将位于硬盘上的待处理数据拷贝到主机内存;第二,在GPU设备上开辟空间,并将主机内存上的数据拷贝到GPU设备的内存空间中;第三,GPU设备执行相应的内核函数进行并行计算,并将结果写回GPU设备内存;最后,GPU设备内存的数据需要拷贝回主机内存。另外,若存在网络通信,则还需要依靠CPU来辅助完成。在编程过程中,有些代码无法或者不适合在GPU上完成,如一些无法并行执行的代码;数据迁移的代价大于并行计算带来的好处的代码;I/O操作等。因此程序员需要事先指定CPU和GPU上执行代码的比例,这导致GPU出现空闲,从而使得GPU利用率低下。
2)GPU指派方式不合理。很多GPU应用程序会显式的指定所要使用的GPU设备。当大量应用程序都指定使用同一个GPU设备时,会导致该GPU节点过度负载。当应用程序到达某GPU节点的频率过低时,会导致该GPU节点欠负载。
因此,为了提高GPU利用率,其中一种方法是根据GPU集群中各个节点的资源状态,以及到达的应用程序的GPU行为特征,将其调度到合适的GPU节点上。为达到该目标,需要解决的主要问题有:1)在应用程序到达的时候,快速、透明、准确的获取应用程序的GPU行为特征;2)提出合理、高效的调度策略;3)提高多个独立应用程序在同一个GPU上执行时并发度,减少资源争用。
根据现有对应用程序GPU行为特征提取的研究可知,现有的方法主要有NVIDIACUPTI、PAPI、Tau、Vampir等。NVIDIA CUPTI主要通过注册相应回调函数方法,在应用程序执行期间,实时获取应用程序调用GPU运行时库函数的信息。当应用程序执行完毕后,才能获得所有GPU函数调用信息。PAPI、Tau、Vampir是通过在源代码中插桩的方法,使应用程序在执行过程中能够触发所插入代码的执行,从而获取应用程序对GPU函数调用的信息。上述已有方法均要在应用程序执行完毕后,才能获取其GPU行为特征。但在本应用场景中,应用程序一到达就需要获取其GPU行为特征,为后续调度做出决策依据。
根据现有对应用程序在GPU上并发执行的研究可知,在NVIDIA CUDA4.0及以后,允许一个进程的多个线程共享一个上下CUDA上下文,且这些线程之间能够并发执行。但是该方法并不能使得多个独立应用程序之间细粒度并发执行。NVIDIA MPS(Multi-ProcessService)服务允许多个进程并发执行,但是它更适用于MPI程序,并不推荐在独立应用程序之间使用。NVIDIA Hyper-Q技术支持32路独立硬件管理的工作队列并发执行,但是它也只适用于同一个上下文中,不同流之间的GPU操作并发执行。
综上所述,目前针对快速、透明、准确、提前的获取应用程序的GPU行为特征,多个独立应用程序细粒度并发方面的研究起步不久,目前还未有能有效、快速、透明、提前的获取GPU行为特征的方法,也未提出能有效提高多个独立应用程序在同一个GPU上执行时并发度的方法。对这些问题的解决,充满着困难与挑战。
发明内容
针对现有技术的问题,本发明公开了一种面向GPU集群环境的避免GPU资源争用的方法,包括如下步骤:
步骤1,构建一个支持多应用程序细粒度并发执行的插件:该插件包含一个自行编写的GPU运行时伪函数库(libcudart.so)和一个自行编写的本地服务器进程,前者(GPU运行时伪函数库)与NVIDIA自带的GPU运行时函数库(libcudart.so)有相同的函数原型,但各个函数实现体的基本功能包括:变换同步函数为异步函数;向后者(本地服务器进程)转发相关的函数执行请求。该细粒度并发执行插件的作用为:同一个GPU节点上的多个应用程序对GPU运行时库函数的调用,均通过GPU运行时伪函数变换、转发,并通过本地服务器进程执行,从而提高了多个独立应用程序执行的并发度;
步骤2,在GPU集群的头结点,使用自行编写的GPU运行时伪函数库(libcudart.so)替换NVIDIA自带的GPU运行时函数库(libcudart.so)。该伪函数库将GPU内存创建类函数(cudaMalloc等)、GPU内存拷贝类函数(cudaMemcpy等)、GPU内核执行函数(ccudaConfigureCall)、GPU同步类函数(cudaDeviceSynchronize等)的函数体替换为相应函数的字符输出信息。当一个用户向GPU集群中的头结点提交待执行的GPU应用程序时,在GPU集群的头结点中运行该应用程序,即可在避免真实运行的模式下,获得该应用程序所需执行的GPU关键函数信息,从而获得该应用程序的GPU使用模式;另一方面,使用NVIDIA自带工具CUOBJDUMP、PTXAS,静态解析该应用程序中的GPU内核函数,抽取应用程序所需使用的GPU资源需求信息;
步骤3,根据步骤2中的获取应用程序的GPU使用模式和GPU资源需求信息,以及当前GPU集群中各个GPU节点的资源使用状况,在GPU集群的头结点中,调度所到达的应用程序到适宜的GPU节点上运行。
步骤1中,所述的同步函数专指GPU内存拷贝类同步函数(cudaMemcpy等)、GPU内核执行函数(ccudaConfigureCall,不含有流参或使用默认流参)、GPU设备同步函数(cudaDeviceSynchronize)。而对应的异步函数专指对应的GPU内存拷贝类异步函数(cudaMemcpyAsync等)、GPU内核执行函数(ccudaConfigureCall,含有流参)、GPU流同步函数(cudaStreamSynchronize)。
步骤1包括以下步骤:
步骤1-1,应用程序调用GPU运行时库函数时,若所需调用的GPU运行时库函数为同步函数,则将其变换为对应的异步函数;
步骤1-2,将应用程序对GPU运行时库函数的调用请求,包括函数名和参数,转发到本节点的服务器进程;
步骤1-3,本地服务器端进程根据所接收到的调用请求,执行相应的NVIDIA自带GPU运行时库函数,并返回执行结果给调用方。
步骤2中,所述GPU关键函数信息包括应用程序申请GPU内存类操作、在主机和GPU设备之间拷贝数据类操作、执行GPU内核函数操作、GPU设备流同步操作和GPU设备同步操作;所述GPU使用模式是由GPU关键函数构成的有向图;所述GPU资源需求信息包括执行GPU内核函数所需的块(CUDABlock)数量、线程(CUDAThread)数量、全局内存数量、共享内存数量和寄存器数量。
步骤2中,所述获得该应用程序的GPU使用模式,具体包括以下步骤:
步骤2-1,在GPU运行时函数库为伪库的环境下,执行应用程序代码,依次获得GPU关键函数信息;
步骤2-2,根据各个GPU关键函数信息,构造描述GPU函数调用顺序的有向图,从而获得GPU使用模式;
步骤2-3,根据各个GPU关键函数信息,获取该应用程序所需的块(CUDABlock)数量、线程(CUDAThread)数量和全局内存数量信息。
步骤2中,所述抽取应用程序的GPU资源需求信息,具体包括以下步骤:
步骤2-4,使用NVIDIA自带工具CUOBJDUMP,抽取应用程序中GPU内核函数的并行线程执行(Parallel Thread eXecution,PTX)代码;
步骤2-5,使用NVIDIA自带工具PTXAS,解析该应用程序的所有并行线程执行(Parallel Thread eXecution,PTX)代码,获取GPU内核函数所需的共享内存数量和寄存器数量信息;
步骤2-6,将步骤2-3中获取的块(CUDABlock)数量、线程(CUDAThread)数量和全局内存数量信息,与步骤2-5中获取的共享内存数量和寄存器数量信息结合,即获得了该应用程序所需使用的GPU资源需求信息。
步骤3包括以下步骤:
步骤3-1,在GPU集群的头结点中维护一个列表,其中记录各个GPU计算节点当前拥有的GPU资源信息,包括:块(CUDABlock)数量、线程(CUDAThread)数量、全局内存数量、共享内存数量和寄存器数量。这些信息的初始值为GPU计算节点硬件支持的各种资源的数量。
步骤3-2,寻找当前GPU集群中是否存在空闲的GPU计算节点,若存在,则将到达的应用程序调度到最近的空闲GPU计算节点,转到步骤3-6;否则,转到步骤3-3;
步骤3-3,从最近被调度节点的下一个节点开始,根据待调度应用程序的GPU使用模式和GPU资源需求信息,以及各个GPU计算节点当前拥有的GPU资源信息,寻找第一个能满足该应用程序资源需求的GPU计算节点,若找到,则转到步骤3-6;否则,该应用程序放入待调度队列,并转到步骤3-4;
步骤3-4,当有GPU计算节点向头结点汇报其上的一个应用程序执行结束时,头结点检查待调度队列中是否有等待被调度的应用程序,若存在,则从队头开始,找到一个应用程序,并转到步骤3-5;否则,转到步骤3-7;
步骤3-5,判断该GPU计算节点能否满足该应用程序资源需求,若该GPU计算节点能够满足,则转步骤3-6;否则,找后一个等待被调度的应用程序,转步骤3-5;
步骤3-6,将应用程序调度到所选定的GPU计算节点上,并在GPU集群的头结点维护的列表中,更新对应GPU计算节点的GPU资源信息;
步骤3-7,结束步骤3的流程。
本发明方法主要解决多个独立应用程序在NVIDIAGPU集群中运行时,同一个GPU上的多个应用程序之间争用其上的GPU资源,从而导致应用程序性能下降的问题。
本发明主要针对GPU集群环境中GPU利用率低下的问题,提出了一种避免多个应用程序在同一个GPU节点上执行时出现GPU资源争用的中间件,能够在应用程序到达时,快速、透明的抽取其GPU行为特征,并根据相应的调度算法,将其调度到合适的GPU节点上运行。此外,为了最大程度的避免同一个GPU节点上多个应用程序之间GPU资源争用问题,在每个GPU节点上,构建了一个支持多个应用程序细粒度并发执行的插件。本发明所提出的中间件,在保障应用程序执行性能(周转时间)的前提下,提高了GPU的利用率和系统吞吐率。
有益效果:
本发明的有效之处在于:
通过在应用程序到达时快速、透明的抽取应用程序GPU行为特征,结合支持多个独立应用程序细粒度并发执行的插件,可以有效避免多个应用程序在一个GPU上执行时的资源争用,保障应用程序执行性能,提高GPU的利用率和系统吞吐率。
本发明与现有技术相比,具有以下优点:
1、本发明能够快速、透明、准确、提前的抽取应用程序的GPU使用模式和GPU资源需求信息,可以在应用程序执行之前快速获取其GPU行为特征,为有此类需求的研究提供了参考;
2、对支持多个独立应用程序细粒度并发执行的插件,可以帮助一个GPU设备上多个独立应用程序细粒度并发执行,为优化应用程序的执行性能,提高GPU利用率的相关研究提供了新思路;
3、将抽取GPU行为特征、冲突避免的调度机制、细粒度并发执行插件有机结合,为有效解决GPU集群环境中的GPU利用率低下的问题提供了新思路;
4、本发明提出的避免GPU资源争用的中间件,可扩展性高,计算复杂度低,可以适用于大规模的GPU集群环境。
5、模块化的设计使得系统的各个组件之间耦合度较低,各个模块之间交互简单,可以适应新的需求和扩展。
GPU高性能计算作为一种热门的技术,发展前景令人期待;GPU集群计算作为GPU高性能计算中最重要的问题之一值得人们关注。在此背景下,本发明针对GPU集群利用率低下的问题,通过对到达的应用程序GPU行为特征进行抽取,根据GPU集群中GPU计算节点的资源状态,对应用程序进行调度,并结合多个独立应用程序细粒度并发执行的插件,有效避免多个应用程序在一个GPU上执行时的资源争用,保障应用程序执行性能,提高GPU的利用率和系统吞吐率。
附图说明
下面结合附图和具体实施方式对本发明做更进一步的具体说明,本发明的上述或其他方面的优点将会变得更加清楚。
图1为GPU集群示意图。
图2为本发明实现的各个组件框架图。
图3为本发明实现的应用程序调度模块算法流程图。
图4为本发明实现的GPU节点上应用程序GPU运行时函数执行过程序列图。
图5a为关键函数信息。
图5b为本发明实现的表示关键函数调用顺序的有向图,即应用程序的GPU使用模式图。
具体实施方式
下面结合附图及实施例对本发明做进一步说明。
本发明公开了一种面向GPU集群环境的避免GPU资源争用的方法,结合GPU集群平台中已有的功能,在平台中增加三个模块,分别是应用程序GPU行为特征抽取模块、应用程序调度模块和支持多应用程序细粒度并发模块。具体实现方法如下:
在应用程序GPU行为特征抽取模块中,主要目的是在应用程序正式运行之前,抽取应用程序的GPU使用模式和GPU资源需求信息,为应用程序的调度做出决策依据。主要执行如下流程,如图2所示:
步骤1,在GPU集群的头结点中,用户的一个GPU应用程序到达;
步骤2,在GPU集群的头结点中,运行该应用程序(头结点中GPU运行时函数库为一伪库);
步骤3,获取该应用程序在运行过程中所调用的关键函数信息;
步骤4,根据所给的关键函数信息,构造表示关键函数调用顺序的有向图,即应用程序的GPU使用模式;
步骤5,根据所给的关键函数信息,获取该应用程序所需的块(CUDABlock)数量、线程(CUDA Thread)数量、GPU全局内存数量信息;
步骤6,根据应用程序的可执行文件,使用NVIDIA自带的CUOBJDUMP工具,提取GPU内核函数的并行线程执行(Parallel Thread eXecution,PTX)代码;
步骤7,使用NVIDIA自带的PTXAS工具,解析并行线程执行(Parallel ThreadeXecution,PTX)代码,获取应用程序所需的共享内存数量、寄存器数量信息,结合步骤5,即获得了应用程序的GPU资源需求信息。
在应用程序调度模块中,根据应用程序的GPU行为特征,以及GPU集群中各个GPU计算节点所拥有的资源状态信息,调度应用程序到相应的GPU计算节点。本模块主要执行流程,如图3所示。具体步骤如下所述:
步骤1,寻找GPU集群中空闲的GPU计算节点;
步骤2,如果找到,则将应用程序调度到该GPU计算节点,调度完成;否则转到步骤3;
步骤3,从最近被调度节点的下一个节点开始,寻找第一个能满足该应用程序资源需求的GPU计算节点;
步骤4,如果找到,则将应用程序调度到该GPU计算节点,调度完成;否则转到步骤5;
步骤5,寻找待调度队列中后一个待调度的应用程序;
步骤6,若找到,则转到步骤3。
当某个GPU计算节点上的一个应用程序运行完毕后,主要执行如下步骤:
步骤7,寻找待调度队列中第一个待调度的应用程序;
步骤8,判断该GPU计算节点能否满足该应用程序的资源需求;
步骤9,如果满足,则将应用程序调度到该GPU计算节点,调度完成;否则转到步骤3;
步骤10,寻找待调度队列中后一个待调度的应用程序;
步骤11,如果找到,则转到步骤8。
在支持多应用程序细粒度并发模块中,主要作用是帮助多个独立的应用程序在同一个GPU节点上细粒度并发执行。该模块包括一个GPU运行时伪函数库和一个服务器进程,前者供应用程序调用,后者用于真正执行GPU命令。本模块能够实现多个独立应用程序细粒度并发的原理是一个GPU设备只创建一个CUDA上下文,从而避免CUDA上下文切换的开销。另一方面,来自应用程序的GPU同步函数操作将变换为对应的异步函数操作,从而使得多个应用程序的GPU操作,能够在服务器端细粒度并发执行。该模块将被部署到GPU集群中的所有计算节点上,其主要执行如下流程,如图2和图4所示:
步骤1,一个GPU应用程序被调度到GPU计算节点上,并调用GPU运行时库函数;
步骤2,GPU运行时伪函数库拦截到应用程序的调用请求;
步骤3,若所请求的为GPU同步函数操作,则将其转化为对应的异步函数;
步骤4,若所请求的为GPU内核计算操作,则为其加上流参数,并加上一个流同步函数;
步骤5,将该更新的请求发送给本节点的服务器进程;
步骤6,服务器进程执行相应的GPU操作,并将结果返回给调用者。
将应用程序GPU行为特征抽取模块、应用程序调度模块部署到GPU集群的头结点中;支持多应用程序细粒度并发模块部署到GPU集群的每个计算节点中,可以有效避免多个应用程序在一个GPU上执行时的资源争用,保障应用程序执行性能,提高GPU的利用率和系统吞吐率。
实施例
结合图1和图2,GPU集群中分为两类节点:GPU头结点和GPU计算节点。其中GPU头结点为一个,其余均为GPU计算节点,节点之间通过以太网或Infiniband进行连接。GPU集群中各个节点配置相同数量、型号的NVIDIA Kepler GPU。在各个GPU计算节点,安装CUDA7.0或以上版本的GPU运行环境。
结合GPU集群平台中已有的功能,在平台中增加三个模块:应用程序GPU行为特征抽取模块、应用程序调度模块和支持多应用程序细粒度并发模块。具体的实施步骤将结合一个实例进行描述:
在应用程序GPU行为特征抽取模块中,抽取的信息包括:GPU内存申请类操作(cudaMalloc等)、主机和GPU设备之间拷贝数据类操作(cudaMemcpy等)、执行GPU内核函数操作(cudaConfigureCall)、GPU设备流同步操作(cudaStreamSynchronize)、GPU设备同步操作(cudaDeviceSynchronize)、内核函数所需的块(CUDABlock)数量、线程(CUDAThread)数量、GPU全局内存数量、共享内存数量、寄存器数量。
上述GPU行为特征数据中,GPU内存申请操作、主机和GPU设备之间拷贝数据操作、执行GPU内核函数操作、GPU设备流同步操作、GPU设备同步操作可以通过GPU头节点中维护的一块共享内存中读取。头节点的GPU运行时伪函数库会向该共享内存写入上述关键函数信息。块(CUDABlock)数量、线程(CUDAThread)数量、全局内存数量可以通过上述关键函数信息获取。共享内存数量、寄存器数量可以通过NVIDIA CUOBJDUMP、PTXAS工具解析后得到的。
在GPU集群的头结点,使用自行编写的GPU运行时伪函数库(libcudart.so)替换NVIDIA自带的GPU运行时函数库(libcudart.so)。该伪函数库将GPU内存创建类函数(cudaMalloc等)、GPU内存拷贝类函数(cudaMemcpy等)、GPU内核执行函数(cudaConfigureCall)、GPU同步类函数(cudaDeviceSynchronize等)的函数体替换为相应函数的字符输出信息。这些函数即为本发明所述的关键函数。
当一个GPU应用程序到达GPU集群的头节点时,在头结点中运行该应用程序,即可在避免真实运行的模式下,获得该应用程序在运行过程中所需调用的cudaMalloc、cudaMemcpy、cudaConfigureCall、cudaDeviceSynchronize等函数及其参数信息。图5a为一个应用程序所输出的关键函数信息的示例。其中,每一行表示一个关键函数信息,开头是关键函数的名称,其后是该函数的参数信息。
其次,对包含上述关键函数信息进行分析:拥有不同流参的关键函数之间可以并发执行,拥有同一个流参的关键函数之间只能串行执行。从而可以构造一个表示关键函数调用顺序的有向图,如图5b所示。至此,该应用程序的GPU使用模式获取完毕。
最后,从所输出的关键函数信息中,可以获取块(CUDABlock)数量、线程(CUDAThread)数量、全局内存数量。具体的,如图5a所示,从cudaMalloc等内存申请类函数的参数中,获取该应用程序所需要的全局内存数据;从cudaConfigureCall函数的参数中,获取块(CUDABlock)数量、线程(CUDAThread)数量。另一方面,通过使用NVIDIA自带工具CUOBJDUMP、PTXAS工具,再获取执行该应用程序GPU内核函数所需的共享内存数量、寄存器数量。至此,该应用程序的GPU资源需求信息获取完毕。
在应用程序调度模块中,以抽取到的GPU使用模式和GPU资源需求信息作为输入,结合各个GPU计算节点当前拥有的资源信息,输出所到达的应用程序需要被调度到的GPU计算节点编号。该模块的核心调度算法如图3所示。因前文已详细描述,此处不再赘述。
在支持多应用程序细粒度并发模块中,其核心为一个支持多应用程序细粒度并发执行的插件:该插件包含一个自行编写的GPU运行时伪函数库(libcudart.so)和一个自行编写的本地服务器进程,前者(GPU运行时伪函数库)与NVIDIA自带的GPU运行时函数库(libcudart.so)有相同的函数原型,但各个函数实现体的基本功能包括:变换同步函数为异步函数;向后者(本地服务器进程)转发相关的函数执行请求。
当应用程序被调度到某个GPU计算节点上运行时,该GPU计算节点上的GPU运行时伪函数库将会拦截到该信息,并将其经过函数变换后,发往一块共享内存中,并等待返回值。另一方面,本节点上的服务器进程会读取该共享内存中的信息,并执行读到的GPU命令,并返回相应的结果。服务器端再将结果写回该共享内存,供调用方读取。
针对图5b所对应的应用程序,当其要调用cudaMalloc函数时,则GPU运行时伪函数库不经过函数变换,直接将其发往共享内存中;当其要调用cudaMemcpy函数时,则GPU运行时伪函数库会将其变换为对应的异步函数cudaMemcpyAsync函数,并发往共享内存中;当其要调用cudaConfigureCall函数时,因其本身就含有流参,因此直接将其发往共享内存即可;当其要调用cudaDeviceSynchronize函数时,则GPU运行时伪函数库会将其变换为对应的cudaStreamSynchronize函数,并发往共享内存中。另一方面,该GPU计算节点上的本地服务器进程会依次读取、执行该共享内存中的信息,并返回结果给调用方。
本发明提供了一种面向GPU集群环境的避免GPU资源争用的方法,具体实现该技术方案的方法和途径很多,以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。本实施例中未明确的各组成部分均可用现有技术加以实现。
Claims (6)
1.一种面向GPU集群环境的避免GPU资源争用的方法,其特征在于,包括以下步骤:
步骤1,构建一个支持多应用程序细粒度并发执行的插件:该插件包含一个自行编写的GPU运行时伪函数库和一个自行编写的本地服务器进程,GPU运行时伪函数库与NVIDIA自带的GPU运行时函数库有相同的函数原型,但各个函数实现体的基本功能包括:变换同步函数为异步函数;向本地服务器进程转发相关的函数执行请求;该细粒度并发执行插件的作用为:同一个GPU节点上的多个应用程序对GPU运行时库函数的调用,均需通过GPU运行时伪函数库变换、转发,并通过本地服务器进程执行;
步骤2,在GPU集群的头结点,使用自行编写的GPU运行时伪函数库替换NVIDIA自带的GPU运行时函数库,该伪函数库将GPU内存创建类函数、GPU内存拷贝类函数、GPU内核执行函数、GPU同步类函数的函数体替换为相应函数的字符输出信息;当一个用户向GPU集群中的头结点提交待执行的GPU应用程序时,在GPU集群的头结点中运行该应用程序,即能够在避免真实运行的模式下,获得该应用程序运行过程中所需执行的GPU关键函数信息,从而获得该应用程序的GPU使用模式;另一方面,使用NVIDIA自带工具CUOBJDUMP、PTXAS,静态解析该应用程序中的GPU内核函数,能够抽取应用程序所需使用的GPU资源需求信息;
步骤3,根据步骤2中的获取应用程序的GPU使用模式和GPU资源需求信息,以及当前GPU集群中各个GPU节点的资源使用状况,在GPU集群的头结点中,调度所到达的GPU应用程序到适宜的GPU节点上运行;
步骤1中,所述的同步函数专指GPU内存拷贝类同步函数、GPU内核执行函数和GPU设备同步函数,而对应的异步函数专指对应的GPU内存拷贝类异步函数、GPU内核执行函数和GPU流同步函数。
2.根据权利要求1所述的方法,其特征在于,步骤1包括以下步骤:
步骤1-1,应用程序调用GPU运行时库函数时,若所需调用的GPU运行时库函数为同步函数,则将其变换为对应的异步函数;
步骤1-2,将应用程序对GPU运行时库函数的调用请求,包括函数名和参数,转发到本节点的服务器进程;
步骤1-3,本地服务器端进程根据所接收到的调用请求,执行相应的NVIDIA自带GPU运行时库函数,并返回执行结果给调用方。
3.根据权利要求2所述的方法,其特征在于,步骤2中,所述GPU关键函数信息包括应用程序申请GPU内存类操作、在主机和GPU设备之间拷贝数据类操作、执行GPU内核函数操作、GPU设备流同步操作和GPU设备同步操作;所述GPU使用模式是由GPU关键函数构成的有向图;所述GPU资源需求信息包括执行GPU内核函数所需的块CUDABlock数量、线程CUDAThread数量、全局内存数量、共享内存数量和寄存器数量。
4.根据权利要求3所述的方法,其特征在于,步骤2中,所述获得该应用程序的GPU使用模式,具体包括以下步骤:
步骤2-1,在GPU运行时函数库为伪库的环境下,执行应用程序代码,依次获得GPU关键函数信息;
步骤2-2,根据各个GPU关键函数信息,构造描述GPU函数调用顺序的有向图,从而获得GPU使用模式;
步骤2-3,根据各个GPU关键函数信息,获取该应用程序所需的块CUDA Block数量、线程CUDA Thread数量和全局内存数量信息。
5.根据权利要求4所述的方法,其特征在于,步骤2中,所述抽取应用程序的GPU资源需求信息,具体包括以下步骤:
步骤2-4,使用NVIDIA自带工具CUOBJDUMP,抽取应用程序中GPU内核函数的并行线程执行PTX代码;
步骤2-5,使用NVIDIA自带工具PTXAS,解析所有的并行线程执行PTX代码,获取GPU内核函数所需的共享内存数量和寄存器数量信息;
步骤2-6,将步骤2-3中获取的块CUDA Block数量、线程CUDA Thread数量和全局内存数量信息,与步骤2-5中获取的共享内存数量和寄存器数量信息结合,即获得了该应用程序所需使用的GPU资源需求信息。
6.根据权利要求5所述的方法,其特征在于,步骤3包括以下步骤:
步骤3-1,在GPU集群的头结点中维护一个列表,其中记录各个GPU计算节点当前拥有的GPU资源信息,包括:块CUDABlock数量、线程CUDAThread数量、全局内存数量、共享内存数量和寄存器数量,这些信息的初始值为GPU计算节点硬件支持的各种资源的数量;
步骤3-2,寻找当前GPU集群中是否存在空闲的GPU计算节点,若存在,则将到达的应用程序调度到最近的空闲GPU计算节点,转到步骤3-6;否则,转到步骤3-3;
步骤3-3,从最近被调度节点的下一个节点开始,根据待调度应用程序的GPU使用模式和GPU资源需求信息,以及各个GPU计算节点当前拥有的GPU资源信息,寻找第一个能满足该应用程序资源需求的GPU计算节点,若找到,则转到步骤3-6;否则,该应用程序放入待调度队列,并转到步骤3-4;
步骤3-4,当有GPU计算节点向头结点汇报其上的一个应用程序执行结束时,头结点检查待调度队列中是否有等待被调度的应用程序,若存在,则从队头开始,找到一个应用程序,并转到步骤3-5;否则,转到步骤3-7;
步骤3-5,判断该GPU计算节点能否满足该应用程序资源需求,若该GPU计算节点能够满足,则转步骤3-6;否则,找后一个等待被调度的应用程序,转步骤3-5;
步骤3-6,将应用程序调度到所选定的GPU计算节点上,并在GPU集群的头结点维护的列表中,更新对应GPU计算节点的GPU资源信息;
步骤3-7,结束步骤3的流程。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201711326972.XA CN107943592B (zh) | 2017-12-13 | 2017-12-13 | 一种面向gpu集群环境的避免gpu资源争用的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201711326972.XA CN107943592B (zh) | 2017-12-13 | 2017-12-13 | 一种面向gpu集群环境的避免gpu资源争用的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN107943592A CN107943592A (zh) | 2018-04-20 |
CN107943592B true CN107943592B (zh) | 2020-06-12 |
Family
ID=61944033
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201711326972.XA Active CN107943592B (zh) | 2017-12-13 | 2017-12-13 | 一种面向gpu集群环境的避免gpu资源争用的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN107943592B (zh) |
Families Citing this family (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109542731B (zh) * | 2018-11-28 | 2019-07-09 | 北京物资学院 | 一种面向gpu的层次递进下钻的性能监测方法 |
CN109857564A (zh) * | 2019-03-05 | 2019-06-07 | 上海交通大学 | 基于细粒度的gpu的资源管理方法及其应用的gpu |
CN110442389B (zh) * | 2019-08-07 | 2024-01-09 | 北京技德系统技术有限公司 | 一种多桌面环境共享使用gpu的方法 |
CN113391932B (zh) * | 2021-06-07 | 2023-10-27 | 北京科技大学 | 面向异构众核架构的并行特征线法输运扫描方法及装置 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8533697B2 (en) * | 2007-02-14 | 2013-09-10 | The Mathworks, Inc. | Graphical processing unit (GPU) arrays providing high computational capabilities in a computing environment |
CN103299277A (zh) * | 2011-12-31 | 2013-09-11 | 华为技术有限公司 | Gpu系统及其处理方法 |
CN103365726A (zh) * | 2013-07-08 | 2013-10-23 | 华中科技大学 | 一种面向gpu集群的资源管理方法和系统 |
CN103761139A (zh) * | 2014-01-25 | 2014-04-30 | 湖南大学 | 一种基于动态库拦截的通用计算虚拟化实现方法 |
-
2017
- 2017-12-13 CN CN201711326972.XA patent/CN107943592B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8533697B2 (en) * | 2007-02-14 | 2013-09-10 | The Mathworks, Inc. | Graphical processing unit (GPU) arrays providing high computational capabilities in a computing environment |
CN103299277A (zh) * | 2011-12-31 | 2013-09-11 | 华为技术有限公司 | Gpu系统及其处理方法 |
CN103365726A (zh) * | 2013-07-08 | 2013-10-23 | 华中科技大学 | 一种面向gpu集群的资源管理方法和系统 |
CN103761139A (zh) * | 2014-01-25 | 2014-04-30 | 湖南大学 | 一种基于动态库拦截的通用计算虚拟化实现方法 |
Non-Patent Citations (2)
Title |
---|
GPU通用计算虚拟化方法研究;石林;《中国博士学位论文全文数据库》;20130615(第06期);第23-44页 * |
GScheduler: Optimizing Resource Provision by using GPU UsagePattern Extraction in Cloud Environment;Zhuqing Xu;《2017 IEEE International Conference on Systems, Man,and Cybernetics (SMC)》;20171201;第1-12页 * |
Also Published As
Publication number | Publication date |
---|---|
CN107943592A (zh) | 2018-04-20 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107943592B (zh) | 一种面向gpu集群环境的避免gpu资源争用的方法 | |
CN102360309B (zh) | 片上多核异构系统的调度系统与调度执行方法 | |
CN103809936A (zh) | 编译或运行时执行分叉-合并数据并行程序的系统和方法 | |
CN103793255B (zh) | 可配置的多主模式多os内核实时操作系统架构的启动方法 | |
Agarwal et al. | Deadlock-free scheduling of X10 computations with bounded resources | |
CN104243617A (zh) | 一种异构集群中面向混合负载的任务调度方法及系统 | |
CN111352896B (zh) | 人工智能加速器、设备、芯片以及数据处理方法 | |
EP1131704A1 (en) | Processing system scheduling | |
Miyoshi et al. | FLAT: A GPU programming framework to provide embedded MPI | |
CN103810041A (zh) | 一种支持动态伸缩的并行计算的方法 | |
Gharajeh et al. | Heuristic-based task-to-thread mapping in multi-core processors | |
CN112463340A (zh) | 基于tensorflow的多任务弹性调度方法及系统 | |
Vo et al. | HyperFlow: A Heterogeneous Dataflow Architecture. | |
CN112181689A (zh) | 一种在云端下进行gpu内核程序高效率调度的运行时系统 | |
CN108647087B (zh) | 实现php内核可重入的方法、装置、服务器和存储介质 | |
Liu et al. | BSPCloud: A hybrid distributed-memory and shared-memory programming model | |
Yang et al. | Managing asynchronous operations in Coarray Fortran 2.0 | |
Niknam et al. | Resource optimization for real-time streaming applications using task replication | |
Czarnul | A multithreaded CUDA and OpenMP based power‐aware programming framework for multi‐node GPU systems | |
Chung et al. | Scheduling across multiple applications using task-based programming models | |
De Munck et al. | Design and performance evaluation of a conservative parallel discrete event core for GES | |
Huang et al. | ILP based multithreaded code generation for Simulink model | |
Tarakji et al. | Os support for load scheduling on accelerator-based heterogeneous systems | |
Domaschka et al. | Multithreading strategies for replicated objects | |
De Sensi et al. | State-aware concurrency throttling |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
CB02 | Change of applicant information | ||
CB02 | Change of applicant information |
Address after: 210019 No. 58 East Street, Nanxi River, Jianye District, Nanjing, Jiangsu Applicant after: Zhong Tong clothing consulting and Design Research Institute Co., Ltd. Applicant after: Southeast University Address before: 210019 No. 58 East Street, Nanxi River, Jianye District, Nanjing, Jiangsu Applicant before: Jiangsu Posts & Telecommunications Planning and Designing Institute Co., Ltd. Applicant before: Southeast University |
|
GR01 | Patent grant | ||
GR01 | Patent grant |