发明内容
为解决现有调度技术无法实现同构多核处理器上考虑任务复制情况的并行节能调度问题,本发明提供了一种同构多核集群服务器中基于任务依赖度的并行任务分组调度方法。
本发明采用的技术方案如下:
多核集群服务器上基于依赖度的并行任务分组调度方法,包括以下步骤:
步骤(1)根据任务执行参数和依赖关系得到初始执行路径;然后,计算每条初始执行路径的负载,按照负载从大到小的顺序对初始执行路径进行排序;
步骤(2)根据给定的处理器个数,按照依赖关系安排初始执行路径运行位置,即按照初始执行路径之间的依赖关系,将两条或多条依赖度大的初始执行路径安排在同一个处理器上,组成一条优化后的执行路径;
步骤(3)将处理器使用个数减1,并按照步骤(2)安排所有N条初始执行路径的运行位置,寻找其它可选调度方案;
步骤(4)不断执行步骤(3),直到调度方案的完成时间超过允许的总体完成时间为止。在所有的可选调度方案列表中,选择完成时间小于或等于总体完成时间约束的、节约能耗最多的一组调度方案作为最终调度。
所述的步骤(1)的具体步骤如下:
(1-1)计算各个任务的执行参数,包括最优前驱任务、任务在依赖关系图中的高度;
(1-2)利用计算出来的执行参数,根据已有的任务复制调度算法,生成初始执行路径,并假设初始执行路径有N条(N≤总内核数),所述的总内核数是指给定的处理器的内核数之和;
(1-3)计算每条初始执行路径的负载,即初始执行路径上所有任务的执行时间总和;依据负载从大到小的顺序对初始执行路径进行排序,并假设所有初始执行路径中负载最大值为最大负载为Max_Load;
(1-4)根据所用系统的单个处理器内核个数,假设为K,设定最多可用处理器个数Max_CPU=生成初始执行路径条数/单个处理器内核个数=N/K取上整数;设置占用处理器个数初始值M=Max_CPU。
所述的初始执行路径任务未分配到处理器上时,任务的初始执行路径由TDS、EAD或PEBD算法生成。
所述的步骤(2)的具体步骤如下:
首先将N条初始执行路径的前M条路径分配到M个处理器的第一个核上,然后从第M+1条路径开始计算该路径对M个处理器的依赖度,选择依赖度最大的处理器上分配给该路径;该路径将运行在依赖度最大的处理器中的空闲时间最多的内核上;按照相同的方法,循环迭代安排第M+2至第N条路径的运行位置(即运行该路径的处理器及其内核);当所有N条初始执行路径安排完运行位置之后,将此时处理器个数、最后一个任务完成时间和总能耗作为一种可选调度方案,添加到{处理器个数、完成时间、总能耗}列表中。
所述的步骤(3)的具体步骤如下:
不断重复执行步骤(3),直到调度方案的完成时间超过允许的总体完成时间为止;在所有的可选调度方案列表中,在允许的总体完成时间范围内,选择节约能耗最多的一组调度方案作为最终调度。
本发明采用的方法与现有技术相比有如下优点:
本发明结合分组调度和复制调度的基本思想,本发明提出了一种考虑同构多核处理器结构的、基于任务集依赖度的并行任务分组调度方法,简称DG(Dependence Grouping)方法。通过计算任务执行路径之间的任务依赖度,根据任务路径之间依赖度的大小选择合适的任务执行路径进行合并,将合并之后的路径作为一个路径分组分配给一个处理器内核执行。DG方法可以充分利用内核的空闲时间,减少占用的处理器个数,从而降低系统总能量开销。DG方法与TDS、EAD和PEBD调度结合形成了三种优化的调度算法TDS_DG、EAD_DG和PEBD_DG。实验结果表明,优化后的三种算法与优化之前的相应算法相比,在任务总体执行时间不变或略微增加的情况下,而总体能耗得到的大幅降低,另外还有如下优点:
(1)相对于现有的同构多处理器调度算法,本发明能有效地减少处理器的使用个数,提高资源的利用效率,减少不必要的任务复制、处理器之间通信开销以及处理器的空闲时间,从而降低整个集群系统的能量消耗;
(2)本发明使用启发式算法形成一种静态调度方法,实现过程简单高效,对硬件要求低、计算开销小;
(3)本发明还可以根据任务集合总体完成时间约束或处理器的最大使用个数约束,生成符合约束要求的最节能的调度方案。
具体实施方式
下面首先给出本发明的相关定义,然后列出相关算法,最后给出一个具体实例,并结合附图对本发明做进一步地说明。
本发明提出了一种基于任务依赖度的任务分配算法,通过计算执行路径之间的依赖度,在不增加执行路径最大负载和符合执行任务之间的前驱后继约束关系的前提下,将执行路径之间依赖度大的路径进行合并,相对于原来算法达到了使处理器负载更加平衡、减少不必要的任务复制、减少处理器之间通信开销、减少处理器的空闲时间能耗,从而达到整体能耗减少。
根据任务执行参数和依赖关系得到初始的任务执行路径,然后根据任务执行路径之间依赖度大小将执行路径分组合并后,分配到处理器上执行,寻找满足总体完成时间约束的所有分配方案,从中选择一个最节能的分配方案。具体包括下列部分:
(1)生成初始执行路径
首先,计算各个任务的执行参数,例如:最优前驱任务、任务在依赖关系图中的高度。利用计算出来的执行参数,根据已有的任务复制调度算法(TDS、EAD或PEBD)生成初始执行路径(假设初始执行路径有N条)。
生成执行路径之后,计算每条路径的负载(即路径上所有任务的执行时间总和),依据负载从大到小的顺序对执行路径进行排序。假设所有执行路径中负载最大值为最大负载(Max_Load)。
根据所用系统的单个处理器内核个数(假设为K),设定最多可用处理器个数(Max_CPU)=生成初始执行路径条数/单个处理器内核个数=N/K取上整数。设置占用处理器个数初始值M=Max_CPU。
(2)给定处理器个数下,安排任务执行路径运行位置
首先将前M条路径分配到M个处理器的第一个核上,然后从第M+1条路径开始计算该路径对M个处理器的依赖度,选择依赖度最大的处理器上分配给该路径。该路径将运行在依赖度最大的处理器中的空闲时间最多的内核上。按照相同的方法,循环迭代安排第M+2至第N条路径的运行位置(即运行该路径的处理器及其内核)。当所有N条路径安排完运行位置之后,将此时处理器个数、最后一个任务完成时间和总能耗作为一种可选调度方案,添加到{处理器个数、完成时间、总能耗}列表中。
(3)减少处理器个数寻找其它可选调度方案
将处理器使用个数M减1,并按照第(2)步安排所有N条执行路径的运行位置,寻找其它可选调度方案。
(4)选择满足截止期需求的最节能的调度方案
不断执行步骤(3),直到调度方案的完成时间超过允许的总体完成时间为止。在所有的可选调度方案列表中,在允许的总体完成时间范围内,选择节约能耗最多的一组调度方案作为最终调度。
1.相关定义
1)直接任务依赖
在DAG图中,相邻两个任务节点之间如果存在直接前驱、后继关系,则这两个任务之间存在直接任务依赖,例如图1中任务1和任务2,如果两个任务之间不存在直接的前驱、后继关系,则两个任务之间不存在直接任务依赖,例如图中任务2和任务3。
2)执行路径
具有依赖关系的多个任务可以组成一条执行路径,分配到一个处理器上执行,从而避免依赖任务之间的数据传输耗时。任意一条执行路径中,任务执行顺序要求符合任务间的前驱后继关系。例如,在如图1中,任务1一定要在任务2、3、4、5之前执行。TDS、EAD或PEBD算法可以生成初始执行路径。图1所示例子中的任务集经过TDS算法生成5条任务执行路径,分别为:L1=<1,4,8,9>,L2=<1,2,7>,L3=<1,2,6>,L4=<1,5>,L5=<1,3>。
3)任务对路径的依赖度
任务对某条路径的依赖度分两种情况定义:
(a)如果任务v在任务执行路径L上,则v对L的依赖度为v的执行时间;
(b)如果任务v不在L上,而存在v的直接前驱或后继在L上,则此任务对L的依赖度等于v在L上的直接前驱对v的数据传输耗时加上v对L上的直接后继任务的数据传输耗时之和。例如,在图1中,节点3对路径L1=<1,4,8,9>的依赖度等于5(即2+3);
如果此任务v不在L上,且其直接前驱和后继都不在L上,则此任务对L的依赖度为0。任务对路径的依赖度代表如果任务v和路径L在一个处理器上执行的话,所节约的时间。
4)执行路径对执行路径的依赖度
假设存在两条任务路径A和B,路径A对路径B的依赖度为路径A上的所有任务对路径B的依赖度之和。例如,在图1中,路径L5=<1,3>对路径L1=<1,4,8,9>的依赖度等于7(即2+5)。路径之间的依赖度具有不对称性,即路径A对路径B的依赖度不一定等于路径B对路径A的依赖度。
5)执行路径对处理器依赖度
假设存在路径L和一个处理器P。如果处理器任何一个核上都没有分配任务路径,则L对P的依赖度设为无穷大,L将被分配到P的第一个核上;
若处理器上已经分配过任务,则L对P的依赖度为L对P上所有执行路径依赖度之和。
2.基于依赖度的任务分组分配策略(DG)
Step 1.利用TDS(例如图3流程图)、EAD或者PEBD算法,得到N条任务初始执行路径;
Step 2.计算每条执行路径的负载,即该条路径上所有任务的执行时间之和;根据路径负载的从大到小的顺序,对任务执行路径进行排序;
Step 3.假设系统中有M’个多核处理器,每个处理器包含K个相同的内核,而且同一处理器的各个核心可以通过共享内存相互通信,处理器内部通信时间和能耗相对于处理器之间的通信近似忽略不计;
Step 4.如果N<=K*M’,令占用的总处理器个数(上整数);否则M=M’;
Step 5.将前M条路径分配到M个处理器的第一个核上;从第M+1条路径开始计算该路径对M个处理器的依赖度,选择依赖度最大的处理器上分配给该路径。该路径将运行在依赖度最大的处理器中的空闲时间最多的内核上。然后,根据任务level属性值从大到小调整任务的执行顺序,并将存在的冗余任务删除。按照相同的方法,循环迭代安排第M+2至第N条路径的运行位置(即运行该路径的处理器及其内核)。当所有N条路径安排完运行位置之后,将此时处理器个数、最后一个任务完成时间和总能耗作为一种可选调度方案,添加到{处理器个数、完成时间、总能耗}列表中;
Step 6.将处理器使用个数M减1,并按照Step 5安排所有N条执行路径的运行位置,寻找其它可选调度方案。
Step 7.不断执行Step 6,直到调度方案的完成时间超过允许的总体完成时间为止。在所有的可选调度方案列表中,选择完成时间小于或等于总体完成时间约束的、节约能耗最多的一组调度方案作为最终调度。
3.一个由9个结点组成的任务集合调度实例
(1)生成初始执行路径
首先计算使用任务复制算法生成初始执行路径的参数,以图1所列DAG图为例,首先根据TDS调度算法计算复制参数,见表1:
任务号 |
Level |
EST |
ECT |
FP |
1 |
11 |
0 |
2 |
- |
2 |
7 |
2 |
4 |
1 |
3 |
8 |
2 |
5 |
1 |
4 |
9 |
2 |
6 |
1 |
5 |
5 |
2 |
7 |
1 |
6 |
5 |
4 |
8 |
2 |
7 |
4 |
4 |
7 |
2 |
8 |
5 |
6 |
10 |
4 |
9 |
1 |
10 |
11 |
8 |
表1生成初始序列相关参数
根据Level值从小到大生成的初始任务序列:
{9、7、8、6、5、2、3、4、1}
利用TDS算法生成初始执行路径,并排序得到结果:
L1:T1、T4、T8、T9,负载11
L2:T1、T2、T6,负载8
L3:T1、T2、T7,负载7
L4:T1、T5,负载7
L5:L1、L3,负载5
设置最大单核负载:Max_load=11
假设处理器为双核,设置最多可用处理个数:
(2)生成优化的任务执行路径
首先将负载最大的两条任务执行路径L1、L2分配到处理器P1、P2的第一个核P1_core1、P2_core1上,然后分配L3,根据依赖度的计算方式,L3对P1、P2的依赖度分别为9、6,所以将L3分配到P1_core2上,删除重复节点T1。然后分配L4,由于L4对P1、P2的依赖度都等于4,而P1没有空闲核,而P2有空闲核,所以将L4分配到P2_Core2上,删除重复节点T1。最后,分配L5,由于L5对P1和P2的依赖度分别等于7和4,所以将L3分配给P1,删除重复节点T1。调度结果如图3所示。
(3)选择合适的处理器个数
当处理器个数为1的时候,将L3分配给该处理器会造成总完成时间的推迟,所以对于此任务集,处理器个数只能选择2个。
图2表示TDS算法的调度结果,图3表示TDS_DG算法的调度结果。分析图可以发现
|
TDS |
TDS_DG |
总完成时间 |
13 |
13 |
使用处理器个数 |
3 |
2 |
处理器内核总忙碌时间 |
34 |
32 |
处理器内核总空闲时间 |
44 |
46 |
总通信耗时 |
5 |
4 |
表2 TDS与TDS_DG性能对比
TDS_DG在总执行时间不增加的情况下,处理器使用个数、处理内核总忙碌时间、总通信耗时等各项指标都要好于TDS算法,因此TDS_DG是一种高效节能的调度算法。