信息,再 执行步骤6 ;否则,重复执行步骤5,等待存储空间的状态变为"非空"状态;如图4所示,就 绪查询单元最开始会读取年龄表地址为0的地址,年龄表输出存储空间编号为5,根据tXL 计算出存储空间的读起始地址为50,即可在10个时钟周期内读出存储空间中地址为50~ 59的任务指令字,即为该步骤中的第f?个任务指令。同理,就绪查询单元下一次会读取年龄 表地址为1的地址,年龄表输出存储空间编号为3,根据tXL计算出存储空间的读起始地址 为30,S卩可读出存储空间中地址为30~39的任务指令字,S卩为第f+1个任务指令,以此类 推。
[0069] 这里需要说明的是,图4中的年龄表中地址为0~28的地址中存储有存储空间的 编号,这些编号是按照任务指令进入保留站的顺序写入年龄表的,此时存储空间中最先进 来的任务指令存储在50~59的地址空间中,第二个任务指令存储在30~39的地址空间 中,第三个任务指令存储在290~299的地址空间中……以此类推。那么按照年龄表的地 址从小到大的顺序读取年龄表,就可以按任务指令进入保留站的顺序读取任务指令,从而 实现"old-first"原则。
[0070] 步骤6、选择唤醒单元根据第f个任务指令的第cnt+1个输入寄存器编号查询寄存 器状态表,并接收寄存器状态表反馈的状态信息后,执行步骤7 ;
[0071] 步骤7、选择唤醒单元根据寄存器状态表反馈的状态信息,判断输入寄存器是否已 就绪,若已就绪,则将cnt+1赋值给cnt,再执行步骤8 ;否则,将m+1的值赋给m,将cnt置为 0,再返回步骤5执行;本实例中,为了避免重复查询输入寄存器的状态,减少访问外部寄存 器状态表,当选择唤醒单元判断输入寄存器为未就绪时,则将cnt的值寄存起来,记作cnt_ reg;下次再次查询该任务指令时,将该任务指令的cnt_reg赋值给cnt后继续查询,这样就 可以避免再次查询之前已查询且判断为已就绪的输入寄存器的状态。这需要额外增加32 个寄存器cnt_reg用于记录每个任务指令上一次查询的位置。相应的在该步骤中,将cnt寄 存到cnt_reg后,不再是将cnt置为0,而是返回到步骤5将下一个任务指令的cnt_reg赋 值给cnt,再继续查询下一个任务指令的输入寄存器状态。这里为了简化描述,采用将cnt 置为〇的方法。
[0072] 步骤8、选择唤醒单元将就绪计数器cnt和第f个任务指令的输入寄存器个数num 进行比较,若满足cnt<num,则返回到步骤6执行;否则,执行步骤9 ;当满足cnt<num, 表示此时还有输入寄存器的状态没有查询,则返回到步骤6继续查询剩余输入寄存器的状 态;否则,表示所有的输入寄存器已经全部查询完并且所有的输入寄存器已经就绪,则执行 步骤9查询计算资源是否就绪。
[0073] 步骤9、选择唤醒单元根据第f?个任务指令的所需计算资源信息,向计算资源管理 单元发送查询命令后;执行步骤10 ;
[0074] 步骤10、分配单元接收到选择唤醒单元发送的查询命令,扫描计算资源表,判断是 否满足第f?个任务指令的所需计算资源信息,若满足,则将计算资源管理单元中状态为"空 闲"的计算资源分配给选择唤醒单元,并向选择唤醒单元反馈状态信息为所分配的"空闲" 的计算资源编号,同时在计算资源表中将所分配的"空闲"计算资源的状态置为"占用";若 不满足,则向选择唤醒单元反馈状态信息为所需计算资源不足;并执行步骤11 ;如图6所示 为本实例中计算单元管理单元结构示意图。图中将所分配的计算资源种类和相应计算资源 编号通过打包模块产生一个计算资源分配信息发送到选择唤醒单元,这也就是当满足第f 个任务指令的所需计算资源信息时向选择唤醒单元反馈的状态信息。
[0075] 步骤11、选择唤醒单元根据计算资源管理单元反馈的状态信息,判断所需计算资 源是否已就绪,若已就绪,此时,任务指令发射的两个条件都已经准备好:输入寄存器已就 绪和计算资源已就绪。则将已就绪的第f个任务指令发射到外部的处理单元阵列中进行执 行,也就是发送到处理单元阵列中由分配单元所分配的所需计算资源中执行。并将保留站 状态表中第t+1个地址的状态位设为"空闲";将年龄表的第m+1个地址的输出t置为"无 效";从而使得存储空间的第t+1个地址和年龄表的第m+1个地址中均产生了"气泡",并同 时执行步骤12和步骤13 ;否则,将m+1的值赋给m,将cnt置为0,并返回步骤5执行;本实 例中,若所需计算资源未就绪,和步骤7类似,将cnt寄存到Cnt_reg后,不再是将cnt置为 0,而是返回到步骤5将下一个任务指令的cnt_reg赋值给cnt,再继续查询下一个任务指令 的输入寄存器状态。
[0076] 步骤12、将年龄表中第m+2个地址信息到第N个地址信息依次赋值给第m+1个地 址信息到第N-1个地址信息,并将k-1赋值给k;该步骤是用来压缩年龄表中的"气泡",也 就是压缩了存储空间中的"气泡",压缩过程如图5。判断k= 0是否成立,若成立,则将存 储空间的状态改为"空"状态;否则,维持在"非空"状态;若k= 0,则表明压缩"气泡"后年 龄表的分配指针指向年龄表的第一个地址空间,此时存储空间的状态为"空"状态;也说明 在压缩"气泡"前年龄表的分配指针指向年龄表的第二个地址空间,此时存储空间的状态为 "非空"状态;因此需要将存储空间的状态从"非空"状态改为"空"状态。否则,维持存储空 间的状态为"非空"状态。
[0077] 判断k=N-1是否成立,若成立,则将存储空间的状态改为"非满"状态;否则,维 持在"非满"状态;将cnt置为0后,再返回步骤5执行;若k=N-1,则表明压缩"气泡"后 年龄表的分配指针指向年龄表的最后一个地址空间,此时存储空间的状态为"非满"状态; 也说明在压缩"气泡"前年龄表的分配指针指向年龄表最后一个地址空间的下一个地址空 间,此时存储空间的状态为"满"状态;因此需要将存储空间的状态从"满"状态改为"非满" 状态。否则,维持存储空间的状态为"非满"状态。本实例中,压缩完"气泡"后,和步骤7类 似,不再是将cnt置为0,而是返回到步骤5将下一个任务指令的cnt_reg赋值给cnt,再继 续查询下一个任务指令的输入寄存器状态。这里因为任务已发射,不再需要将cnt寄存到 cnt_reg中。
[0078] 步骤13、回收单元若接收到处理单元阵列反馈的完成计算任务信息,则对完成计 算任务信息进行解析,获得已完成计算任务指令的计算资源种类和计算资源编号,并将已 完成计算任务指令的计算资源种类和计算资源编号所对应的计算资源在计算资源表中的 计算资源状态改为"空闲",再重复执行步骤13。如图6所示计算单元管理单元结构示意图 中的分配单元。
[0079] 综上,步骤1为初始化过程;步骤2~步骤4为任务指令写入保留站的过程;步 骤5~步骤12为任务指令的选择唤醒过程和计算资源的分配过程;步骤13为计算资 源的回收过程。该调度方法借鉴了二级指针的概念,高效实现了任务指令调度过程中的 "old-first"原则。
[0080] 其中,计算资源管理单元采用主动分配资源的方式则将状态为"空闲"的计算资源 分配给选择唤醒单元;主动分配资源的方式为:
[0081] 步骤1、利用若干个FIFO单元组成计算资源表,假设计算资源的种类为A种;且每 种计算资源的个数为B个;且将每种计算资源的个数B分为C组,从而形成AXC个FIFO单 元所组成的二维矩阵;且每列FIFO单元对应于一个基编号,分别为
;如图6 所示为计算资源管理单元结构示意图,包括分配单元、计算资源表和回收单元。中间的二维 矩阵即为计算资源表。本实例中,令A= 4、B= 32、C= 4,即共有4种计算资源,每种计算 资源有32个,每种计算资源分为4组,则每组包含8个同种计算资源。由计算资源种类编 码和分组编码形成一个4X4的二维矩阵,将计算资源种类编码作为二维矩阵的行y,将分 组编码作为二维矩阵的列x。二维矩阵的每个元素同时又是一个长度为8的向量,表示每组 计算资源编号的偏移量,该向量存储在FIFO中,每次每个FIFO提供一个偏移量记为z。因 此每个偏移量都对应一个唯一的坐标(y,x,z),其中0<y<3,0<x<3,0<z<7。。
[0082] 步骤2、对二维矩阵进行初始化,将偏移量
分别写入二维矩阵的每个 FIFO单元中,用于表示"空闲"状态的计算资源;在本实例中,偏移量为0~7,即在初始化 阶段,将〇~7依次写入每个FIFO中。
[0083] 步骤3、每个FIFO单元读取自身的一个偏移量,并等待计算资源表满足第f个任 务指令的所需计算资源信息;该步骤是FIFO主动提供一个偏移量,等待分配单元获取;当 该偏移量被分配单元获取后,该FIFO立即自动读取自身的一个偏移量,再次等待分配单元 获取。因为读FIFO的过程通常需要消耗2~3个时钟周期,为了避免每次获取计算资源都 要等待2~3个时钟周期,所以采取了将FIFO分组的形式和主动提供的方式,这样在性能 上有优势。另外,分组或者不分组所需要的FIFO的存储深度是相同的,但是所需要的FIFO 的存储位宽不一样;若不分组,则需要存储的是计算资源的编号,否则需要存储的是计算资 源编号的偏移量,在本实例中,每种计算资源的个数是32,计算资源编号为0~31,偏移量 为0~7 ;因此若不分组则需要FIFO的存储位宽是5位,否则需要FIFO的存储位宽是3位。 因此采用分组的方式总共可以节省的FIFO存储空间是4X32X2 = 256位。
[0084] 步骤4、在计算资源表满足第f个任务指令的所需计算资源信息时,每个FIFO单元 将所读取的偏移量和自身所对应的基编号进行组合后形成计算资源编号;如图6所示,本 实例中的分配单元包括行解码模块、列解码模块和打包模块。计算资源表将坐标(y,x,z) 发送到分配单元的行解码模块和列解码模块中,计算出基编号为xX8,偏移量为z,从而获 得计算资源的编号g为:xX8+z,计