1.CUP性能公式
评价cache性能公式:
平均存储访问时间 = 命中时间 + 缺失率×缺失代价
命中时间:缓冲命中需要的时间。
Cpu性能公式 分析
经典的CPU性能公式
现在我们可以用指令数、CPI和时钟周期时间来写出基本的性能公式:
CPU时间=指令数×CPI×时钟周期时间
CPI:每条指令的时钟周期数,表示执行某个程序或者程序片段时每条指令所需的时钟周期平均数。
指令数:执行某程序所需的总指令数量。
或 CPU时间=指令数×CPI/时钟频率
这些公式特别有用,因为它们把性能分解为三个关键因素。我们可用这些公式来比较不同的实现方案或评估某个设计的替代方案。
举例 代码段的比较
一个编译器设计者试图在两个代码序列之间进行选择。硬件设计者给出了如下数据:
对于某行高级语言语句的实现,两个代码序列所需的指令数量如下:
代码序列1共执行2+1+2=5条指令。代码序列2共执行4+1+1=6条指令。所以,代码序列2执行的指令数更多。
基于指令数和CPI,我们可以用CPU时钟周期公式计算出每个代码序列的总时钟周期数为:
因此,代码序列1的CPU时钟周期数=(2×1)+(1×2)+(2×3)=10周期,代码序列2的CPU时钟周期数=(4×1)+(1×2)+(1×3)=9周期。故代码序列2更快,尽管它多执行了一条指令。由于代码序列2总时钟周期数较少,而指令数较多,它一定具有较小的CPI。CPI的计算公式为:
CPI=CPU时钟周期数/指令数
代入相应数据可得CPI1=CPU时钟周期数1/指令数1=10/5=2
CPI2=CPU时钟周期数2/指令数2=9/6=1.5。重点
图1-14给出了计算机在不同层次上的性能测试指标及其测试单位。通过这些指标的组合可以计算出程序的执行时间(单位为秒):
执行时间=秒/程序=指令数/程序×时钟周期数/指令×秒/时钟周期
永远记住,唯一能够被完全可靠测量的计算机性能指标是时间。例如,对指令集减少指令数目的改进可能降低时钟周期时间或提高CPI,从而抵消了改进的效果。类似地,CPI与执行的指令类型相关,执行指令数最少的代码其执行速度未必是最快的。
图1-14 基本的性能指标及其测量单位
如何确定性能公式中这些因素的值呢?我们可以通过运行程序来测量CPU的执行时间,并且计算机的说明书中通常介绍了时钟周期时间。难以测量的是指令数和CPI。当然,如果确定了时钟频率和CPU执行时间,我们只需要知道指令数或者CPI两者之一,就可以依据性能公式计算出另一个。
用仿真器等软件工具可以测量出指令数,也可以用现代处理器中的硬件计数器来测量执行的指令数、平均CPI和性能损失源等。由于指令数量取决于计算机体系结构,并不依赖于计算机的具体实现,因而我们可以在不知道计算机全部实现细节的情况下对指令数进行测量。但是,CPI与计算机的各种设计细节密切相关,包括存储系统和处理器结构(我们将在第4、5章中看到),以及应用程序中不同类型的指令所占的比例。因此,CPI对于不同应用程序是不同的,对于相同指令集的不同实现方式也是不同的。
上述的例子表明,只用一种因素(如指令数)去评价性能是危险的。当比较两台计算机时,必须考虑全部三个因素,它们组合起来才能确定执行时间。如果某个因素相同(如上例中的时钟频率),必须考虑不同的因素,才能确定性能的优劣。因为CPI随着指令组合(instruction mix)而变化,这样指令的条数和CPU必须被比较,即使时钟频率是相同的。在本章最后的练习题中,有几个是关于计算机和编译程序的性能评价。在1.8节,我们将讨论一种因没有全面考虑各种因素而导致的对性能的误解。
理解程序性能
程序的性能与算法、编程语言、编译程序、体系结构以及实际的硬件有关。下表概括了这些成分是如何影响CPU性能公式中的各种因素的。
精解:也许你期望CPI最小值为1.0。在第4章我们将看到,有些处理器在每个时钟周期可对多条指令取指并执行。有些设计者用IPC(instruction per clock cycle)来代替CPI。如一个处理器每时钟周期可执行2条指令,则它的IPC=2,CPI=0.5。
2.verlog描述状态机(硬件描述语言(verylog)写状态机)
状态机描述方法:状态机描述时关键是要描述清楚几个状态机的要素,即如何进行状态转移,每个状态的输出是什么,状态转移的条件等。常见的三种描述方式:
整个状态机写到一个always模块里面,在该模块中既描述状态转移,又描述状态的输入和输出;
用两个always模块来描述状态机,其中一个always模块采用同步时序描述状态转移;另一个模块采用组合逻辑判断状态转移条件,描述状态转移规律以输出。
在两个awlays模块描述方法基础上,使用三个awlays模块,一个awlays模块采用同步时序描述状态转移;另一个模块采用组合逻辑判断状态转移条件,描述状态转移规律;另一个awlays模块描述状态的输出(可以组合电路输出,也可以时序电路输出)。
状态机采用VerylogHDL语言编码,建议分为三个always段完成。三段式建模描述FSM的状态机输出时,只需指定case敏感表为次态寄存器,然后直接在每个次态寄存器的case分支中描述该状态的输出即可,不用考虑状态转移条件。
//状态机设计的例子
module FSM(clk,clr,out,start,step2,step3);input clk,clr,start,step2,step3;output[2:0] out;reg[2:0] out;reg[1:0] state,next_state; parameter state0=2'b00,state1=2'b01,state2=2'b11,state3=2'b10;always @(posedge clk or posedge clr) begin if (clr) state <= state0; else state <= next_state;
end always @(state or start or step2 or step3) begin case (state) state0: begin if (start) next_state <=state1; else next_state <=state0; end state1: begin next_state <= state2; end state2: begin if (step2) next_state <=state3; else next_state <=state0; end state3: begin if (step3) next_state <=state0; else next_state <=state3; end default: next_state <=state0; endcaseendalways @(state) begincase(state) state0: out=3'b001; state1: out=3'b010; state2: out=3'b100; state3: out=3'b111; default:out=3'b001; endcaseend
3.流水线数据相关性及解决方法
流水线的概念
流水线:把一个重复的过程分解为若干子过程,每个子过程由专门的功能部件来实现。将多个处理过程在时间错开,依次通过各功能段,每个子过程就可以与其他子过程并行进行。
相关:指两条指令之间存在某种依赖关系。
3种类型:数据相关、名相关、控制相关
(1)数据相关
依次存在两条指令i(在前)和j(在后),若指令j使用指令i产生的结果或指令j与k数据相关,而k又与指令i数据相关,则称j与i数据相关。
(2)名相关
名:指指令所访问的寄存器或存储单元名称。
名相关:指两条指令使用的名相同,但没有数据流动,则称它们名相关。
(3)控制相关
控制相关是指由分支指令引起的相关。它需要根据分支指令的执行结果来确定后续指令是否执行。一般说来,为确保程序应有的执行顺序,必须严格按控制相关确定的顺序执行
(3)控制相关
控制相关是指由分支指令引起的相关。它需要根据分支指令的执行结果来确定后续指令是否执行。一般说来,为确保程序应有的执行顺序,必须严格按控制相关确定的顺序执行
流水线冲突:指对于具体的流水线来说,由于相关的存在,使得指令流中的下一条指令不能在特定的时钟周期执行。
流水线冲突有三种类型:结构冲突、数据冲突、控制冲突。
(1)结构冲突
定义:因硬件资源满足不了指令重叠执行的要求而发生的冲突。
解决方案:
a、可以在前一个指令访问存储器时,将流水线停顿一个时钟,推迟后面取指令的操作。停顿周期称为“流水线气泡”。
b、在流水线处理机中设置相互独立的指令。存储器和数据存储器
(2)数据冲突
定义:当指令在流水线重叠执行时,因需要用到前面的执行结果而发生的冲突。
分类:写后读冲突、写后写冲突、读后写冲突。
解决方案:
①通过定向技术减少数据冲突引起的停顿。
②设置流水线互锁机制。
③依靠编译器解决数据冲突
(3)控制冲突
定义:流水线遇到分支指令和其他会改变PC值的指令所引起的冲突。
解决方案:最简单的方法是“冻结”或者“排空”。就是一旦在流水线的译码段ID检测到分支指令,就暂停执行后的所有指令,直到分支指令达到MEM段、确定是否成功并计算出新的pc值为止。
4.cache一致性
现代并行机中,为了提高处理器的速度,处理器往往带有Cache。一个数据在整个系统内可能有多份拷贝,这就引发了Cache一致性问题。
Cache一致性问题是指在含有多个Cache的并行系统中,数据的多个副本(因为没有同步更新)而造成不一致的问题。可能由于多个处理器共享一个可写变量造成的Cache不一致;还有比如进程迁移和某些I/O操作等。
Cache一致性问题是指在含有多个cache的并行系统中, 数据的多个副本(因为没有同步更新)而造成的不一致问题。 以上的例子是由于多个处理器共享一个可写变量造成的cache不一致。还有其他原因也会造成cache一致性问题,比如进程迁移和某些I/O操作等。
事务内存
HYPERLINK "http://baike.baidu.com/view/121511.htm" \t "_blank" 事务内存是一种 HYPERLINK "http://baike.baidu.com/view/3260124.htm" \t "_blank" 并行程序设计的方式,其来自于 HYPERLINK "http://baike.baidu.com/view/68446.htm" \t "_blank" 数据库管理系统(DBMS)中的 HYPERLINK "http://baike.baidu.com/view/121511.htm" \t "_blank" 事务(Transaction)概念。 HYPERLINK "http://baike.baidu.com/view/121511.htm" \t "_blank" 事务内存目前有两种实现方式,基于软件的STM(Software Transactional Memory)和基于硬件的HTM(Hardware Transacational Memory)。
事务内存的分类和涉及到的基本术语
HYPERLINK "http://baike.baidu.com/view/121511.htm" \t "_blank" 事务内存按照更新数据时的机制不同,可分为 延迟更新(deferred-update) 和 直接更新 (direct-update) 两大类。延迟更新软件 HYPERLINK "http://baike.baidu.com/view/121511.htm" \t "_blank" 事务内存实现的基本思想是一个线程对仅对对象的一个副本进行改变,如果此次执行不与其他线程发生同步冲突,则此事务成功并执行提交(Commit)动作,如果失败则执行 HYPERLINK "http://baike.baidu.com/view/688328.htm" \t "_blank" 回滚(Abort 或 Rollback)动作。直接更新则是直接对对象进行更新,并使用显式的同步语句避免其他事物在进行更新的时候修改此对象。显然在直接更新时需要系统记录此对象的原始值,以便在 HYPERLINK "http://baike.baidu.com/view/688328.htm" \t "_blank" 回滚时可以恢复。
根据在 HYPERLINK "http://baike.baidu.com/view/121511.htm" \t "_blank" 事务冲突时的处理机制不同,TM又可以分为 悲观和乐观的 HYPERLINK "http://baike.baidu.com/view/1672732.htm" \t "_blank" 并发控制(pessimistic & optimistic concurrency control)两大类。在悲观的 HYPERLINK "http://baike.baidu.com/view/1672732.htm" \t "_blank" 并发控制中,冲突一旦发生就必须要得到侦测并加以解决,而在乐观的并发控制里,冲突的侦测和解决可以延迟,只要是在 HYPERLINK "http://baike.baidu.com/view/121511.htm" \t "_blank" 事务提