数据结构
dague_scheduler_t sched_local_hier_queues = {
.name = “Local Hierarchical Queues”,
.global_init = init_local_hier_queues,
.thread_init = NULL,
.schedule_task = schedule_local_queues,
.select_task = choose_job_local_queues,
.display_stats = NULL,
.finalize = finalize_local_hier_queues
}
init
为每个EU(处理器的计算核心)创建了3个队列分别为:
system_queue (VP中所有EU共用一个queue,即每个VP对应一个system_queue)
hierarch_queues(分层的层数为VP的EU个数,每一层的size为queue_size = 96 * (level+1) / nbcores(
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来取的,而不是按照先后顺序。