MP(有一个任务队列,队列深度为8): 多个核共享一个DMA, DMA上搬移的时间远小于核执行任务的时间。如何使用离散时间,进行核执行任务,与DMA搬移之间的流水
任务描述:
task(pre_move_time, exec_time, post_move_time, min_start_time,qos)分别表征一个任务进行数据预搬移(DMA上执行),任务执行(核上执行),任务数据后搬移(DMA上执行), 最早可以执行的时间
n个核共享一个DMA。
一个DAG有8个任务。
[t1(1,7,2,0,1), t2(2,10,1,0,1), t3(1,8,2,0,2), t4(1,7,2,4,1), t5(1,9,3,15,1), t6(1,4,1,0,2), t7(3,14,1,0,1), t8(3,7,0,100,1)]
依赖列表如下:
t1:无依赖
t2:t1
t3:t1
t4:t1
t5:t1
t6:t1
t7: t5,t6
t8: t7, t2, t3, t4
执行逻辑如下:
t1就绪 0~1时刻dma执行t1的pre_move_time
t1搬移完成,选择从n个核中选择最早可用的核。t1选择核0,在1~8执行t1
8~10 dma执行t1.post_move_time,在时刻点10,t1后搬移完成,依赖t1的任务(t2,t3,t4,t5,t6)都就绪了,当前时刻来到了10,由于t5.min_start_time = 15 > 10,故t5不能被执行,其他任务的min_start_time < 当前时刻,可以被执行。
那么(t2,t3,t4,t6) 需要在2个核上进行并发流水。由于t3,t6的优先级为2,高于t2,t4的优先级0,故t3,t6先进行调度,进入DMA的搬移任务队列。
那么DMA在时刻点10~11 执行t3.pre_move_time, 在时刻点11~12执行t6.pre_move_time。
t3选择最早可用的核,选择核1,那么核1在11~19执行t3。
t6选择最早可用的核,选择核0,那么核1在12~16执行t6。
DMA在19~21执行t3.post_move_time,在21~22执行t6.post_move_time。 t8依赖减去t3,t7依赖减去t6
t2和t4优先级一样,就绪时间也一样,谁前谁后都可以。DMA现在 22~24执行t2.pre_move_time,在24~25执行t4.pre_move_time
t2选择最早空闲核1,核1在时刻24~34执行t2。
t4选择核0,在时刻25~32执行t4,由于t4早于t2执行完成,故t4的后搬移早于t2,在时刻32~34执行t4.post_move_time,然后在时刻34 t8依赖减去t4
然后在时刻34~35执行t2的后搬移。然后在时刻35 t8依赖减去t4.
此时时刻到了35,大于了t5的最早执行时刻,t5就绪了,在时刻35~36执行t5.pre_dma_time
t5选择核0执行任务,在时刻36~45执行t5,在时刻45~48执行t5.post_dma_time,t7依赖减去t5,t7依赖满足,t7在48就绪。
dma在时刻48~51执行t7.pre_dma_time,选择核1执行t7,在核1上,时刻点51~65执行t7,dma在时刻65~66执行t7.post_dma_time. 在时刻点66,t8依赖减去t7. t8依赖满足,但是由于t8的最早就绪时刻为100.
故在时刻100~103执行t8.pre_dma_time,t8选择核0执行,在时刻点103~110执行t8. t8无后搬移,整个dag执行完成。
如何用Python模拟以上调度,给出完整代码