[发明专利]一种基于任务窃取的任务调度方法及系统有效
申请号: | 201710290460.6 | 申请日: | 2017-04-28 |
公开(公告)号: | CN107220111B | 公开(公告)日: | 2019-08-09 |
发明(设计)人: | 金海;李陈希;廖小飞;石翔 | 申请(专利权)人: | 华中科技大学 |
主分类号: | G06F9/48 | 分类号: | G06F9/48;G06F9/50 |
代理公司: | 华中科技大学专利中心 42201 | 代理人: | 李智;曹葆青 |
地址: | 430074 湖北*** | 国省代码: | 湖北;42 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 一种 基于 任务 窃取 调度 方法 系统 | ||
1.一种基于任务窃取的任务调度方法,其特征在于,包括:
(1)将整体计算任务描述为由子任务节点与子任务节点间依赖边组成的任务依赖图,将依赖节点作为回调函数注册至被依赖节点的回调容器中;
(2)获取所述任务依赖图中的根节点与叶子节点,为所有叶子节点添加一个虚拟依赖汇节点,所述虚拟依赖汇节点用于阻塞主线程;
(3)为线程池中各线程分配一个无锁双端队列并置空,将所有根节点按照轮询方式放入各线程的无锁双端队列底部;
(4)对于每个线程,若线程的无锁双端队列不为空,则从线程的无锁双端队列底部取出节点并执行节点中包含的任务,在任务执行结束后,执行节点中回调容器中的所有回调;若线程的无锁双端队列为空,则该线程尝试从其他线程的无锁双端队列顶部窃取节点,若窃取成功则将窃取的节点压入该线程的无锁双端队列底部,执行窃取节点中的任务以及窃取节点中回调容器中的所有回调;
(5)在任务依赖图中所有节点中的任务均执行完成后,将任务依赖图中的各节点的入度恢复到原始值,并结束对主线程的阻塞。
2.根据权利要求1所述的方法,其特征在于,步骤(1)具体包括以下步骤:
(1.1)定义任务依赖图对象;
(1.2)依据计算任务的属性将该计算任务划分成若干子任务,调用任务依赖图对象所提供的插入方法将各子任务添加进任务依赖图中并将各子任务封装为节点对象,返回各节点对象的指针;
(1.3)通过各节点对象的指针构造各子任务间的依赖关系,将依赖节点视作回调函数注册至被依赖节点的回调容器中,将依赖节点的入度加1,将被依赖节点的出度加1。
3.根据权利要求2所述的方法,其特征在于,步骤(2)具体包括以下步骤:
(2.1)将任务依赖图中所有入度为0的节点加入根节点集合,将所有出度为0的节点加入叶子节点集合;
(2.2)对于叶子节点集合L={L1,L2,…},添加虚拟依赖汇节点virtual_sink_node,并调用virtual_sink_node->depends(L1,L2,…),所述虚拟依赖汇节点用于阻塞主线程直到所有任务完成,防止主线程提前结束。
4.根据权利要求2所述的方法,其特征在于,步骤(4)具体包括以下步骤:
(4.1)对于每个线程,若线程的无锁双端队列不为空,则从线程的无锁双端队列底部取出节点并执行节点中包含的任务,在任务执行结束后,执行节点中回调容器中的所有回调,每执行一次回调,相对应的注册回调的节点的入度减1,若某一注册回调的节点的入度被减至0,则当前线程将该注册回调的节点压入当前线程的无锁双端队列底部;
(4.2)若线程的无锁双端队列为空,则该线程尝试从其他线程的无锁双端队列顶部窃取节点,若窃取成功则将窃取的节点压入该线程无锁双端队列底部,并执行步骤(4.1),否则放弃本轮CPU时间片;
(4.3)重复执行步骤(4.1)~(4.2)直至任务依赖图中所有节点中的任务均执行完成。
5.根据权利要求1至4任意一项所述的方法,其特征在于,所述线程池中的线程数目与CPU硬件核心的数目一致。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于华中科技大学,未经华中科技大学许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/201710290460.6/1.html,转载请声明来源钻瓜专利网。
- 上一篇:塔式炉后煤仓布置结构
- 下一篇:临河可折叠停车场