一种基于依赖网格的指令级并行调度方法
【技术领域】
[0001]本发明涉及编译优化技术领域,尤其涉及一种基于依赖网格描述的指令级并行调度方法。
【背景技术】
[0002]在一个基本块中,指令之间最基本的关联关系之一是数据流造成的数据依赖约束,它决定了程序的运行结果。在现代的流水线处理器和超标量处理器中,可以通过指令重排来提高代码的并行度以发挥先进的体系结构优势,但这种指令重排技术需要建立在了解基本块内指令间并行性的基础上才能进行。因此,在指令重排之前或在进行指令重排过程中,一项重要的工作就是对基本块内指令间的并行性进行识别。
[0003]现有技术中,对基本块中指令进行重排的基本方法主要为表调度方法,这种方法对指令间并行性的识别是依赖于一个描述基本块中指令间数据依赖关系的无环有向图(DAG,Directed Acyclic Graph),称为基本块的依赖DAG。表调度方法在指令调度过程中,通过基本块的依赖DAG中描述的指令间数据依赖关系能够在每个时间点获取调度的候选指令集合Cands,进而根据一定的方案从候选指令集合Cands中选择一条指令,余下的指令在下一个时间点重新处理。对于超标量处理器,由于在指令调度过程中,需要考虑将多条指令形成可同时流出的指令组,因此在基于依赖DAG的表调度方法的基础上,还需要为每个可并行执行的部件建立各自的数据结构,使得能够在每个时间点为每个功能单元获得相应的候选指令集合Cands。
[0004]综上所述,上述基于依赖DAG的表调度方法存在以下问题:
1)该方法虽然描述了指令间的数据依赖关系,但并没有表现指令间的其他关联关系,尤其是与目标系统硬件相关的关系,因而在执行调度过程中无法确定指令与硬件结构的相关性;
2)对于多功能单元的VLIW(Very Long Instruct1n Word,超长指令字)体系结构,由于该方法不能体现指令间因功能单元不同而造成的各功能单元之间的相关性,因而该方法在VLIW体系结构中不适于使用更激进或更具前瞻性的指令重排技术,不利于更充分地发掘体系结构特征带来的基本块内指令间并行性;
3)对于多功能单元的VLIW体系结构,由于该方法不能反映各功能单元的实时工作量,也不能实时地反映指令之间、指令与功能单元之间的关系,因此当某些指令能够在多个功能单元中的任意一个中执行时,该方法无法与功能单元分配相结合来让指令调度产生更适应体系结构的优化结果。
【发明内容】
[0005]本发明要解决的技术问题就在于:针对现有技术存在的技术问题,本发明提供一种实现方法简单、适用范围广、指令级并行度高的基于依赖网格描述的指令级并行调度方法,能够结合数据依赖关系和功能单元分配关系,同时描述指令间的并行关系以及与硬件结构之间的相关性。
[0006]为解决上述技术问题,本发明提出的技术方案为:
一种基于依赖网格描述的指令级并行调度方法,步骤包括:
1)获取目标基本块中指令之间的数据依赖关系以及各指令所对应的功能单元的信息,根据所述数据依赖关系设置并计算各指令的数据依赖优先级值;
2)按所述数据依赖优先级值以及功能单元划分各指令,将划分得到的结果按网格形式进行存储,建立得到指令与数据依赖优先级、功能单元之间依赖关系的依赖网格;
3)按照步骤2)得到的依赖网格中指令的数据依赖优先级、指令与功能单元之间的关系进行指令间的并行性分析。
[0007]作为本发明的进一步改进:查询目标基本块中所有已确定对应物理功能单元的第一目标指令,并获取每条所述第一目标指令对应的物理功能单元的信息;查找基本块中所有未确定对应物理功能单元的第二目标指令,并获取每条所述第二目标指令对应的多种组合功能单元的信息,所述组合功能单元为所述第二目标指令对应的所有物理功能单元根据所构成的可能组合。
[0008]作为本发明的进一步改进,步骤2)的具体实施步骤为:
2.1)遍历各指令,并将各指令按照数据依赖优先级划分为多个指令组;
2.2)遍历所述步骤2.1)得到的各指令组,将各指令组中所有已确定对应物理功能单元的第一目标指令按照所对应的所述物理功能单元进行划分,得到多个第一指令子组;将各指令组中所有未确定对应物理功能单元的第二目标指令按照所对应的所述组合功能单元进行划分,得到多个第二指令子组;
2.3)构建一个用于存储所述指令子组的二维表结构,所述二维表中行向量对应指令的各数据依赖优先级,每行的行号对应数据依赖优先级值,列向量分为对应各物理功能单元的第一部分、对应各组合功能单元的第二部分,每个数据依赖优先级值与一个物理功能单元或组合功能单元对应所述二维表的一个网格单元格;将各所述第一指令子组按照数据依赖优先级值、物理功能单元分别保存至所述二维表的第一部分各网格存储空间中,将各所述第二指令子组按照数据依赖优先级、组合功能单元分别保存至所述二维表的第二部分各网格存储空间中,由所述二维表的第一部分、第二部分构成指令与数据依赖优先级、功能单元之间依赖关系的依赖网格。
[0009]作为本发明的进一步改进,步骤1.1)中计算各指令的数据依赖优先级值的具体实施步骤为:
1.1)分别为各指令定义一个数据依赖优先级值并初始化为O ;
1.2)从第二条指令开始,依次遍历基本块中各条指令计算对应的数据依赖优先级值,每条指令计算时,按逆序遍历当前指令的前一条指令与首条指令之间的所有目标指令,判断目标指令中是否存在与当前指令有依赖关系的依赖指令,如果有这样的依赖指令,将查找到的所有所述依赖指令中最大的数据依赖优先级值加I后作为当前指令的数据依赖优先级值。作为本发明的进一步改进,所述步骤1.2)中查找出所有与当前指令有依赖关系的指令的具体实施步骤为:
1.21)将当前指令中任意一个源变量作为目标源变量,在当前指令之前的所有指令中查找出对目标源变量进行最后一次定值的指令,得到目标源变量的最后一次定值指令,并将所述最后一次定值指令作为一条与当前指令有依赖关系的依赖指令;
1.22)取下一个源变量作为目标源变量,重复执行步骤1.21),直至完成对当前指令中所有源变量的最后一次定值指令的查找,得到所有与当前指令有依赖关系的依赖指令。
[0010]作为本发明的进一步改进,步骤3)后还包括依赖网格动态调整步骤4),具体实施步骤为:
4.1)当所述依赖网格中处于最高数据依赖优先级的待移除指令在本拍将被移除时,将所述待移除指令作为当前目标指令,并将所述待移除指令所对应的数据依赖优先级作为当前参照数据依赖优先级,转入执行步骤4.2);
4.2)在所述依赖网络的数据依赖优先级比所述参照数据依赖优先级低一级的对应行中,查找出与所述当前目标指令有依赖关系的所有依赖指令作为待调整指令,并分别获取每条所述待调整指令对应的所述依赖指令中最大数据依赖优先级值,将获取得到的所述最大数据依赖优先级值加I后分别作为对应的所述待调整指令调整后的数据依赖优先级值;然后将所述待调整指令按照调整后的数据依赖优先级值调整到依赖网格中对应的位置,转入执行步骤4.3);
4.3)以调整后的指令作为当前目标指令,并将所述调整后的指令的优先级作为当前参照数据依赖优先级,返回执行步骤4.2),直至执行到没有指令被调整或者到达最小的数据依赖优先级对应的那一行。
[0011]作为本发明的进一步改进,所述步骤3)中并行性分析具体包括识别指令之间逻辑并行性步骤,具体实施步骤为:获取所述依赖网格中处于目标数据依赖优先级的所有指令,得到与目标数据依赖优先级对应逻辑时间点的所有并行指令。
[0012]作为本发明的进一步改进,所述步骤3)中并行性分析具体包括识别功能单元候选指令集步骤,具体实施步骤为:获取所述依赖网格中对应目标功能单元且处于目标数据依赖优先级的所有指令,得到目标功能单元在目标数据依赖优先级所对应的逻辑时间点的候选指令集。
[0013]作为本发明的进一步改进,所述步骤3)中并行性分析具体包括获取目标执行单元工作量步骤,具体实施步骤为:统计所述依赖网格中对应目标功能单元处于各数据依赖优先级的所有指令,得到目标执行单元在各逻辑时间点的工作量;统计所述依赖网格中对应目标功能单元的所有指令,得到目标执行单元的总工作量。
[0014]作为本发明的进一步改进,所述步骤3)中并行性分析具体还包括功能单元关联性分析步骤,具体实施