一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

GPU任务实时抢占方法及系统

2022-11-30 13:04:10 来源:中国专利 TAG:

gpu任务实时抢占方法及系统
技术领域
1.本发明涉及gpu任务调度技术领域,具体地,涉及一种gpu任务实时抢占方法及系统。


背景技术:

2.图形处理单元(graphic processing unit,简称gpu)目前被广泛用于加速图形渲染、仿真模型、高性能计算以及人工智能模型的训练与推理等并行计算任务。
3.随着gpu硬件规格和计算能力的不断提高,很多系统逐渐倾向于使用单个gpu并发执行多个计算任务,以提高gpu硬件资源利用率和系统的吞吐量。例如在智能驾驶系统中,gpu可以被用于执行障碍物检测、红绿灯识别等人工智能模型推理任务,也会被同时用来渲染用户界面。当多种具有不同优先级的任务在gpu上并发地执行时,应当根据任务的优先级对其进行gpu资源的分配与调度,例如先执行高优先级任务从而降低其响应时延。
4.抢占式调度是一个典型的基于任务优先级的调度机制,其通过暂停正在执行的低优先任务并将计算资源重新分配给高优先级任务,从而降低高优先级任务的响应时延。然而,目前商用的gpu不具备任务抢占的功能,或者没有提供用户可以调用的任务抢占的功能接口。这使得当多个gpu计算任务同时在一个gpu上计算时,gpu没法进行抢占式的任务调度。例如当一个高优先级任务到达时,若gpu正在执行一个低优先级任务,由于缺乏任务抢占功能,高优先级任务只能在低优先级任务完成后才可以执行,最终增加了高优先级任务的响应时延,在自动驾驶等实时计算的场景甚至会导致安全问题。
5.专利文献cn113051059a(申请号:cn202110384794.6)公开了一种多gpu的任务实时调度方法及装置,所述的多gpu的任务实时调度方法包括:各gpu初始化与显卡同等数量的信号标记,信号标记包括任务锁lock;根据待执行任务的相关参数,判断是否执行任务锁lock抢占策略。
6.目前典型的gpu计算任务由大量顺序执行的gpu内核组成,抢占一个正在执行的gpu计算任务主要包含两个子步骤:一是打断正在执行的gpu内核;二是阻止被抢占任务的剩余gpu内核提交到gpu中执行。对于第一个子步骤,现有方法主要分为两类:
7.第一类是通过与cpu一样的上下文切换的方式,将正在执行的gpu内核状态(例如寄存器)保存到gpu内存中,然后切换执行新的任务,当恢复被抢占的gpu内核时,只需要将其上下文从gpu内存中重新加载到gpu执行单元即可。第二类是等待所有正在执行线程块结束,然后记录未开始的线程块,由于不同的线程块之间是相互独立的,因此在恢复被抢占的gpu内核时,只需要重新执行被抢占的gpu内核中未开始的线程块即可。然而,以上两类方法均会导致较高的内核抢占时延:第一类方法由于gpu内核的上下文往往有若干兆字节,保存如此多的上下文数据,会显著增加抢占的时延;第二类方法需要等待正在执行的线程块完成计算,其抢占时延依赖于线程块的执行时间,等待执行较慢的线程块也会显著增加抢占时延。
8.对于第二个子步骤,现有的方法主要是阻塞用户程序将gpu内核提交到gpu运行时
中,每当上一个提交到gpu运行时的gpu内核执行完成后才会提交下一个gpu内核,从而保证gpu运行时中最多只有一个gpu内核在等待。此方法增加了内核启动的性能开销,尤其在需要执行大量gpu内核的应用中会显著降低程序性能。
9.综上,同时满足低性能开销、低抢占时延的gpu任务抢占方法是本领域研究人员亟待解决的一大问题。


技术实现要素:

10.针对现有技术中的缺陷,本发明的目的是提供一种gpu任务实时抢占方法及系统。
11.根据本发明提供的gpu任务实时抢占方法,包括:
12.步骤s1:在离线阶段验证gpu内核的幂等性,并在gpu内核中进行代码插桩;
13.步骤s2:在运行阶段,初始化抢占标记与后台线程,劫获用户提交的gpu内核,并缓存在gpu内核缓冲队列中,使用后台线程将gpu内核缓冲队列的gpu内核提交到gpu运行时中;
14.步骤s3:在用户调用gpu任务抢占功能时,暂停后台线程,设置抢占标记,并根据当前运行的gpu内核是否具备幂等性决定是否重置gpu计算单元;
15.步骤s4:在用户调用gpu任务恢复功能时,重置抢占标记,并将被抢占的gpu内核重新加入到gpu内核缓冲队列中,恢复后台线程。
16.优选的,所述步骤s1包括:
17.步骤s1.1:在离线阶段验证即将执行的gpu内核是否具备幂等性,若无法验证,则默认其不具备幂等性;
18.步骤s1.2:在离线阶段对即将执行的gpu内核代码进行插桩,插桩的内容包括:在gpu内核开始运行时,检查抢占标记变量,若抢占标记变量的值为true,则退出结束当前gpu内核,否则继续执行gpu内核。
19.优选的,所述步骤s2包括:
20.步骤s2.1:在gpu内存中创建抢占标记变量,并初始化为false,然后创建后台线程;
21.步骤s2.2:通过劫持gpu运行时动态链接库api调用,劫获用户提交的gpu内核,并将劫获的gpu内核保存在gpu内核缓冲队列中;
22.步骤s2.3:使用后台线程异步地将gpu内核缓冲队列中的gpu内核提交到gpu运行时中;后台线程控制在gpu运行时中未执行完成的gpu内核的数量不超过8个,若gpu运行时中未执行完成的gpu内核数量大于等于8个,后台线程暂停提交gpu内核直到其数量小于8个。
23.优选的,所述步骤s3包括:
24.步骤s3.1:在用户调用gpu任务抢占功能后,后台线程暂停提交gpu内核;
25.步骤s3.2:将gpu中的抢占标记变量的值设置为true;
26.步骤s3.3:根据离线阶段验证的幂等性信息,检查已经提交到gpu运行时中的gpu内核是否都具备幂等性,若都具备幂等性则重置gpu的计算单元,否则不重置。
27.优选的,所述步骤s4包括:
28.步骤s4.1:将gpu中的抢占标记变量的值设置为false;
29.步骤s4.2:将在步骤s2.3中已经提交到gpu运行时但没有执行的gpu内核重新提交到gpu运行时中;
30.步骤s4.3:恢复后台线程,使其继续步骤s2.3。
31.根据本发明提供的gpu任务实时抢占系统,包括:
32.模块m1:在离线阶段验证gpu内核的幂等性,并在gpu内核中进行代码插桩;
33.模块m2:在运行阶段,初始化抢占标记与后台线程,劫获用户提交的gpu内核,并缓存在gpu内核缓冲队列中,使用后台线程将gpu内核缓冲队列的gpu内核提交到gpu运行时中;
34.模块m3:在用户调用gpu任务抢占功能时,暂停后台线程,设置抢占标记,并根据当前运行的gpu内核是否具备幂等性决定是否重置gpu计算单元;
35.模块m4:在用户调用gpu任务恢复功能时,重置抢占标记,并将被抢占的gpu内核重新加入到gpu内核缓冲队列中,恢复后台线程。
36.优选的,所述模块m1包括:
37.模块m1.1:在离线阶段验证即将执行的gpu内核是否具备幂等性,若无法验证,则默认其不具备幂等性;
38.模块m1.2:在离线阶段对即将执行的gpu内核代码进行插桩,插桩的内容包括:在gpu内核开始运行时,检查抢占标记变量,若抢占标记变量的值为true,则退出结束当前gpu内核,否则继续执行gpu内核。
39.优选的,所述模块m2包括:
40.模块m2.1:在gpu内存中的创建抢占标记变量,并初始化为false,然后创建后台线程;
41.模块m2.2:通过劫持gpu运行时动态链接库api调用,劫获用户提交的gpu内核,并将劫获的gpu内核保存在gpu内核缓冲队列中;
42.模块m2.3:使用后台线程异步地将gpu内核缓冲队列中的gpu内核提交到gpu运行时中;后台线程控制在gpu运行时中未执行完成的gpu内核的数量不超过8个,若gpu运行时中未执行完成的gpu内核数量大于等于8个,后台线程暂停提交gpu内核直到其数量小于8个。
43.优选的,所述模块m3包括:
44.模块m3.1:用户调用gpu任务抢占功能后,后台线程暂停提交gpu内核;
45.模块m3.2:将gpu中的抢占标记变量的值设置为true;
46.模块m3.3:根据离线阶段验证的幂等性信息,检查已经提交到gpu运行时中的gpu内核是否都具备幂等性,若都具备幂等性则重置gpu的计算单元,否则不重置。
47.优选的,所述模块m4包括:
48.模块m4.1:将gpu中的抢占标记变量的值设置为false;
49.模块m4.2:将在模块m2.3中已经提交到gpu运行时但没有执行的gpu内核重新提交到gpu运行时中;
50.模块m4.3:恢复后台线程,使其继续模块m2.3。
51.与现有技术相比,本发明具有如下的有益效果:
52.(1)本发明后台线程始终保持gpu运行时中有多个异步提交的gpu内核,避免了在
每个gpu内核执行完成后的同步操作带来的性能开销;
53.(2)本发明通过在离线阶段对gpu内核进行代码插桩,使其在运行前通过检查抢占标记变量的值判断是否继续执行,实现了在任务抢占时清理已经提交到gpu运行时但未执行的gpu内核的功能;
54.(3)本发明对于具有幂等性的gpu内核,通过直接重置gpu计算单元实现gpu内核的抢占,不需要保存正在执行的gpu内核的上下文,也不需要等待正在执行的gpu内核完成,降低了gpu内核抢占时延。
附图说明
55.通过阅读参照以下附图对非限制性实施例所作的详细描述,本发明的其它特征、目的和优点将会变得更明显:
56.图1为本发明任务抢占示意图;
57.图2为本发明代码插桩的示意图。
具体实施方式
58.下面结合具体实施例对本发明进行详细说明。以下实施例将有助于本领域的技术人员进一步理解本发明,但不以任何形式限制本发明。应当指出的是,对本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变化和改进。这些都属于本发明的保护范围。
59.实施例:
60.根据本发明提供的一种gpu任务实时抢占方法,包括:
61.步骤s1:在离线阶段验证gpu内核的幂等性,并在gpu内核中进行代码插桩;
62.步骤s2:在运行阶段,初始化抢占标记与后台线程,劫获用户提交的gpu内核,并缓存在gpu内核缓冲队列中,使用后台线程将gpu内核缓冲队列的gpu内核提交到gpu运行时中;
63.步骤s3:用户调用gpu任务抢占功能,暂停后台线程,设置抢占标记,并根据当前运行的gpu内核是否具备幂等性决定是否重置gpu计算单元;
64.步骤s4:用户调用gpu任务恢复功能,重置抢占标记,并将被抢占的gpu内核重新加入到gpu内核缓冲队列中,恢复后台线程。
65.所述步骤s1包括:
66.步骤s1.1:在离线阶段验证即将执行的gpu内核是否具备幂等性,若无法验证,则默认其不具备幂等性;
67.步骤s1.2:在离线阶段对即将执行的gpu内核代码进行插桩,插桩的内容包括:在gpu内核开始运行时,检查抢占标记变量,若抢占标记变量的值为true,则退出结束当前gpu内核,否则继续执行gpu内核;
68.所述步骤s2包括:
69.步骤s2.1:在gpu内存中的创建抢占标记变量,并初始化为false;创建后台线程;
70.步骤s2.2:通过劫持gpu运行时动态链接库api调用,劫获用户提交的gpu内核,并将劫获的gpu内核保存在gpu内核缓冲队列中;
71.步骤s2.3:使用后台线程异步地将gpu内核缓冲队列中的gpu内核提交到gpu运行时中;
72.具体地,所述步骤s2.3中,后台线程需要控制在gpu运行时中未执行完成的gpu内核的数量不超过8个,若gpu运行时中未执行完成的gpu内核数量大于等于8个,后台线程暂停提交gpu内核直到其数量小于8个。
73.所述步骤s3包括:
74.步骤s3.1:用户调用gpu任务抢占功能后,后台线程暂停提交gpu内核;
75.步骤s3.2:将gpu中的抢占标记变量的值设置为true;
76.步骤s3.3:根据离线阶段验证的幂等性信息,检查已经提交到gpu运行时中的gpu内核是否都具备幂等性,若都具备幂等性则重置gpu的计算单元,否则不重置;
77.所述步骤s4包括:
78.步骤s4.1:将gpu中的抢占标记变量的值设置为false;
79.步骤s4.2:将在步骤s2.3中已经提交到gpu运行时但没有执行的gpu内核重新提交到gpu运行时中;
80.步骤s4.3:恢复后台线程,使其继续步骤s2.3。
81.根据本发明提供的一种gpu任务实时抢占系统,包括:
82.模块m1:在离线阶段验证gpu内核的幂等性,并在gpu内核中进行代码插桩;
83.模块m2:在运行阶段,初始化抢占标记与后台线程,劫获用户提交的gpu内核,并缓存在gpu内核缓冲队列中,使用后台线程将gpu内核缓冲队列的gpu内核提交到gpu运行时中;
84.模块m3:用户调用gpu任务抢占功能,暂停后台线程,设置抢占标记,并根据当前运行的gpu内核是否具备幂等性决定是否重置gpu计算单元;
85.模块m4:用户调用gpu任务恢复功能,重置抢占标记,并将被抢占的gpu内核重新加入到gpu内核缓冲队列中,恢复后台线程。
86.所述模块m1包括:
87.模块m1.1:在离线阶段验证即将执行的gpu内核是否具备幂等性,若无法验证,则默认其不具备幂等性;
88.模块m1.2:在离线阶段对即将执行的gpu内核代码进行插桩,插桩的内容包括:在gpu内核开始运行时,检查抢占标记变量,若抢占标记变量的值为true,则退出结束当前gpu内核,否则继续执行gpu内核;
89.所述模块m2包括:
90.模块m2.1:在gpu内存中的创建抢占标记变量,并初始化为false;创建后台线程;
91.模块m2.2:通过劫持gpu运行时动态链接库api调用,劫获用户提交的gpu内核,并将劫获的gpu内核保存在gpu内核缓冲队列中;
92.模块m2.3:使用后台线程异步地将gpu内核缓冲队列中的gpu内核提交到gpu运行时中;
93.具体地,所述模块m2.3中,后台线程需要控制在gpu运行时中未执行完成的gpu内核的数量不超过8个,若gpu运行时中未执行完成的gpu内核数量大于等于8个,后台线程暂停提交gpu内核直到其数量小于8个。
94.所述模块m3包括:
95.模块m3.1:用户调用gpu任务抢占功能后,后台线程暂停提交gpu内核;
96.模块m3.2:将gpu中的抢占标记变量的值设置为true;
97.模块m3.3:根据离线阶段验证的幂等性信息,检查已经提交到gpu运行时中的gpu内核是否都具备幂等性,若都具备幂等性则重置gpu的计算单元,否则不重置;
98.所述模块m4包括:
99.模块m4.1:将gpu中的抢占标记变量的值设置为false;
100.模块m4.2:将在模块m2.3中已经提交到gpu运行时但没有执行的gpu内核重新提交到gpu运行时中;
101.模块m4.3:恢复后台线程,使其继续模块m2.3。
102.下面结合附图对本发明作进一步说明。
103.图1描述了本发明中步骤s3中任务抢占的流程图,当用户调用gpu任务抢占接口后,首先需要暂停后台线程向gpu运行时提交gpu内核;接着将gpu内存中的抢占标记变量的值设置为true,从而使得在gpu运行时中还未执行的gpu内核在被提交到gpu后直接退出执行;然后根据离线阶段验证得到的幂等性信息,判断目前gpu运行时中正在执行的gpu内核以及还没有执行的gpu内核是否都具备幂等性,若都具备幂等性,则可以通过直接重置gpu计算单元来抢占gpu硬件资源,否则需要等待正在执行的gpu内核完成运算;最后等待gpu运行时中的内核全部退出(通过检查抢占标记变量),即可完成gpu任务的抢占。
104.图2描述了在离线阶段对gpu内核进行的代码插桩内容,在每个gpu内核执行的第一条指令前,插入一个条件判断语句,检查抢占标记变量的值是否为true,如果为true则立刻结束gpu内核的执行,否则继续正常的gpu内核执行过程,从而实现清理gpu运行中的还未运行的gpu内核。
105.本领域技术人员知道,除了以纯计算机可读程序代码方式实现本发明提供的系统、装置及其各个模块以外,完全可以通过将方法步骤进行逻辑编程来使得本发明提供的系统、装置及其各个模块以逻辑门、开关、专用集成电路、可编程逻辑控制器以及嵌入式微控制器等的形式来实现相同程序。所以,本发明提供的系统、装置及其各个模块可以被认为是一种硬件部件,而对其内包括的用于实现各种程序的模块也可以视为硬件部件内的结构;也可以将用于实现各种功能的模块视为既可以是实现方法的软件程序又可以是硬件部件内的结构。
106.以上对本发明的具体实施例进行了描述。需要理解的是,本发明并不局限于上述特定实施方式,本领域技术人员可以在权利要求的范围内做出各种变化或修改,这并不影响本发明的实质内容。在不冲突的情况下,本技术的实施例和实施例中的特征可以任意相互组合。
再多了解一些

本文用于创业者技术爱好者查询,仅供学习研究,如用于商业用途,请联系技术所有人。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献