POPPUR爱换

 找回密码
 注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

搜索
查看: 7211|回复: 27
打印 上一主题 下一主题

流水线的几点疑惑

   关闭 [复制链接]
跳转到指定楼层
1#
发表于 2009-6-13 11:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
向各位达人请教一下

1 流水线的长度是什么意思啊。。。。。

2 为什么流水线过长反而会影响性能呢?

3 内部的工作频率是指发射指令的频率吗?越高的工作频率是不是需要更多的流水线来进行并行处理?
2#
发表于 2009-6-13 18:17 | 只看该作者
本帖最后由 ic.expert 于 2009-6-13 18:31 编辑


流水线,亦称管线,是现代计算机处理器[/url]中必不可少的部分,是指将计算机指令处理过程拆分为多个步骤,并通过多个硬件处理单元并行执行来加快指令执行速度。其具体执行过程类似工厂中的流水线,并因此得名。

如果作出类比,则计算机指令就是流水线传送带上的产品,各个硬件处理单元就是流水线旁的工人。

在使用流水线的处理器中一个指令不是在处理器的一个定时器讯号[/url]中完成的,而是被分到多个讯号中去完成,但是与此同时多个指令的分任务被同时处理。由于这些分任务比整个指令要简单,因此可以通过使用流水线提高定时器频率。虽然每个指令需要多个讯号后才能完成,但是通过多个指令的并行运算每个讯号内一个指令可以完成,因此通过这个方法整个速度可以提高。

一条流水线的每个分步骤被称为流水线级。它们被流水线寄存器分开。除指令流水线外在现代系统中还有其它流水线,比如用来计算浮点数的算术流水线。




计时器信号
一个级越简单,处理它的频率就可以越高。在现代的秭赫中央处理器中一个指令流水线可以长于30级。核节是一个指令每个流水线级所需要的时间。在一个k级流水线中每个指令由k个级组成,每个级需要k个信号数来完成。由于在每个信号里一个新指令开始执行,因此在理想状态下在每个信号中也应该有一个指令完成,离开流水线。

每个节由流水线的周期决定,它由所有级持续时间τi中的最大级持续时间τm和一个附加时间d的和组成。这个其中附加时间是因为把每个级的结果存到流水线寄存器中去导致的。





效率
提高通过流水线指令完成的总速度提高。设周期时间为τ,完成nk级指令总时间为:
总时间为

一开始流水线是空的,在步中被充满。每级后一个新的指令被调入流水线,而另一个指令完成。因此剩下的指令在步后完成。

将使用流水线的指令运行时间除以没有流水线的指令运行时间获得的差代表着流水线带来的加速:



假如在流水线中总是有足够的指令等待执行的话,则在n趋向无穷大时:



也就是说随着级数k的提高加速可以无限地提高。但是一个指令无法被分成无限多个级。此外级数的提高也会导致数据和指令冲突的严重性提高,硬件的复杂性也随之提高。


冲突
假如一个指令在执行的时候需要等待流水线上早前的一个指令首先执行完毕的话那么这两个指令相互之间有依赖关系。这可能导致流水冲突。以下三种冲突情况可能出现:

  • 资源冲突:假如流水线上的一个指令需要使用一个已经被另一个指令占据的资源
  • 数据冲突
    • 指令层的数据冲突:一个指令需要的数据还没有计算出来
    • 传输层的数据冲突:一个指令需要的寄存器内容还没有被调入寄存器
  • 控制流冲突:流水线必须等待一个有条件Goto指令是否会被执行。

这些冲突导致相应的指令必须在流水线的开始等候,这会在流水线上导致空缺。这样的话流水线就不能理想运行,其加速下降。因此要尽量避免这样的冲突:

通过增加功能单位可以解决资源冲突。通过把流水线后面的计算结果立刻向前传可以避免许多数据冲突。

通过分支预测器可以避免控制冲突。在这里处理器预测性地继续运算,直到正式预测是正确为止。假如预测错误的话那么在其中已经执行的指令要被推翻。尤其流水线非常长的处理器(比如英特尔的奔腾4或者IBM的PowerPC)在这种情况下要浪费许多时间。因此这些处理器拥有非常高级的与分支预测技术,只有百分之一的分支预测会发生错误,其流水线需要清楚。


优缺点
长流水线的优点在于它能够大大地提高处理器速度。缺点在于许多指令被同时执行。假如分支预测错误的话整个流水线上所有的指令全部要被取消,流水线要被重新充满。这需要从内存或者中央处理器缓存中调用指令,导致延迟时间,在这段时间里处理器没有工作。

NetBurst架构管线一开始有20级、而后增加至31级,放大其缺点;其后继者Intel Core微处理器架构就减少管线级数。
回复 支持 反对

使用道具 举报

3#
发表于 2009-6-13 18:43 | 只看该作者
以后建议多多wiki  ,答案垂手可得~~
:〉
回复 支持 反对

使用道具 举报

4#
 楼主| 发表于 2009-6-13 22:54 | 只看该作者
饿。。。wiki里面不少东西都是E文的。。。
回复 支持 反对

使用道具 举报

5#
发表于 2009-6-16 23:01 | 只看该作者
zh.wikipedia.org
回复 支持 反对

使用道具 举报

6#
发表于 2009-6-18 22:24 | 只看该作者
i 不明
回复 支持 反对

使用道具 举报

7#
发表于 2009-6-19 01:56 | 只看该作者
向各位达人请教一下

1 流水线的长度是什么意思啊。。。。。

2 为什么流水线过长反而会影响性能呢?

3 内部的工作频率是指发射指令的频率吗?越高的工作频率是不是需要更多的流水线来进行并行处理?
跳海自殺的鱼 发表于 2009-6-13 11:16


1. 简单来说,流水线的长度就是指流水线的级数(静态)。由于指令执行是需要若干步骤组成的,每做完一步需要一定的时间。而处理器频率越来越高,因此在一个时钟周期内(1/频率)不可能完成整条指令执行所需要的全部工作。因此就把处理器的数据通路分成若干级,这些级前后串联起来,由统一的时钟信号控制,每一级只完成指令的一小部分工作,共同完成指令的执行过程。而对于每一级流水线而言,在处理完前一条指令的工作后可以立即处理下一条指令,这样子就提高了处理器整个的工作效率。

   如果还不明白,就看下面一个比方:如果有一家生产罐头的工厂,里面的生产线在任意时刻都只能只能生成一个罐头,只有在前一个罐头完成水果的清洗、削皮、蒸煮、消毒、灌装、封盖....以后,下一个罐头才能开始生产,你是不是会觉得很荒谬?所以呢,生产线要流水起来,每一个部分只做一点点事情,前一个罐头在封盖的时候,后一个罐头需要在灌装,等等。这样子效率不就提升了么?

2. 处理器的频率只取决于工作最慢的那一个流水级,即所谓木桶理论。在理想情况下,流水级的快慢只取决于这一个流水级本身所做的事情。但是实际情况下并非如此:读出上一级流水的数据需要时间(clock-to-Q);流水级产生的结果需要被保存,而保存也需要一定的时间(setup time);同时时钟信号也不是完美的,往往会有偏差(clock skew,jitter),这些因素不可避免的存在。

    理解了这些,我们再来看一个流水线的频率和性能问题好了。假设平均一条指令执行需要10ns,clock-to-Q=0.2ns,setup time=0.3ns,clock skew+jitter=0.2ns。在流水线有十级的情况下,时钟周期为10/10+(0.2+0.3+0.2)=1.7ns。如果将流水级划分为20级,时钟周期为10/20+(0.2+0.3+0.2)=1.2ns,频率提升不到一倍。而且不管流水线划分得再细,时钟周期不可能小于0.2+0.3+0.2=0.7ns。

    但是可怕的在后面。由于程序中包含很多分支指令(相当于走岔路口)。分支指令在没有得出结果前,选择任何一个分支执行下去都可能是错的。处理器为了提升整体的效率,一般都会猜一个分支(分支预测)去执行(投机)。流水级增加了,越来越多的指令同时存在于流水线中。这时如果前面有一条分支指令猜错了(走错了路),那么必须后面几十上百条指令都会被清空(回去重新再走)。这就使得流水线的性能可能不但没提升,反而会下降。

3. 工作频率是指流水级中最慢的那一级的频率(由于流水线只用一个时钟信号控制,所以最慢的一级决定的所有流水级的频率)。高频率意味着流水级的长度增加(我们暂且不理会制程改进等等)。更多的流水线?我猜你是想问更多的发射部件之类的,这叫做流水线的宽度。宽度与长度之间没有必然联系。
回复 支持 反对

使用道具 举报

8#
 楼主| 发表于 2009-6-19 12:33 | 只看该作者
感谢ls的解答
回复 支持 反对

使用道具 举报

9#
 楼主| 发表于 2009-6-19 22:46 | 只看该作者
7# vivalinux

大大可以继续深入讲解一些流水线的宽度吗?
回复 支持 反对

使用道具 举报

10#
发表于 2009-6-20 00:11 | 只看该作者
很好,学习中
回复 支持 反对

使用道具 举报

11#
发表于 2009-6-21 01:04 | 只看该作者
流水线啊,GPU的pipeline几百级哦~~
越长越受损失,那是因为需要分支预测
所以CPU就不能太长,但是GPU这种东西。。就不怕了
回复 支持 反对

使用道具 举报

12#
发表于 2009-6-22 13:06 | 只看该作者
谁说的GPU的pipeline几百级,orz......
回复 支持 反对

使用道具 举报

13#
发表于 2009-6-22 13:07 | 只看该作者
7# vivalinux

大大可以继续深入讲解一些流水线的宽度吗?
跳海自殺的鱼 发表于 2009-6-19 22:46


这个东西要讲起来太长了....有一本入门的书:超标量处理器设计基础,书不算厚,有精力可以去看看,呵呵。
回复 支持 反对

使用道具 举报

14#
发表于 2009-6-22 13:15 | 只看该作者
如果从 input 开始算,几百级并不奇怪,但是如果是指 shader core,可能也就是 20 级的规模,例如 CUDA Programming Guide 里提到"The delays introduced by read-after-write dependencies can be ignored as soon as there are at least 192 active threads per multiprocessor to hide them.",这样的话,SIMD 的 pipeline 应该可以看作是 24 个 stage。
回复 支持 反对

使用道具 举报

15#
发表于 2009-6-23 13:58 | 只看该作者
如果从 input 开始算,几百级并不奇怪,但是如果是指 shader core,可能也就是 20 级的规模,例如 CUDA Programming Guide 里提到"The delays introduced by read-after-write dependencies can be ignored as soon  ...
Edison 发表于 2009-6-22 13:15


流水线的级数和延迟周期数还是两个概念吧?
回复 支持 反对

使用道具 举报

16#
发表于 2009-6-23 15:33 | 只看该作者
如果是复杂的指令,经过的 stage 当然可能会更长。
回复 支持 反对

使用道具 举报

17#
发表于 2009-6-25 12:27 | 只看该作者
呃,各位回答的好详细
回复 支持 反对

使用道具 举报

18#
 楼主| 发表于 2009-6-26 21:28 | 只看该作者
再请教一下,co-issue 技术是如何实现的呢?嘿嘿
回复 支持 反对

使用道具 举报

19#
发表于 2009-6-26 21:49 | 只看该作者
Co-Issue 就是指运算单元必须在某种特定的指令组合情况下能实现同时执行两条指令,这里的 issue 有时候是真的具备双发射端口,有时候是借助某个指令执行时间较长的空隙,发射端口发送另一条指令给一个空闲的执行单元,从执行效果看就好像是同时执行两条指令,但是这样的情况是有配对限制的。
回复 支持 反对

使用道具 举报

20#
 楼主| 发表于 2009-6-26 22:23 | 只看该作者
19# Edison


哦,那E大,我们通常说的并行运算是不是和这个类似呢?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

广告投放或合作|网站地图|处罚通告|

GMT+8, 2025-8-29 06:58

Powered by Discuz! X3.4

© 2001-2017 POPPUR.

快速回复 返回顶部 返回列表