发明名称 一种动态均衡异构计算系统负载的方法
摘要 本发明公布了一种动态均衡异构计算系统负载的方法,目的是解决异构计算系统静态负载平衡方法灵活性差、效率低的问题。技术方案是先进行系统初始化及信息配置;然后为主处理器和加速器各创建一个计算负载队列,并将计算负载队列初始化;接着构建主处理器和加速器状态图,依据主处理器和加速器状态转换图,搜索处理器可工作集,依据异构计算系统实时运行情况,在各处理器间动态均衡调度负载,最后进行负载更新。采用本发明能增强异构系统计算负载均衡的灵活性,提升异构计算系统资源利用率。
申请公布号 CN104298564A 申请公布日期 2015.01.21
申请号 CN201410544782.5 申请日期 2014.10.15
申请人 中国人民解放军国防科学技术大学 发明人 甘新标;刘杰;迟利华;晏益慧;徐涵;胡庆丰;蒋杰;李胜国;苏博;周怀哲;王庆林;皇甫永硕;崔显涛;周陈
分类号 G06F9/50(2006.01)I 主分类号 G06F9/50(2006.01)I
代理机构 国防科技大学专利服务中心 43202 代理人 郭敏
主权项 一种动态均衡异构计算系统负载的方法,其特征在于包括以下步骤:第一步、系统初始化及信息配置,具体步骤如下:1.1采用异构计算系统基础软件工具集提供的初始化函数完成异构计算系统初始化;1.2获取主处理器和加速器的配置信息,即,异构系统中主处理器的个数p、每个主处理器拥有的浮点乘累加功能部件的数目m及主频f,加速器的个数p'、每个加速器拥有的浮点乘累加功能部件的数目m'及主频f';1.3定义主处理器集合P={p<sub>0</sub>,p<sub>1</sub>,…p<sub>i</sub>,…,p<sub>m</sub>},其中p<sub>i</sub>(0≤i≤m)表示编号为i的主处理器;1.4定义加速器集合P'={p'<sub>0</sub>,p'<sub>1</sub>,…p'<sub>i'</sub>,…,p'<sub>n</sub>},其中p'<sub>i'</sub>(0≤i'≤n)表示编号为i'的加速器;1.5计算主处理器的理论计算峰值R<sub>peak</sub>=p*m*f;1.6计算加速器的理论计算峰值R'<sub>peak</sub>=p'*m'*f';1.7确定负载划分因子η=R'<sub>peak</sub>/R<sub>peak</sub>;第二步、为主处理器和加速器各创建一个计算负载队列,计算负载队列包含头指针和由计算负载编号Tid及Next指针组成的结构体,具体方法如下:2.1定义负载结构体Task,其中包含负载编号Tid和指向下一个结构体的指针Next两个域;2.2创建主处理器负载队列H_Queue;2.3定义指向主处理器负载队列第一个负载的结构体头指针H_Head;2.4初始化H_Head为空(NULL),负载编号Tid_H=0;2.5创建加速器负载队列A_Queue;2.6定义指向加速器负载队列第一个负载的结构体头指针A_Head;2.7初始化A_Head为空,负载编号Tid_A=0;第三步、计算负载队列初始化,具体步骤如下:3.1依据应用程序特征将负载集合T划分为T<sub>1</sub>和T<sub>2</sub>两个负载子集合,并且满足如下规则:<maths num="0001" id="cmaths0001"><math><![CDATA[<mrow><mfenced open='{' close=''><mtable><mtr><mtd><msub><mi>T</mi><mn>1</mn></msub><mo>&cup;</mo><msub><mi>T</mi><mn>2</mn></msub><mo>=</mo><mi>T</mi></mtd></mtr><mtr><mtd><mi>&eta;</mi><mo>=</mo><mi>compt</mi><mrow><mo>(</mo><msub><mi>T</mi><mn>1</mn></msub><mo>)</mo></mrow><mo>/</mo><mi>compt</mi><mrow><mo>(</mo><msub><mi>T</mi><mn>2</mn></msub><mo>)</mo></mrow></mtd></mtr></mtable></mfenced><mo>-</mo><mo>-</mo><mo>-</mo><mrow><mo>(</mo><mn>1</mn><mo>)</mo></mrow></mrow>]]></math><img file="FDA0000586868900000021.GIF" wi="1238" he="239" /></maths>其中,compt(T<sub>i1</sub>)为负载T<sub>i1</sub>的计算量,i1=1,2;3.2将T<sub>1</sub>插入队列A_Queue的头部,负载编号Tid_A=Tid_A+1;3.3定义加速器负载队列当前指针A_Cur,A_Cur=A_Head,加速器队列当前指针指向加速器队列头指针;3.4将T<sub>2</sub>插入队列H_Queue的头部,负载编号Tid_H=Tid_H+1;3.5定义主处理器计算负载队列当前指针H_Cur,H_Cur=H_Head,主处理器计算负载队列当前指针指向主处理器队列头指针;第四步、构建主处理器和加速器状态图,定义主处理器和加速器有三种状态:忙即busy、闲即idle、异常即down,其中busy表示主处理器或加速器处于正常工作状态,idle表示主处理器或加速器正常等待工作状态,down表示主处理器或加速器异常不能正常工作;具体方法如下:4.1定义主处理器和加速器状态集合<img file="FDA0000586868900000023.GIF" wi="191" he="57" />4.2依据异构系统特征和应用程序特征决定负载运行阀值ΔΓ,阀值应大于应用程序计算量与异构系统计算峰值的比值;4.3任取主处理器p<sub>i</sub>∈P并且<img file="FDA0000586868900000024.GIF" wi="185" he="67" />4.4若主处理器p<sub>i</sub>已上电并且p<sub>i</sub>无负载正在运行,转换p<sub>i</sub>状态为idle,若p<sub>i</sub>已上电并且p<sub>i</sub>上有负载正在运行,转换p<sub>i</sub>状态为busy,若p<sub>i</sub>无法加电或是无法加载负载或是负载连续运行时间超过阀值ΔΓ,转换p<sub>i</sub>状态为down;4.5Ps=Ps+{p<sub>i</sub>},表示将元素p<sub>i</sub>加入到集合Ps;4.6P=P‑{p<sub>i</sub>},表示将元素p<sub>i</sub>从集合P中删除;4.7若集合P不为空,即<img file="FDA0000586868900000022.GIF" wi="168" he="61" />转4.3,否则,转4.8;4.8任取加速器p'<sub>i'</sub>∈P'并且<img file="FDA0000586868900000025.GIF" wi="211" he="77" />4.9若加速器p'<sub>i'</sub>已加电并且p'<sub>i'</sub>无负载正在运行,转换p'<sub>i'</sub>状态为idle,若p'<sub>i'</sub>已加电并且p'<sub>i'</sub>上有负载正在运行,转换p'<sub>i'</sub>状态为busy,若p'<sub>i'</sub>无法加电或是无法加载负载或是负载连续运行时间超过阀值ΔΓ,转换p'<sub>i'</sub>状态为down;4.10Ps=Ps+{p'<sub>i'</sub>},表示将元素p'<sub>i'</sub>加入到集合Ps;4.11Ps=Ps‑{p'<sub>i'</sub>},表示将元素p'<sub>i'</sub>从集合Ps中删除;4.12若集合P'不为空,即<img file="FDA0000586868900000031.GIF" wi="182" he="66" />转4.8,否则,转第五步;第五步、依据主处理器和加速器状态转换图,搜索处理器可工作集,具体方法如下:5.1定义处理器可工作集<img file="FDA0000586868900000032.GIF" wi="310" he="62" />5.2任取处理器p<sub>s</sub>∈Ps;5.3若p<sub>s</sub>的状态为idle;转5.4,否则,转5.5;5.4将该处理器加入处理器可工作集合Pwable,即Pwable=Pwable+{p<sub>s</sub>};5.5Ps=Ps‑{p<sub>s</sub>};5.6若<img file="FDA0000586868900000033.GIF" wi="176" he="50" />转5.2;否则,转5.7;5.7若Pwable不为空,即<img file="FDA0000586868900000034.GIF" wi="282" he="59" />转5.8,否则,转第八步;5.8定义主处理器可工作状态集合<img file="FDA0000586868900000035.GIF" wi="187" he="52" />5.9定义加速器可工作状态集合<img file="FDA0000586868900000036.GIF" wi="213" he="62" />5.10任取处理器p<sub>wable</sub>∈Pwable;5.11若p<sub>wable</sub>∈P,将p<sub>wable</sub>加入集合Pw,Pw=Pw+{p<sub>wable</sub>},否则,将p<sub>wable</sub>加入集合P'w,P'w=P'w+{p<sub>wable</sub>};5.12Pwable=Pwable‑{p<sub>wable</sub>},表示将处理器p<sub>wable</sub>从集合Pwable中删除;5.13若Pwable不为空,即<img file="FDA0000586868900000037.GIF" wi="281" he="56" />转5.10,否则,转第六步;第六步、依据异构计算系统实时运行情况,在各处理器间动态均衡调度负载,具体方法如下:6.1若加速器可工作集不为空,即,<img file="FDA0000586868900000038.GIF" wi="215" he="59" />转6.2,否则,转6.12;6.2若A_cur≠NULL,转6.3,处理加速器队列A_Queue,否则,转6.7,处理主处理器队列H_Queue;6.3将加速器队列当前负载,即加速器队列当前指针A_cur指向的负载分派给加速器p'<sub>i'</sub>(p'<sub>i'</sub>∈P'w);6.4加速器队列当前指针向后移动指向下一个负载,即,A_Cur=A_Cur‑>Next;6.5P'w=P'w‑{p'<sub>i'</sub>},表示将加速器p'<sub>i'</sub>从集合P'w中删除;6.6若A_cur≠NULL,转6.1,否则,转6.7,处理主处理器队列H_Queue;6.7若H_cur≠NULL,转6.8,否则,转第七步,负载更新;6.8将主处理器队列当前负载,即主处理器队列当前指针H_cur指向的负载分派给加速器p'<sub>i'</sub>(p'<sub>i'</sub>∈P'w);6.9H_Cur=H_Cur‑>Next,主处理器队列当前指针后移指向下一个负载;6.10P'w=P'w‑{p'<sub>i'</sub>};6.11若H_cur≠NULL,转6.1,否则,转第七步进行负载更新;6.12若主处理器可工作集不为空,<img file="FDA0000586868900000042.GIF" wi="204" he="64" />转6.13,否则,转第四步,搜索处理器可工作集;6.13若H_cur≠NULL,转6.14,处理主处理器队列H_Queue,否则,转6.18处理加速器队列A_Queue;6.14将主处理器队列当前负载,即主处理器队列当前指针H_cur指向的负载分派给主处理器p<sub>i</sub>(p<sub>i</sub>∈Pw);6.15H_Cur=H_Cur‑>Next,加速器队列当前指针后移指向下一个负载;6.16Pw=Pw‑{pi};6.17若H_cur≠NULL,转6.12,否则,转6.18,处理加速器队列A_Queue;6.18将加速器队列当前负载,即加速器队列当前指针A_cur指向的负载分派给主处理器p<sub>i</sub>(p<sub>i</sub>∈Pw);6.19A_Cur=A_Cur‑>Next;6.20Pw=Pw‑{p<sub>i</sub>};6.21若A_cur≠NULL,转6.12,否则,转第七步;第七步、负载更新:7.1依据应用程序特征将待加入的负载集合T'划分为T'<sub>1</sub>和T'<sub>2</sub>两个计算负载子集合,并且满足如下规则:<maths num="0002" id="cmaths0002"><math><![CDATA[<mrow><mfenced open='{' close=''><mtable><mtr><mtd><msub><msup><mi>T</mi><mo>&prime;</mo></msup><mn>1</mn></msub><mo>&cup;</mo><msub><msup><mi>T</mi><mo>&prime;</mo></msup><mn>2</mn></msub><mo>=</mo><msup><mi>T</mi><mo>&prime;</mo></msup></mtd></mtr><mtr><mtd><mi>&eta;</mi><mo>=</mo><mi>comp</mi><mrow><mo>(</mo><msub><msup><mi>T</mi><mo>&prime;</mo></msup><mn>1</mn></msub><mo>)</mo></mrow><mo>/</mo><mi>comp</mi><mrow><mo>(</mo><msub><msup><mi>T</mi><mo>&prime;</mo></msup><mn>2</mn></msub><mo>)</mo></mrow></mtd></mtr></mtable></mfenced><mo>-</mo><mo>-</mo><mo>-</mo><mrow><mo>(</mo><mn>2</mn><mo>)</mo></mrow></mrow>]]></math><img file="FDA0000586868900000041.GIF" wi="1252" he="238" /></maths>其中,compt(T'<sub>t</sub>)为计算负载T'<sub>t</sub>的计算量,{t=1,2};7.2将T'<sub>1</sub>插入队列A_Queue的头部,负载编号Tid_A=Tid_A+1;7.3A_Cur=A_Head,加速器队列当前指针指向加速器队列头指针;7.4将T'<sub>2</sub>插入队列H_Queue的头部,负载编号Tid_H=Tid_H+1;7.5H_Cur=H_Head,主处理器计算负载队列当前指针指向主处理器队列头指针;7.6若H_Cur=NULL并且A_Cur=NULL,转第八步,否则,转第四步;第八步、结束。
地址 410073 湖南省长沙市开福区德雅路109号