(1)指令流水线:
• 多发射:多车道
• 动态调度:允许超车
(2)喂饱“饥饿”的运算器:
• 转移猜测:提供足够的指令
• 存储管理:提供足够的数据
• 冯诺依曼结构:存储程序和顺序执行
(1)分支指令的影响是开发指令级并行性的重要障碍:
• 一条指令流中,平均每5-7条指令中就有一条是分支指令,也即基本块大小为5-7条指令
(2)增大发射宽度:
• 在发射宽度为n的处理器中,遇到分支指令的速度也快了n倍
(3)增加流水线深度:
• 流水线越深,处理分支指令所需要的时钟周期数就越多
(4)例子:
假设平均每8条指令中有一条转移指令,某处理器采用4发射结构,第10级流水解决转移地址相关(即第10级流水算出转移方向和目标):
(每次转移出问题,流水线停顿9拍,这9拍可发射36条指令,即浪费的指令带宽)
①在A系统中不进行转移预测,遇到转移指令就等待:
-指令带宽浪费36/(36+8)=82%; //相当于没发射8条指令,浪费一次
②在B系统中进行简单的转移预测,转移猜错率为50%,那么平均每16条指令预测错误一次:
-指令带宽浪费36/(36+16)=75%
③在C系统中,转移指令猜错率为10%,那么平均每80条指令预测错误一次:
-指令带宽浪费36/(36+80)=31%;
④在D系统中,转移指令猜错率为4%,平均每200条指令预测错误一次:
-取指令带宽浪费36/(36+200)=15%。
(1)条件转移与无条件转移:
• 条件转移:需等待条件确定后才能取指,程序中多数转移指令是条件转移指令
• 无条件转移:不用判断条件就转移,如call/return
(2)直接转移与间接转移:
• 直接转移:转移目标根据指令内容直接得出
• 间接转移:转移目标在寄存器中
(3)相对转移与绝对转移:
• 相对转移:转移目标为当前PC值加上偏移量
• 绝对转移:转移目标由指令或寄存器内容直接给出
由上可知:理论上有8种组合:实际上不实现所有组合
(1)SPEC CPU2000转移指令统计—龙芯2号统计结果
(2)转移指令间距离统计:
发射宽度增加,分支间的动态距离就会越小,分支预测的延迟对性能的影响就越大,当要求更高的发射宽度时,需要每个周期做不止一个预测;
例:Inter-branch distance(cycles) ,模拟环境:4发射乱序机器 @SPECint2000
(3)不同类型转移指令分布:
龙芯2号上部分SPEC CPU2000程序中转移指令分布:
• 1%是间接分支指令,采用BTB预测
• 5%是返回指令,返回地址栈RAS预测
• 29%是无条件立即跳转指令,跳转地址在指令中
• 65%是条件分支,大量的工作是进行条件分支预测
(4)转移指令的执行频率分布:
龙芯2号上部分SPEC CPU2000程序转移指令执行频率分布:
• 所有转移指令的44%仅仅执行99次或者更少,这44%的转移指令占所有转移指令总执行次数的0.03%;
• 只有4.2%的转移指令执行了超过100000次或者更多,占所有转移指令总执行次数的87%(或者说,只有14.7%的转移指令超过了10000次,占所有转移指令总执行次数的97%)。
(5)转移成功率分布:
龙芯2号上部分SPEC CPU2000程序转移指令的跳转成功率:
• 45%的指令总是跳转,15%的指令总是不跳转;
• 20%的指令跳转的几率小于5%或者大于95%;(80%的转移指令具有强烈的一个跳转方向,具有挑战性的工作是预测其余20%转移指令的跳转方向)
(1)利用单个转移指令的重复性:
基于模式的预测方法
(2)利用不同转移指令之间的关系:
基于相关的预测方法
(1)阻塞:
- 等待直到转移条件确定
(2)用延迟槽容忍延迟:
- 延迟槽指令来源
(3)编译器优化:
- 循环:循环展开减少转移指令、软流水减少阻塞
- 分支:全局代码调度(越过分支调度指令)
- 函数调用:inline
(4)转换为数据相关:
- 条件指令、谓词
(5)硬件转移预测:
- 转移条件未确定时预测转移是否成功
- 静态与动态预测
(1)利用延迟槽:
(2)软件循环展开消除控制相关
软件循环展开的不足:
- 有些循环不好展开(如循环次数不定的循环)
- 增加指令CACHE的负担
循环的数据相关:
- 循环内相关:
-S2使用同一次循环中S1计算的A[i+1]。
-导致一个循环体内的多条指令不能并行执行;
- 循环间(loop-carried)相关:
-本次循环计算的A[i+1]/B[i+1]将被下一次循环使用。
-导致多个循环体不能并行执行
把循环间相关转换为循环内相关
循环展开的条件:
- 数组元素相关的判断:
数组元素两种类型:
- 名字相关的消除:重命名技术
- 指针相关的判断:只有一些经验的方法
循环间相关的解决—软流水:
• 新循环体的每个操作来自不同的循环体,以分开数据相关的指令,相当于软件的Tomasulo算法;
• 符号级循环展开,比真正循环展开代码开销小;
(3)把控制相关转换成数据相关:
把条件转移指令转换为条件执行:
(条件指令的条件作为指令执⾏阶段的⼀个输⼊,实际上把控制相关转化为数据相关)
- if (x) then A = B op C else NOP (在执行阶段判断x是否为0) //CMOV A ,B , X
- 只有条件为真时才写结果,为假时不写结果也不发生例外
- RISC系统如Alpha, MIPS, PowerPC, SPARC都增加了条件MOVE指令; PA-RISC的nullification
- EPIC: 使用64个1位的谓词寄存器来选择是否写执行结果
条件指令的缺点:
- 条件为假时仍需要1拍,占用发射槽和功能部件
- 条件未确定仍需要在执行前等待,转移猜测反而在执行后
- 条件复杂时会降低效率,因为条件在执行时才确定
条件指令举例:
- 假设转移指令没有延迟槽
- 条件指令可消除简单的条件转移,对取绝对值等操作有用
- 条件指令仍要在执行前等待条件,注意例外的处理
(1)基本思路:
(2)基本原理:
1)猜测依据:
• 当前指令的地址(PC)和性质(是否转移指令)
• 过去转移指令历史记录
2)猜测内容:
• 转移方向、转移目标地址
3)原理图示:
(3)分支处理机制的性能取决于:
(4)转移预测关键技术:
1)如何保证准确的预测:根据记录的历史进行预测
• 如何记录转移历史,记录哪些转移历史
• 记录多少转移历史
• 何时更新:更新太早,转移指令也可能被取消;更新太晚,导致转移历史不准确
2)如何在取消猜测执行的操作时保证现场精确性
• 增加提交流水级,在提交时修改寄存器(寄存器重命名)和内存(write buffer机制)
• I/O指令的猜测执行难以取消
3)如何识别流水线中的指令哪些需要取消,哪些不要取消
• 例外取消一般在提交时,取消所有后续指令
• 转移取消一般在执行后,只取消部分指令
要求有⼀种机制来判断指令流⽔线中的每⼀条指令和错误预测的转移指令的先后关系。
4)延迟槽指令的处理
5)每个周期多个分支预测
• 每周期1个预测,基本可满足4-6 发射需要的取指带宽
(5)高性能性能转移预测机制特征:
① 减少预测延迟槽 (如⽤根据PC预测的BTB/BTAC等机制);
② 在执⾏阶段尽早确定转移结果,降低错误预测的开销;
③ 在转移预测错误时要有⾼效的流⽔线刷新机制;
④具有⾼预测精度的转移预测机制;
(6)静态/动态转移预测:
(7)局部转移预测:
- 独立考虑单个循环的历史记录,寻找其中的重复性规律,并根据该规律预测未来的转移行为;
- 对于重复性特征明显的转移指令(如循环)效果好;
- 例子:
• for (I=0, I<10; I++){ }
• 转移模式为(1111111110)^n
(8)利用单个分支的重复性—BHT
1)转移历史表BHT(Branch History Table):
• 用PC的低位索引,每项1位 (可能两条转移指令的PC低位相同 ,从⽽引起冲突)
• 记录同一项上次转移是否成功,表示是否转移成功
(具有上述两项特征的BHT表,1位,称为PHT表)
• 不进行地址比较检查(cache,tag用于地址比较检查)(因为即使预测错误也还有纠正措施)
2)问题:
对循环进行猜测时,1位BHT(PHT)引起两次猜错:
(1位PHT表预测时仅看该转移指令上次跳转是否成功)
①循环退出时,转移方向不一致
②进入循环时,和上次退出时的转移方向不一致
3)改进:两位BHT表—转移历史表
(9)减少猜测延迟—转移目标缓冲器BTB
(10)RAS:返回地址栈
- 返回地址栈(Return Addresses Stack)预测返回地址
- 函数调用时压栈,返回时从栈顶弹出作为返回地址
- 针对函数调用有很高的预测准确率
(11)BHR转移历史寄存器—转移指令的相关性
1)作用:记录所有转移指令的历史
2)实现方式:
移位寄存器:处理器执行转移指令,就把BHR左移1位,左移时最高位扔掉,最低位如果转移成功就填1,否则填0;
3)m位的BHR记录了处理器M次的转移历史;
4)BHR表:为每条转移指令单独记录 BHR ,再把多个BHR组织在⼀起的表
5)2位分支预测之后,预测正确率难以提高,主要原因是分支指令的相关性
(12)Yeh和Patt分类:
1)当前的转移依赖于两种情况:
• 该指令的过去m次转移记录:PHT(Pattern History Table)
• 程序中所有转移指令过去m次的转移记录:BHR(Branch History Register)
2)两层自适应预测器组合情况:
• BHR: Branch History Register
• PHT: Pattern History Table
①GAg结构:
- BHR和PHT都是全局的,全局的BHR又称为GHR(Global History Rigster)。
- 其中GHR存储过去k次转移历史,并用GHR的k位值去索引2k个入口的PHT,
- PHT每项利用2位饱和计数器进行预测。
②GAs结构:
- 其中BHR表还是全局的,只有k位;
- PHT表用k位的GHR和PC的低n位进行索引,因此一共有2^(k+n)项。
③SAg(k)的结构:
- PHT是全局的,BHR寄存器一共有2^n个,每个BHR为 k位。
- 先用PC的低n位索引GHR,然后再用GHR的值索引PHT表。
④PAp(4)结构:
- 每个PC值一个BHR寄存器,每个BHR为k位。
- 先用PC索 引BHR,然后再用BHR的值和PC一起索引PHT表。
(13)分支别名干扰问题:
1)模式:
- 无论BHR和PHT表如何增大,效果也不是很明显
- 主要原因是不同分支地址访问同一个PHT,造成分支干扰
- ⾃从⼆级转移预测器出现来 ,预测精度⼀般在92%左右 。
2)分支别名干扰的消除:
①Gselect:全局历史m位和地址n位组合寻址
②Gshare: 部分地址和全局历史异或寻址
性能分析结果表明:gshare稍微好于gselect
1)举例计算说明:
2条分支预测正确率分别为 85%和15%,使用同一项PHT
2)优点:
• 2条不同方向的分支可以映射到同一表项
• 偏向位不变,只改变 PHT
• gcc误预测在64k的PHT下减少8.6%, 1K的PHT误预测减少33.3%
3)应用:HP的PA-8700处理器
(16)组合分支预测器:
两个动态预测器(BTB)和静态预测混合预测: