DMA Collections

本文概述了直接内存访问(DMA)的不同操作模式及其对系统性能的影响。通过介绍几种常见的DMA工作方式,如单字传送、块传送等,并探讨了它们在实际应用中的效率表现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

调度对象:DAG(NetWorkx)管理的任务,每个Node代表一个任务,每个Node有如下的属性: pre_dma_time: dma前搬移的时间 vproc # 任务执行时间 pl_mem: #PL2内存 post_dma_time: dma后搬移的时间 minStartTime # 任务最早就绪时间,不能早于这个时间点执行 maxEndTime # 任务最晚结束时间,确保任务不能晚于此时刻点完成执行, dagStartTime #所属子图处理任务的时间,只用于计算子图时延 mem_apply_list # 申请SL2内存的列表,列表的元素为申请内存的大小,在任务开始执行申请所有内存 mem_release_list # 释放SL2内存的列表,列表的元素为释放内存的大小,在任务开始执行释放所有内存 任务的增量内存为:sum(mem_apply_list) - sum(mem_release_list) core_type # 任务执行的核类型,只能在对应的核类型上执行。 DagId: 节点所归属子图Id 计算单元: 4个核组成一个MP4, MP4内有loc_mem大小的loc内存,HCuNum个高优先级Cu,LCuNum个低优先级Cu, 高优先级Cu上的任务在可以抢占低优先级Cu上的任务 有一个Dma,对进入MP4上的任务进行数据前搬移,后搬移。核上在执行任务的时候,DMA进行其他任务的前后搬移。 调度器: 有按照按照Qos管理的就绪任务队列,按照Qos从高到低对就绪队列里面的任务进行调度,每个Qos对应一个队列 管理的MP4 调度步骤: 对于所有的就绪的任务:按照Qos进入对应Qos的队列 从Qos高到底,对就绪队列里的任务进行调度 轮训所有MP4,按照任务的Qos大于QosThrd与否,决定申请申请高优先级还是低优先级平面的CU,寻找对应优先级平面CU最多的MP4,对应MP4上的对应优先级平面的cu数减1,并且在对应MP4上申请PL2内存,对应MP4上的PL2内存余量减去node的pl_mem。 申请到PL2的任务进入对应的MP4里面的DMA搬移队列,先入先出。DMA每次只执行一个任务的前搬移或者后搬移(搬移时长为pre_dma_time,或post_dma_time),搬移完成后,将任务退出DMA的队列,进入任务的下一级处理状态。不同任务的前搬移,执行,后搬移三个阶段是可以同时进行的。 若是任务的前搬移完成,则寻找对应MP内一个空闲时间最早的核进行任务执行, 若是高优先级任务,在核上选择一个可以被抢占的低优先级任务进行抢占,高优先级任务完成后,被抢占的任务继续恢复执行。若是低优先级任务,则等待空闲核。 若是任务后搬移完成后,释放PL2内存,更新后级任务依赖关系。 前搬移完成后,进行任务执行状态:则寻找对应MP内一个空闲时间最早的核进行任务执行, 若是高优先级任务,在核上选择一个可以被抢占的低优先级任务进行抢占,高优先级任务完成后,被抢占的任务继续恢复执行。若是低优先级任务,则等待空闲核。 依赖关系就绪和满足就绪时间的任务按照Qos进入任务就绪队列。 记录任务被调度的几个关键节点(任务Id,任务执行的核Id,任务就绪时间,DMA前搬移完成时间,任务执行完成时间,DMA后搬移完成时间) 时间推进方面,可能需要离散事件模拟,记录当前时间,处理事件(任务开始、结束,DMA搬运完成等) 按照以上描述,用Python实现上述任务调度。给出完整的代码
04-04
MP(有一个任务队列,队列深度为8): 多个核共享一个DMADMA上搬移的时间远小于核执行任务的时间。如何使用离散时间,进行核执行任务,与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模拟以上调度,给出完整代码
04-09
有一个调度模拟程序 DAG(NetWorkx):Task节点 pre_dma_time: dma前搬移的时间 vproc # 任务执行时间 pl_mem: #需要的PL2内存 post_dma_time: dma后搬移的时间 minStartTime # 任务最早就绪时间,不能早于这个时间点执行 maxEndTime # 任务最晚结束时间,确保任务不能晚于此时刻点完成执行, dagStartTime #所属子图处理任务的时间,只用于计算子图时延 mem_apply_list # 申请SL2内存的列表,列表的元素为申请内存的大小,在任务开始执行申请所有内存 mem_release_list # 释放SL2内存的列表,列表的元素为释放内存的大小,在任务开始执行释放所有内存 任务的增量内存为:sum(mem_apply_list) - sum(mem_release_list) core_type # 任务执行的核类型,只能在对应的核类型上执行。 DagId: 节点所归属子图Id 一个运行环境有DSP, CE, BAU等异构核,对应核数和核类型列表core_num_list = [30, 4, 10], core_type_list = [‘DSP’, ‘CE’, ‘BAU’] 以4个核组成一个MP, 不足MP的按照实际个数组织成MP,一个MP内有高优先级CU(HCU),个数HCuCnt,有低优先级CU(LCU),个数LCuCnt。有PLSize的loc内存。MP内共享一个DMADMA执行任务的数据搬移,前搬移或者后搬移 调度器管理上述的MP(本质上为核),和其他类型的核。 每个Qos一个就绪队列。当前Qos最大16. 任务运行状态为:就绪,被调度器选中,调度器选择MP,MP内的DMA执行任务的前搬移,前搬移完成后选择MP内最早空闲的核进行任务执行,任务执行完成后,DMA进行后任务后搬移,完成后释放资源。更新任务的依赖关系。 1:任务就绪:任务的依赖关系满足,且当前时间大于等于任务的minStartTime,任务按照对应的Qos进入就绪队列。 2:调度器调度任务:根据Qos从大到小,按照先入先出的规则挑选任务 3:调度器选择MP:根据任务的Qos和QosThrd,Qos大于QosThrd则,调度到高优先级CU,否则调度到低优先级CU,选择对应优先级平面剩余CU数最多的MP(根据核类型选择),申请对应优先级CU, 对应优先级CU数-1,申请PL2内存,(mp的PL2size减少任务消耗的pl_mem), 之后进入MP的DMA搬移任务队列中。 4:DMA执行搬移队列中的搬移任务,若是前搬移完成,则任务选择MP内最早空闲的核进行执行,若是后半已完成,则释放CU,CU数+1,释放任务占据的PL2。DMA进行任务的数据搬移和核上执行任务为流水关系,比如 核正在执行task1的任务,DMA可能在执行task0的后搬移,之后继续进行task2的前搬移。 DMA搬移的时间相对于任务的执行时间比较短,一般情况下task2的前搬移执行完成后,核在执行task0,需要等到有空闲核(task0执行完成),task2才有机会在核上执行,所以DMA和核是同时在执行不同任务的不同阶段。需要分别维护时间。 5:任务执行:前搬移完成后,挑选MP内最早空闲的核,完成后任务进入DMA的任务搬移队列。 6:DMA进行任务的后搬移后,释放CU资源(mp的对应优先级CU加1),释放PL2资源(mp的PL2size增加任务消耗的pl_mem),更新本任务的后级任务的依赖关系。同时触发调度器调度就绪的任务。 初始时刻,根据就绪任务的数目和可用资源的数目,选择合适的MP进行初始就绪任务的调度。没有被调度到的初始时刻的任务,在有调度资源后,再参与下一轮调度 记录任务被调度的几个关键节点(任务Id,任务执行的核Id,任务就绪时间,DMA前搬移完成时间,任务执行完成时间,DMA后搬移完成时间) 输入:Dag。core_num_list([3,4,6]表示每类处理器的个数),core_type_list[0,1,2]. 用Python实现,给出完整可运行的代码。 之前给出的回答,没有将无依赖的任务纳入调度的事件队列,导致程序无法运行。请加强修改,并且给出新的调度完整代码
04-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值