计算机体系结构标量处理机

文章探讨了先行控制技术中的缓冲深度设计,通过极端情况分析计算出合适的缓冲大小。此外,提到了控制相关问题的解决,如转移预测技术。流水线技术方面,讨论了线性流水线的性能分析,包括吞吐率、加速比和效率的计算,并涉及非线性流水线的冲突解决和无冲突调度方法。

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

先行控制技术

缓冲深度的设计方法

以先行指令缓冲栈为例。

假设缓冲深度为D1D_1D1,考虑以下两种极端情况。

(1)先行指令缓冲栈已经充满,此时指令流出速度最快,例如连续分析RR型指令 ,设这种指令序列的最大长度为L1L_1L1,平均分析一条指令的时间为t1t_1t1;同时,指令流入的速度最慢,平均取一条指令的时间为t2t_2t2,从主存取到先行指令缓冲栈中的指令数为L1−DIL_1-D_IL1DI。应该满足以下关系:

L1t1=(L1−DI)t2L_1t_1=(L_1-D_I)t_2L1t1=(L1DI)t2

DI=⌈L1×(t2−t1)t2⌉D_I=\lceil\frac{L_1\times(t_2-t_1)}{t_2}\rceilDI=t2L1×(t2t1)

可以预见时间L1t1L_1t_1L1t1之后,缓冲栈变空,失去作用。因此必须保证这种指令流的连续长度不超过L1L_1L1。通过对程序进行静态分析以确定L1L_1L1的值来计算出缓冲深度DID_IDI

(2)先行指令缓冲栈原来为空,此时指令流出速度最慢,指令流入的速度最快。

控制相关

通过转移预测技术降低控制相关带来的损失。

(1)通过编译器尽量降低转移成功的概率。

(2)设置两个先行指令缓冲栈,按照转移成功的方向预取指令到先行目标缓冲栈,先行指令缓冲栈仍然按照转移不成功的方向继续预取指令。如果转移不成功,则继续分析原来先行指令缓冲栈中的指令;如果转移成功,则分析新增设的先行目标缓冲栈中的指令。Don’t put all your eggs in one basket.

流水线技术

线性流水线的性能分析

  1. 吞吐率

    nnn为任务数,TkT_kTk为完成nnn个任务所用的时间,则流水线的吞吐率为TP=nTkTP=\frac{n}{T_k}TP=Tkn

    假设各段执行时间相等,输入连续任务的情况下,完成nnn个任务需要的总时间为Tk=(k+n−1)×ΔtT_k=(k+n-1)\times\Delta tTk=(k+n1)×Δt,其中kkk为流水线的段数,Δt\Delta tΔt为时钟周期。最大的吞吐率为TPmax=limn→∞n(k+n−1)Δt=1ΔtTP_{max}=lim_{n\rightarrow\infty}\frac{n}{(k+n-1)\Delta t}=\frac{1}{\Delta t}TPmax=limn(k+n1)Δtn=Δt1

    若各段时间不等,完成连续nnn个任务(可以想象到其他流水段会出现一些“气泡”等待最长的流水段执行):

    TP=n∑i=1kΔti+(n−1)max(Δt1,...,Δtk)TP=\frac{n}{\sum_{i=1}^{k}\Delta t_i+(n-1)max(\Delta t_1,...,\Delta t_k)}TP=i=1kΔti+(n1)max(Δt1,...,Δtk)n

    TPmax=1max(Δt1,...,Δtk)TP_{max}=\frac{1}{max(\Delta t_1,...,\Delta t_k)}TPmax=max(Δt1,...,Δtk)1

  2. 加速比(Speedup)

    加速比的基本公式:S=顺序执行时间T0流水线执行时间TkS=\frac{顺序执行时间T_0}{流水线执行时间T_k}S=流水线执行时间Tk顺序执行时间T0

  3. 效率(Efficiency)

    计算流水线效率的一般公式:E=n个任务占用的时空区k个流水段的总的时空区=T0k×TkE=\frac{n个任务占用的时空区}{k个流水段的总的时空区}=\frac{T_0}{k\times T_k}E=k个流水段的总的时空区n个任务占用的时空区=k×TkT0

  4. 流水线最佳段数的选择

    采用顺序执行方式完成一个任务的时间为ttt,在同等速度的kkk段流水线上执行一个任务的时间为tk+d\frac{t}{k}+dkt+dddd为流水锁存器的延迟时间,因此,流水线的最大吞吐率为P=1tk+dP=\frac{1}{\frac{t}{k}+d}P=kt+d1,流水线的总价格估计为C=a+bkC=a+bkC=a+bk,其中aaa为功能段身的总价格,bbb为每个锁存器的价格。

    我们可以定义一个“性价比”,性能和价格比PCR定义为

    PCR=PC=1tk+d×1a+bkPCR=\frac{P}{C}=\frac{1}{\frac{t}{k}+d}\times\frac{1}{a+bk}PCR=CP=kt+d1×a+bk1

    令导数为0得到(kt+kd×1a+bk)′=0(\frac{k}{t+kd}\times\frac{1}{a+bk})'=0(t+kdk×a+bk1)=0

    解得k0=t×ad×bk_0=\sqrt{\frac{t\times a}{d\times b}}k0=d×bt×a

在这里插入图片描述

非线性流水线的冲突问题

在非线性流水线中,会出现几个任务用同一流水段的情况。

无冲突调度方法

首先定义一些概念:

启动距离:连续输入两个任务之间的距离。

禁止向量:预约表中每一行任意两个X之间距离的集合。下例中为(3,4,6),可以预见用禁止向量中的数作为下一个任务的启动距离会导致流水线的冲突。

在这里插入图片描述

冲突向量:C=(CmCm−1...C2C1)C=(C_mC_{m-1}...C_2C_1)C=(CmCm1...C2C1),其中mmm是禁止向量中的最大值,如果iii在禁止向量中则Ci=1C_i=1Ci=1,否则Ci=0C_i=0Ci=0。因此,(3,4,6)对应冲突向量(101100)。

  1. 将冲突向量逻辑右移(模拟时间流动),若移出去的是1,则表示用相应启动距离向流水线输入新任务时会导致功能段冲突。

  2. 若移出去的是0,则表示不会产生功能段冲突。添加该任务,用移位之后的向量(前一个任务在流水线中的剩余部分)和初始的冲突向量按位或得到新的冲突向量。

  3. 对新的冲突向量做同样的操作。实际上每个冲突向量是一个状态。根据步骤2中的变换关系(移多少位添加新任务)可以构建出状态图,实际上就是有限状态自动机(DFA)。

在这里插入图片描述

对于上面的例子,一个任务执行7个时间片,因此启动距离为7时流水线已经排空,上一个任务已经结束。因此,所有状态均有一条7*的弧连向初始冲突向量。

定义简单循环为在状态图中各种冲突向量只经过一次的启动循环。下图为最小启动循环的(1,1,7)的预约表。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

u小鬼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值