当前位置: 首页 > article >正文

计算机体系结构补充篇----静态超标量流水线及循环展开(一)

本文仅供学习,不作任何商业用途,严禁转载。部分资料取自----计算机系统结构教程(第二版)张晨曦等。部分资料来自----国科大计算机体系结构课程PPT–张科、刘珂、高婉玲

计算机体系结构----静态超标量流水线及循环展开(一)

  • 摘要
  • 静态编译器流水线调度
  • 循环展开
  • 静态超标量流水线

摘要

本文先简要介绍静态编译器流水线调度(消除数据冒险),再介绍循环展开(Loop Unrolling)技术(消除控制冒险),最后再结合静态超标量流水线技术(增加IPC)和循环展开技术对示例代码进行优化分析

静态编译器流水线调度

假定有如下代码

for(i = 1000; i >0 ; i--)
	x[i] = x[i] + s;

上述代码转换成MIPS的汇编代码如下
(注意汇编代码段1先忽略各条指令之间的stall,即假定各条指令之间无stall
汇编代码段1

 L.D F0, 0(R1) ; F0 = array element
 ADD.D F4, F0, F2 ; add scalar
 S.D F4, 0(R1) ; store result
 DADDUI R1, R1,# -8 ; decrement address pointer
 BNE R1, R2, Loop ; branch if R1 != R2
 NOP

现在我们做如下规定
LD -> any : 1 stall
FPMUL -> any: 5 stalls
FPMUL>ST : 4 stalls
IntALU ->BR : 1 stall
FPALU -> ST :2stalls
FPALU-> any: 3stalls
BR指的是分支指令。
每个BR指令后续都存在一个Stall。

那么汇编代码段1在上述假定下,实际执行情况如下
汇编代码段2

 L.D F0, 0(R1) ; F0 = array element
 stall
 ADD.D F4, F0, F2 ; add scalar
 stall
 stall
 S.D F4, 0(R1) ; store result
 DADDUI R1, R1,# -8 ; decrement address pointer
 stall
 BNE R1, R2, Loop ; branch if R1 != R2
 stall

汇编代码段2一共花费10 cycles。

在经过编译器的调度后汇编代码段2变成如下代码段(注意,此时各条指令间不是不存在stall,而是被“合理”消除了))
汇编代码段3

 L.D F0, 0(R1) 
 DADDUI R1, R1,# -8
 ADD.D F4, F0, F2 
 stall
 BNE R1, R2, Loop
 S.D F4, 8(R1) 

汇编代码段3一共花费6 cycles。

实际上汇编代码段3真正在工作的时间只有ADD.D L.D S.D这三条指令,DADDUI BNE指令都是循环判断指令,知道了这个信息后,那我们还有再优化的空间吗?我们希望把几乎每个循环都控制在三个有效指令在工作,不想在每个循环中都加上循环判断指令。

循环展开

上面的汇编代码段3还可以依靠循环展开来二次优化。优化后的结果如下。
汇编代码段4(注意汇编代码段4先忽略各条指令之间的stall,即假定各条指令之间无stall

 L.D F0, 0(R1) 
 ADD.D F4, F0, F2 
 S.D F4, 0(R1)
 L.D F6, -8(R1)
 ADD.D F8, F6, F2
 S.D F8, -8(R1)
 L.D F10,-16(R1)
 ADD.D F12, F10, F2
 S.D F12, -16(R1)
 L.D F14, -24(R1)
 ADD.D F16, F14, F2
 S.D F16, -24(R1)
 DADDUI R1, R1, #-32
 BNE R1,R2, Loop

如果我们考虑上汇编代码段4的各条指令间的stall,再合理的调度指令把stall给消除,可以得到如下代码段。(注意,此时各条指令间不是不存在stall,而是被“合理”消除了
汇编代码段5

 L.D F0, 0(R1) 
 L.D F6, -8(R1)
 L.D F10,-16(R1)
 L.D F14, -24(R1)
 ADD.D F4, F0, F2 
 ADD.D F8, F6, F2 
 ADD.D F12, F10, F2
 ADD.D F16, F14, F2
 S.D F4, 0(R1)
 S.D F8, -8(R1)
 DADDUI R1, R1, # -32
 S.D F12, 16(R1)
 BNE R1,R2, Loop
 S.D F16, 0(R1)

汇编代码段5一共花费14 cycles,但是却做了汇编代码段2 40个cycles的事!
汇编代码段5每个原循环的cycle数为14/4 = 3.5 (14/4 中的14表示4个循环的总cycle数,4表示4个循环)
我们把这种一个循环展开四次在英文术语上称为Degree4,即循环展开N次,称为DegreeN

当然,这还不是我们的极限,我们还可以使用静态超标量流水线继续加速!

静态超标量流水线

在这里插入图片描述
静态超标量可以简单理解成,处理器一次性发射两条指令,一条是整数指令,一条是浮点指令,以此来实现IPC > 1的效果。
汇编代码段5改写成静态超标量流水线的形式,同时汇编代码段5的四次循环展开Degree4变成Degree5,代码段如下。
汇编代码段6

Integer pipeline    FP pipeline
 L.D F0,0(R1)        NOP
 L.D F6,-8(R1)       NOP
 L.D F10,-16(R1)     ADD.D F4,F0,F2
 L.D F14,-24(R1)     ADD.D F8,F6,F2
 L.D F18,-32(R1)     ADD.D F12,F10,F2
 S.D F4,0(R1)        ADD.D F16,F14,F2
 S.D F8,-8(R1)       ADD.D F20,F18,F2
 S.D F12,-16(R1)     NOP
 DADDUI R1,R1,# -40  NOP
 S.D F16,16(R1)      NOP
 BNE R1,R2,Loop      NOP
 S.D F20,8(R1)       NOP

记住我们做的如下规定,注意汇编代码段6是建立在这个规定下的。
LD -> any : 1 stall
FPMUL -> any: 5 stalls
FPMUL>ST : 4 stalls
IntALU ->BR : 1 stall
FPALU->ST : 2stalls
FPALU-> any: 3stalls
BR指的是分支指令。
每个BR指令后续都存在一个Stall。

NOP = No option 即无操作。


http://www.kler.cn/a/154151.html

相关文章:

  • DataStream编程模型之数据源、数据转换、数据输出
  • WebSocket实战,后台修改订单状态,前台实现数据变更,提供前端和后端多种语言
  • Skywalking搭建-来自于图灵课堂
  • Linux守护Pythom脚本运行——Supervisor学习总结
  • python读写excel等数据文件方法汇总
  • 解决Windows远程桌面 “为安全考虑,已锁定该用户账户,原因是登录尝试或密码更改尝试过多。请稍后片刻再重试,或与系统管理员或技术支持联系“问题
  • rtmp 协议详解
  • 【1】基于多设计模式下的同步异步日志系统
  • SHEIN出口儿童玩具加拿大站CCPSA安全标准办理解析
  • 如何使用Go与MQTT进行通信
  • 多线程(初阶六:单例模式)
  • 应用于智慧电力安全的AI边缘计算盒子+AI算法软硬一体化方案
  • 蓝桥杯-02-python组考点与14届真题
  • 让你的前端代码飞起来:如何实现自动化测试?
  • H264初探
  • [1] AR Tag 在ros中的使用
  • 第9课 任务创建、删除和API函数
  • Ubuntu 22.04安装Go 1.21.4编译器
  • Spring Boot统一异常处理 Spring拦截器
  • c++模板集合
  • 输出SearchFacesResponse对象的JSON格式字符串回包乱码解决方案
  • 工业机器视觉megauging(向光有光)使用说明书(十一,轻量级的visionpro)
  • 一个暂存文件
  • supervisor管理启动重启,Java,Go程序Demo
  • C语言KR圣经笔记 4.2返回非整数的函数
  • Mysq8l在Centos上安装后忘记root密码如何重新设置