【问题标题】:What are the common Pipeline hazards of Pipelines?管道常见的管道危害有哪些?
【发布时间】:2012-01-02 11:49:05
【问题描述】:

我正在尝试了解管道中危害的基本概念。我知道管道是如何实现的,但我不确定这些危害如何影响管道的效率。

我在网上阅读过它,但由于解释它们的语言复杂性,我无法真正理解它。谁能用更简单的术语解释一下?

示例:分支行为的影响? (找不到一个简单的解释说明危险如何工作的图表)

【问题讨论】:

  • 你为什么在乎?您是否正在尝试手动优化 ARM asm 代码?或者编写一个编译器后端,也许?如果您解释了您的动机,它可能会帮助您获得更具体的答案。
  • 只是想了解流水线的基本概念。 -- 我已经编辑了我的问题以使其更清楚。
  • 关于危害的Wikipedia article 相当不错。
  • 我最近刚开始提供链接而不是内容。那(没有内容的链接)在 SO 是不受欢迎的。
  • @dwelch:链接适用于 cmets

标签: arm pipeline


【解决方案1】:

我认为这没什么。想想流水线是什么或意味着什么,或者它如何让事情变得更快/更好。它就像制造工厂的装配线。而不是在一个地方建造整辆汽车,您必须将工具和材料移到汽车上,并将其他工具移开,以免汽车在工厂中移动。一路走来的每一步都是一件小事。

分支问题很简单。假设管道中有 12 条指令,一些分支直到管道末端或接近末端才会确定。如果分支被采用,那么您在管道中有一堆指令无法执行,您必须丢弃它们。您使用分支目标重新启动管道,您必须等待多个指令周期才能使管道恢复完全运行。

并且已经有很多方法可以解决这个问题,有些方法有分支阴影,无论如何都会在分支之后执行的指令。其他是分支预测,猜测分支目标可能是什么,并从这些备用路径(如延迟槽)独立获取一些指令,您可能会节省几个周期,但如果/随着您的管道从一代到下一代变得更长(没有指令集更改以匹配)您仍然必须基本上冲洗管道。

I/O 现在不是 cpu 是我们最大的问题,当 cpu 是瓶颈时,管道被发明出来解决问题。例如分支预测,导致看起来随机的获取周期使 I/O 问题变得更糟而不是更好......

Simon 提供的维基百科链接还谈到了其他危害,例如先读后写。如果源代码说要写一个位置,那么在写回它之后,这就是代码需要发生的事情。如果硬件的编译器和架构等导致这种情况不会发生,那么软件可能会崩溃/失败。问题可能来自并行执行,如果读取和写入被分成不同的执行单元,并且读取执行单元中的内容较少,或者在执行单元发生写入之前执行读取,则存在您的问题。这可以很容易地发生在 cpu 内核之外,但也可以发生在内存或缓存系统中。读取和写入可以在内存控制器中的不同路径上,一条导致读取高速缓存行,另一条在写入缓冲区中找到进入行尾的路径,并且读取可以首先发生。写入通常是一劳永逸的,这里是地址,这里是数据,信使收到消息,你就完成了。就像在 FedEx 投递包裹一样,这是带有地址的盒子,我的工作已经完成,但盒子真的好几天都没有送达。您必须等待结果返回的读取,对于执行单元而言,无论是在 cpu 中还是在内存控制器中,这可能会显着延长。这一切都必须在系统级别进行管理,您可能会在并行 cpu 中解决 read before write 问题,只是让您绑定它的内存系统无法按预期工作,只是因为写指令在执行之前命中了内存系统阅读你认为你已经赢得了这场战斗。这就是为什么像 defer slot 这样的解决方案经常会被 nop 填满。 (涉及编程语言和人类编写代码的系统工程需要包括人类及其做事方式)。

这些危险,尤其是维基百科链接所描述的

http://en.wikipedia.org/wiki/Hazard_(computer_architecture)

用于提高吞吐量的流水线无法在输出端交付正确产品的情况。

假设您的管道是汽车,装配线上的每一步都会在汽车上放置一个东西,比如挡风玻璃或车轮或与底盘匹配的发动机等。我们现在有数十年的“及时”供应和在这条装配线上。但是在某个国家发生了一场自然灾害,影响了向世界供应蓝色油漆,而生产汽车的装配线的门的装配线已经用完了蓝色门。你怎么处理排队的蓝色汽车?与在读取周期中中止数据不同,您必须停止管道、调用中止处理程序并能够从受影响的指令或后面的指令开始返回执行。

无论您能想到的真正导致管道设计无法工作的情况,都是管道危害。是的,我同意内存系统中导致系统级故障的某些东西不是管道故障,也不是管道危险。与将指令放在错误位置/顺序的编译器错误相同,也不是管道错误。系统故障,而不是管道故障。

【讨论】:

  • 就“common”这个词而言,对于带有管道的 CPU,分支可能是唯一常见的分支。然后你会遇到设计特定的问题,多个执行单元或并行执行,无论你想怎么称呼它,都会导致乱序执行以及在单个 cpu 上的单个管道上看不到的其他事情(常见情况)。导致新危害的解决方案也可能是特定于该设计的,并非对所有设计都通用。
  • 我在这里收到的最好的答案之一。非常感谢您提供的这个非常丰富的答案!!!!!!
  • 我本可以写得更好,但无论哪种方式都感谢您的称赞...转发...自己回答问题并保持堆栈溢出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-21
  • 1970-01-01
  • 2011-11-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多