-
Notifications
You must be signed in to change notification settings - Fork 0
计算机系统结构(2月3日)
执行什么操作,操作的值是什么,产生这个值的功能部件是什么,
Busy:保留栈或功能部件FU是否busy
寄存器结果状态,
1、发射阶段:保留栈不空,里面有空就往里面送
2、执行:在功能部件中执行
3、写结果,结果直接广播出去
一般的总线都是“go to” bus,data+destination
这个总线是“come from”bus,data+source
64位的数据+4位功能部件 source address
按序发射,乱序执行,乱序完成
缺点:复杂性大,公共数据总线要求要快,对容量,带宽要求高
non-precise interrupt
寄存器重命名:采用指针的方法
保留栈:通过设置若干个保留栈,可以对一些操作进行缓冲
执行过程中动态建立数据相关依赖图
优点:1、冲突检测是分布的,通过指针自动消除了,只检测资源是否发生冲突,资源是否够用;2、消除了名相关(WAW和WAR);
超标量:每个时钟周期同时发送两条指令如何?
通过指针、保留栈,有效解决了循环内、循环之间的冲突问题
总线是瓶颈
就是解决了数据冲突,控制冲突也解决了
通过指针的方法解决寄存器数量有限的问题
避免了计分牌中WAR、WAW冲突
通过硬件进行循环展开,循环级并行做的更好,对cache命中率、缺失有好处
流水线的静态调度:
通过编译来完成
ILP:指令集并行,将循环展开,挖掘循环之间的并行性
同样适合超标量,超长指令字
超长指令字:
编译:挖掘硬件的并行性,挖掘数据局部性
软件流水:第一个循环的后面几条指令与后面一个循环前面几条指令可以并行执行
流水线的设计为了让CPI最小,尽可能来控制由于结构冲突、数据冲突,还有控制冲突引起的停顿
控制冲突,研究点在分支预测
循环展开来使得stall最少
循环展开后使得可调度条数多
采用多发射技术,再结合循环展开等技术,可以提高指令级并行度,超标量、超长指令字都可以通过此进行调度达到最优的效果
循环展开和分支预测
三类性能冲突:
1、由于依赖导致的数据冲突
2、由于资源的冲突导致的结构冲突
3、由于分支导致的控制冲突
unrolling 循环展开
软件流水(pipelining)
1981年,美国的J.A.Fisher教授提出了第一个软件流水算法:路径调度TRACE
目前已经有很多种流水算法
已经在编译器中实现软件流水:ORC、Open64、GCC 4.0以上等
微处理器支持软件流水:VLIW体系结构,条件执行等;例如:Itanium、ARM、龙芯
已经成为开发程序并行性,提高微处理器速度的主要方法之一
消除程序中的绝大多数数据相关,提高指令级并行度ILP(从2左右提高到20以上)
两类开发循环程序并行性方法(软件流水与循环展开)
硬件结构规整,有利于大规模集成,并降低芯片功耗
软件流水
1、基本快软件流水 (循环次数确定、循环体内没有分支操作、单入口单出口、每个循环体执行时间确定)
2、全局软件流水,当循环体内包含有条件分支操作时,称为全局软件流水
名相关、前相关、输出相关,通过编译技术处理好的话,可以消减