|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
引言 ' U4 Z7 d, r' j( g# X7 y0 y1 E
, \. O( \: ` S阵而后战,兵法之常,运用之妙,存乎一心。
! m6 p, _2 ]/ p& D0 w! V% K6 d0 m2 t/ H3 L/ C$ i( h; d
先说两个概念:
+ E! L. s+ L% F# @* C* E
4 T0 u; X5 S6 T% A1》图灵机:说白了,一句话,就是当前状态,和输入,共同决定输出内容。这样的机器,就是图灵机。图灵,是个名人,也是个人名,在二次世界大战中在一个小区里做出了很大贡献,当然不是他一个人在战斗。9 G# k% m7 R; E- A
+ R7 Y3 U! ^: P& g, a
2》计算机体系结构(冯。诺依曼):也说白了,一句话,就是,数据和操作都放在存储器中,CPU从存储器中取操作和数据,然后进行根据操作把数据运算一下,最后把运算结果也放到存储器中。操作和数据合在一起就是一条“指令”。很多指令合在一起,就是一个指令集。在很多年前,指令集在一定程度上就代表着计算机体系结构。& c; R8 V. h* P, n, \# E8 A
i) J$ C( ^9 l1 @: P! \7 c) z4 J
冯。诺依曼体系结构就是图灵机的具体实现方式之一。# ]+ u0 O) I8 j* f) R- t
# F' G& Z3 Z) M2 R% v6 {5 e2 b% N针对图灵机,举个例子,在大学的数字电路都学过的话就会发现,整个内容可以分成两类,一类是组合逻辑电路(由基本与或非门电路组成),一类是时序逻辑电路(由带反馈的门电路构成的触发器)。其实,要想有“当前状态”,就需要触发器(触发器组成寄存器),要想对输入和当前状态进行处理,就需要组合逻辑电路。组合电路和时序电路共同组成了现在的大规模集成电路,和超大规模集成电路(VLIC)。
, P. Y, W! e# t* c; S0 Y) L6 t- ^! m; K; l+ t( ?
针对计算机体系结构,也举个例子:/ x* o9 g) ^+ g/ x# V
$ J3 T7 V+ f' F8 X t. k( n+ V1》,上世纪六七十年代,计算机体系结构,几乎就等同于ISA(指令集),这句话需要仔细体会一下。8 H1 ]+ d' W- V" B5 b3 k
: X( U+ h9 x5 q! ^/ S% [) {2》,上世纪八九十年代,“存储墙”导致了cache的出现,21世纪初,“功耗墙”导致了多核的出现,下一步,“带宽墙”会带来什么变革呢?/ |! K+ m: N$ \0 z( m
7 D9 o% k0 o# L1 Z7 I3》,汽车刚出现的时候,追求的是汽车能跑的快,试想,如果汽车还不如马车跑得快的话,还买汽车啊。但是你看现在,追求的是油耗,是跑100公里耗几个油儿。这,就是时代的进步。
1 }) H" W1 t# M+ ^' \+ j& b6 J& Z4 r9 X6 m
4》还要记住一点,就是principle of entropy increase。即熵增加原理,在孤立系统中,一切不可逆过程必然朝着熵增加的方向进行。熵是什么呢,就是体系的混乱程度。计算机的工作的本质,就是把无序的事情变得有序。
, H& | l! T. p6 ~6 v w) W# F6 {8 l0 Z! h+ K( J/ z1 L
# D, o+ f% k0 p/ S P
计算机体系结构
' r: P n1 Y5 { ?- l2 c Q7 I7 T5 a( }% B" N8 {
反过头去看一下冯诺依曼体系结构,
0 n* b) t, o' K; o1 B+ O. @+ Q
! j- i0 p) a( J/ v3 J% K: u/ h$ T1》刚开始,要想让计算机运行的更快,就是要给CPU提供足够的操作和数据,为了提供操作(指令)就引进了转移预测技术,为了提供数据就引进了cache技术,为了提高执行速度," [2 a- I* ]6 S- d# y3 V$ U8 e
' Y) {$ N! U- ~8 J) M, f$ x, `
2》就有了流水线,有了流水线就有了流水线遇险(hazard)的问题,包括(RAW,WAR,WAW),
. A! S( ]. P5 M' p1 p$ h$ ~
4 O% e1 x2 e# Z! c2 w1 O8 q3》为了解决RAW,就引入了直通(bypass)技术,
8 h1 A5 [0 T5 ~5 r/ s6 k+ R$ |: L
4》为了解决WAR和WAW,就引入了乱序执行技术,即保留站技术(tomasulo),寄存器重命名(renaming)技术,% D: b9 b8 R2 c" O# f# @$ }
( L# a1 u1 |' [# H- Q7 j* w, e5》但是乱序执行就使异常不精确(精确异常,就是异常产生时要保证,产生异常的这条指令前面的指令都执行完毕,后面的指令都没有执行,这样,异常返回后知道从哪开始执行),0 j6 ]2 |: @; m! [. W! Z) I
4 @1 }% H3 v0 g, `- `6》为了实现精确异常,就引进了重排序缓存技术(ROB:reorder buffer),
" a: |4 v' S, ?5 Z/ G/ k- O* v+ r# y, g8 Z; j7 n. V! b( u
自此,纵观一下,体系结构的工作就是,顺序进入,乱序执行,有序提交,这样一个过程。. U. }* m; c# [
$ R9 B2 x7 m. }' `6 l9 q% u
: L7 ~+ f0 V0 h: T; h6 b即使这样,人类还不满足,于是再增加流水线的条数,即超标量,: c; q8 n2 I" Q" m$ W R
( o. k: e+ d: w% U7 {
把流水线的级数增加以提高工作平率,即超流水线。6 p: P$ U% T4 n& h
% w, ~* x3 |0 k8 b$ P/ N' ^4 }
以上这些,归于5个字:指令集并行(ILP)。
% q+ D o1 V/ C$ i- ]( b+ J& F5 i& ]' Z0 q/ |
所以人们又开发线程级并行技术,进程级并行。所以就有了多核的CPU。当然,事情还不只这些,暗硅(dark silicon)问题,工作电压接近晶体管阈值,集成度造成的功耗问题,等等等等这些,人们就相出了很多办法,单个CPU咱们进一步有困难,咱们就把多个CPU放在一块,咱们就搞ASIC,搞FPGA,搞CPU和ASIC的混合物(heterogeneous architecture)。
1 X' y8 j: h* i
9 Q* d- N" L$ M. D3 H6 @# F
% K) b, s' X8 p一个小故事
X" x) w2 a4 {' t* N5 R8 G
3 h* X* x4 K |5 O$ C上面包含了很多概念,下面就通过我的一个小故事来说明一些概念的意思。" d4 u! y# n; U9 p# D9 o/ s5 E
l9 ^/ \, x5 z6 a8 W! x
上周末,我和我的媳妇,我的一个朋友和他的媳妇,我们四个人从老家出发一起来北京,我们共开了2辆车,我朋友的车是奔驰,我的车是帝豪(跟奔驰没法比)。我们4人2车就上路了,故事也就开始了:4 \! C$ j3 ^4 U4 M) i
7 n# F3 a, t6 }) m- U# P由于我们家是农村的,所以农村的路都是单行道,没法超车,我的车在前面,跑的很慢,后面的车再好也没办法,只能在屁股后面跟着,(静态流水线)。4 j ~/ B; V6 n: c
5 p: s1 M2 q6 A* E- t
过了一会,有一个北京的同学(小武)给我打电话说上星期借我的那本《HeadFirst》看完了,说等我回北京后在还给我,我说行,这时我媳妇说,”小峰不是说要借这本书看吗,直接让小武把书给小峰不就得了吗,真是的,这么费劲,这样的话就不用等你回北京,然后小武把书给你,你再给小峰,多麻烦啊,还省得小峰等的着急“(直通技术)。4 _$ v' k, j+ a0 o, W
6 z0 v: J/ [9 e. Y3 k, n终于,路变得宽了一些,,这时,我就把车开到了靠路边的地方(保留站),% i. @: G+ n8 A! c: Z
5 ?5 s# N7 u3 r( E3 v$ y
奔驰不用再等我这辆小破车了,呜。。。一下子就跑到了我前面(动态流水线乱序执行),
+ r* _4 a% [- H; c! C; f+ i) }: E% F: r* b1 [1 e$ K. i
终于,上高速了,车道一下子变成了4个(多发射或超标量),
- \) O5 d3 x9 L: l
) ]: p/ W1 q* g7 h5 S3 y0 J后来我们出了收费站,到了北京,马路多了很多条,有很多路线都可以到我住的那个地方(多核),
. H- }5 [9 a( a0 c% ?; Y* q& a" i3 y0 k' |; P+ G+ T; x
最后我们四个人到了我们家,我们家的大门口比较小,依次只能通过一个人,于是我们按照我们刚出老家的顺序,进入了我们家。(ROB)' E! m+ A; H. v, M" Y
9 l. L% \# `7 a; b9 c6 M3 b! x
到此为止,好了,有些地方可能不是太准确,请见谅。
. r( X! X+ R% |& ~" b4 L/ y0 @0 t( l2 f
. ^- u. S+ }, S0 j3 `) f1 [5 _
附:2 l# P$ p4 v# K' b& b7 m# h- u _
; O b8 `6 C) T( }$ |* N1 I
上面这些内容都是给CPU提供足够的粮食来喂饱饥饿的CPU,当然也不能忽略CPU的本质,就是计算。虽然计算模块在现在CPU的面积比例已经很少(20%左右),还是提一下吧,加法器,乘法器。乘法器的实现,是运用Booth算法,和华莱士树将两个数的相乘,变成两个数的相加来实现的。
2 n4 ~) F- y! f, }+ x5 y
0 k. {7 \! {* A0 K小结1 ~6 t1 f3 q8 U; }# }
% ?* d9 w- }5 |1 a" t' l书上学来终觉浅,绝知此事要躬行。最后以龙芯的框图来结束本文吧。. d4 K* x. O9 o2 | `
- Z F( a5 Y6 O9 B& z
. e$ T) U4 p, J4 t$ p4 i% U6 ^7 n8 J$ o" ~+ g9 o9 J$ l( Q
* q3 m* G7 G# t4 b8 A9 X9 S- I5 ~& z
|
|