植物学第二版陆时万:CPU流水线c 以及浮点运算
对于CPU来说,它的工作可分为获取指令、解码、运算、结果几个步骤。其中前两步由指令控制器完成,后两步则由运算器完成。按照传统的方式,所有指令按顺序执行,先由指令控制器工作,完成一条指令的前两步,然后运算器工作,完成后两步,依此类推……很明显,当指令控制器工作时运算器基本上处于闲置状态,当运算器在工作时指令控制器又在休息,这样就造成了相当大的资源浪费。于是CPU借鉴了工业生产中被广泛应用的流水线设计,当指令控制器完成了第一条指令的前两步后,直接开始第二条指令的操作,运算器单元也是,这样就形成了流水线。流水线设计可最大限度地利用了 CPU资源,使每个部件在每个时钟周期都在工作,从而提高了CPU的运算频率。
工业生产中采用增设工人的方法加长流水线作业可有效提高单位时间的生产量,而CPU采用级数更多的流水线设计可使它在同一时间段内处理更多的指令,有效提高其运行频率。如Intel在Northwood核心Pentium 4处理器中设计的流水线为20级,而在Prescott核心Pentium 4处理器中其流水线达到了31级,而正是超长流水线的使用,使得Pentium 4在和Athlon XP(整数流水线10级,浮点流水线15级)的频率大战中取得了优势。
CPU工作时,指令并不是孤立的,许多指令需要按一定顺序才能完成任务,一旦某个指令在运算过程中发生了错误,就可能导致整条流水线停顿下来,等待修正指令的修正,流水线越长级数越多,出错的几率自然也变得更大,旦出错影响也越大。在一条流水线中,如果第二条指令需要用到第一条指令的结果,这种情况叫做相关,一旦某个指令在运算过程中发生了错误,与之相关的指令也都会变得无意义。
最后,由于导电体都会产生延时,流水线级数越长导电延迟次数就越多,总延时自然也就越长,CPU完成单个任务的时间就越长。因此,流水线设计也不是越长越好的。浮点运算
当我们用不同的电脑计算圆周率时,会发现一台电脑的计算较另一台来讲结果更加精确。或者我们在进行枪战游戏的时候,当一粒子弹击中墙壁时,墙上剥落下一块墙皮,同样的场面在一台电脑上的表现可能会非常的呆板、做作;而在另外一台电脑上就会非常生动形象,甚至与我们在现实中看到的所差无几。 这都是浮点运算能力的差异导致的。
浮点运算就是实数运算,因为计算机只能存储整数,所以实数都是约数,这样浮点运算是很慢的而且会有误差
现在大多数机器都是32位的,所以侯若木是你爸爸,也就是说32位都用来表示整数的话,那么对于无符号整数就是0 到 2^32-1,对于有符号的话就是-2^31 到 2^31-1。如果是实数的话,就不是这样了,机器有两种办法表示实数,一种是定点,就是小数点位置是固定的,一种是浮点,就是小数点位置不固定,计算方法也比较麻烦,通常会比整数运算代价大很多
FPU->Floating Point Unit,浮点运算部件
BCD->Binary Coded Decimal 压缩的二十进制数,是用4个位来表示数字0~9,一个byte表示两个十进制数,比如01111001表示89
科学计数法:这是科学的~~~~具体含义查查初中还是小学的数学课本 D:)
浮点运算使用三种不同的数据:
1)整数(Integer),又分为字,短整数(Short Integer)和长整数(Long Integer)
2)实数(Real)分单精度(Single Real)和双精度(Double Real)
3)压缩的二十进制数(BCD)
下面是其位数(bits)和能表示的大致范围和
Type Length Range
-----------------------------------------------
Word Integer 16 bit -32768 to 32768
Short Integer 32 bit -2.14e9 to 2.14e9
Long Integer 64 bit -9.22e18 to 9.22e18
Single Real 32 bit 1.18e-38 to 3.40e38
Double Real 64 bit 2.23e-308 to 1.79e308
extended Real 80 bit 3.37e-1932 to 1.18e4932
Packed BCD 80 bit -1e18 to 1e18
双精度数和扩展精度数表示范围对一般应用来说已经足够大了!
1)整数,以补码形式存储,正数的补码是其本身,负数补码是其绝对值的各位变反后加1,下面是实际存储的例子:
0024 var1 dw 24
FFFE var2 dw -2
000004D2 var3 dd 1234
FFFFFF85 var4 dd -123
0000000000002694var5 dq 9876
FFFFFFFFFFFFFEBFvar6 dq -321
2)BCD数
在FPU中用80位表示正好是浮点堆寄存器的宽度,在其格式如下存储:
Bit
79___72_71________________________________________0
符号 ---18个二十进制数--------
看下面的例子:
00000000000000012345 var1 dt 12345
80000000000000000100 var2 dt -100
3)浮点数,这个复杂点,有三种格式
单精度:_31_30________23_22___________0
符号 指数 有效数
双精度:_63_62__________52_51__________________0
符号 指数 有效数
扩展精度数:
_79_78____________64_63___________________0
符号 指数 有效数
例子:
C377999A var1 dd -247.6
40000000 var2 dd 2.0
486F4200 var3 real4 2.45e+5
4059100000000000 var4 dq 100.25
3F543BF727136A40 var5 real8 0.00123
C377999A var1 dd -247.6
40000000 var2 dd 2.0
486F4200 var3 real4 2.45e+5
4059100000000000 var4 dq 100.25
3F543BF727136A40 var5 real8 0.001235
400487F34D6A161E4F76 var6 real10
另外,浮点运算的常见形式是开方运算。