Dplasma调度方式——DAGUE_SCHEDULER_LFQ(Local Flat Queues)

数据结构

dague_scheduler_t sched_local_flat_queues = {
.name = “Local Flat Queues”,
.global_init = init_local_flat_queues,
.thread_init = NULL,
.schedule_task = schedule_local_queues,
.select_task = choose_job_local_queues,
.display_stats = NULL,
.finalize = finalize_local_flat_queues
};

init

为每个EU(处理器的计算核心)创建了3个队列分别为:
system_queue(VP中所有EU共用一个queue,即每个VP对应一个system_queue)
hierarch_queues(hierarch_queues[0] = task_queue)
task_queue(size 为 4*处理器的EU数,parent为system_queue

steal策略
根据HWLOC库计算EU间的距离,然后将自己的分层队列按照距离和其它EU的task_queue相连,规则如下hierarch_queues的第i层和第i近的EU的task_queue相连。

schedule

初始状态将第DAG的根节点放入到第0个EU的task_queue中
当DAG中某个节点在某个EU上执行完成后会释放其子节点,并将其子节点根据VP(处理器)放入到对应的VP的readyList中,当前VP(包含当前EU)的readyList放入当前正在执行的EU的task_queue中,其它VP的readyList放入对应的第0个EU中。如:VP0 和VP1 分别都包含EU0,EU1,当VP1的EU1执行完task_i,释放task_j,task_k时,若task_i放入VP0的readList,task_j放入VP1的readList,那么由于当前的EU为VP1的EU1,VP1的readList会加入到其
EU1(当前EU)的task_queue中,而VP0的readList则会加入到其EU0的task_queue中。

在将readList加入task_queue中,如果task_queue已满,那么放入其parent中,这里为system_queue中。

choose

从当前EU的taskqueue中安装优先级取出task来执行,如果当前taskqueue为空,那么从其hierarch_queues中取,hierarch中第0层的优先级最高,如果hierarch_queues中为空,那么就从system_queue中取。在各个queue中取task时都是按照priority来取的,而不是按照先后顺序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值