什么是控制依赖关系?
考虑以下代码序列:
mul r1, r2, r3; jz zproc; sub r4, r7, r1; : zproc:load r1, x; :
在这个例子中,实际的执行方向取决于乘法的结果。这表明,条件分支后的指令依赖于它。类似地,所有条件控制指令,包括条件分支、调用、跳过等,都会对逻辑上后续的指令产生依赖关系,这被称为**控制依赖关系**。
术语“通用程序”指的是编译器、操作系统或非数值应用程序。数据表明,通用程序具有高比例的分支,高达20-30%。相比之下,科学/技术程序包含的分支较少;可能的频率低至5-10%。
条件分支与分支的比率在不同的程序中似乎相当稳定,保持在75-85%的范围内。因此,通用代码中条件分支的预期频率约为20%,而在科学程序中则仅为5-10%。
频繁的条件分支对ILP处理器带来了巨大的执行限制。ILP处理器主要通过并行执行越来越多的指令来提高性能。
为了实现这一点,处理器必须整合越来越多的执行单元(EU),并被迫提高指令发出率。但是,每个周期发出的指令越多,在每个周期遇到条件控制依赖的概率就越高。
例如,让我们考虑一个代码序列,其中每第六条指令都是一个条件分支,如图所示。让我们假设代码序列不包含任何数据或资源依赖关系,因此指令发出机制可以随意发出两条、三条或六条指令。当发出率从每周期两条指令提高时,每三条、两条甚至每条发出指令都将包含一个条件分支,从而可能导致越来越严重的性能下降。
控制依赖图
就像数据依赖关系一样,控制依赖关系也可以用有向图来定义。转移控制依赖关系的指令通常由具有两个后继弧的节点定义,如图所示。输出弧定义真(T)和假(F)路径,并通常相应地标记。
只有单个输出弧的节点定义操作指令或一系列无条件分支的操作指令(直线代码)。表示控制依赖关系的有向图的通用方法是控制依赖图(CDG)。
广告