首先,我们来看看CPU是怎样处理一个指令的,比如一个“A+B”的指令,CPU要执行这条指令,先得知道A和B在什么地方,要对这些数值进行什么样的操作,然后编译成机器语言,接着执行命令,最后把这些储存起来。
现在,我们简单地模拟处理器完成一条指令要做的工作。要处理一条指令,处理器必须:
1,提取数据;
2,编译成机器语言;
3,执行指令;
4,储存数据;
OK,接着我们来看看流水线,为什么要流水线呢?我们先来看看没有流水线的CPU。
无流水线处理器
┌────────────────────────────────┐
│ 提取 译码 执行 存储 │
└────────────────────────────────┘
├──────────── 1 个时钟周期 -────────────┤
├──────────── △T = 1秒 -────────────┤
我们可以看出CPU只有一个阶段,指令被逐步提取,编译,执行,存储。这就是说,我们上面的这个CPU能在一个时钟周期内做所有的事情(提取、编译、执行、存储)。我们设这个CPU的工作频率是1Hz,也就是每秒钟执行1条指令。当然如果有10秒钟,那就是:10 秒 X (1 时钟周期/1 秒) X (1 指令/1 时钟周期) = 10 指令。
现在,我们开始探讨流水线。流水线能够提升时钟频率和整体性能(记住,更快的时钟频率并不能直接转化成更快的性能)。
但是如何提高时钟频率呢?一个是用物理方法提高CPU完成指令的速度。另一个就是… 我们先来看看下面两张图。
两段流水线CPU
┌───────────────┬───────────────┐
│ 提取 译码 │ 执行 存储 │
└───────────────┴───────────────┘
├─── 1 个时钟周期 ────┤
├──────────── △T = 1秒 ────────────┤
四-段流水线CPU
┌───────┬────────┬────────┬────────┐
│ 提取 │ 译码 │ 执行 │ 存储 │
└───────┴────────┴────────┴────────┘
├ 1个时钟周期 ┤
├──────────── △T = 1秒 -──────────────┤
细心的朋友很快就发现了,既然不能在同一个周期内做很多事情,那就分几个周期来做嘛!而每个周期的时间可以由触发信号来决定的(晶振体),这个我们可以很容易的提高,而在0.25秒内完成一个步骤,也没有达到物理的极限。
这个四-段流水线CPU现在就是工作在4Hz的频率下了,可是速度提高了吗?我们来看看:
10 秒 X (4 时钟周期/1 秒) X (0.25 指令/1 时钟周期) = 10 指令
这个和那个1Hz无流水线的CPU一样10秒钟只能执行10条指令。但我们可以在包装盒上写上“4 Hz”而不是“1 Hz”。很不幸,数字是一个卖点。给一个电脑盲出示一个 4 Hz 的处理器和一个 1 Hz 的处理器,他将认为 4 Hz 的那一个更快,即使事实并非如此。
可是既然不能提高速度,我们又费那么大的劲干什么呢?嘿嘿,重点来了…
我们先来了解下流水线的工作方式,首先接受一条指令,做‘提取’这个步骤,做完后把他交给‘译码’来做,接着下个周期就继续提取下条指令,这时候CPU就是同时在做第一条指令的‘译码’和第二条指令的‘提取’,到了第三个周期,CPU就是同时在做第一条指令的‘执行’,第二条指令的‘译码’以及第三条指令的‘提取’…以此类推…
现在有没有发现上面那个公式有点问题?当经过1秒钟以后,也就是4个周期以后,CPU就会每个周期完成一个指令,就是就0.25秒完成一个。哈哈哈,也就是说,10秒以后CPU完成了37条指令,要比10条指令多得多。
[1] [2]
可是在另一方面,完成一条指令所需的时间都是1秒。
好了,解释完流水线,我们再来看看在实际的运用中的情况。
先说说游戏,游戏中的指令一般都是即时的,这时候就是需要的就是这个所完成的时间,而对于每秒完成几个指令的要求是不是那么高了。需要的就是SPEED…
而在多媒体运用中,数据是一帧一帧地读取的,这时候就需要有高频率,对于完成这个指令要多少时间就不是那么讲究了,只要够流畅就好了…
而在多任务方面,多任务就是同时有好几个指令等着执行,无流水线的那个CPU就必须要有1秒,一条指令才能到流水线中处理,而4段流水线的那个CPU就只需要0.25秒。
现在又有了另一个问题了,A64的流水线并没有增加,可是一样在多媒体和多任务方面也有很好的表现,这是为什么呢?
我认为有几个方面:
1, A64把内存控制器集成到CPU中去,使得‘提取’的延迟减少了。CPU要提取一个数据,就要先到内存中找,在送回到CPU,这中间通常都要好几个周期的时间,这时的CPU就是处于闲置状态,而如果减少了这其中的延迟,也就是减少了CPU闲置的时间,提高的速度。
2, A64提高了分支预测算法…等(其他的一些算法以及指令我并没有具体的资料,在这也不好做说明)的效率。
我们来了解下分支预测,我们在做‘执行’这个步骤时就需要有‘提取’和‘译码’这两个步骤的结果,这时如果预测下下前两步的结果,用这个结果做‘执行’,就能提高效率,但如果算错了,就得重新来了,降低了效率。这时就需要很好的算法。
有了这两方面的支持(应该还会有其他方面的原因),使得A64的CPU的性能才有今日的成就。
(出处:http://www.sheup.com)
[1] [2]