我正在努力了解管道中危险的基本概念。我知道管道是如何实施的,但我不确定这些危害会如何影响管道的效率。
我在网上看过它,但由于解释它们的语言复杂性,我无法理解它。任何人都可以用更简单的术语解释它们吗?
示例:分支行为的影响? (找不到一个简单的解释,附图说明危险是如何起作用的)
答案 0 :(得分:2)
我不认为它有很多东西。想想流水线是什么或意味着什么或它如何使事情更快/更好。它就像制造工厂的装配线。而不是只有一个地方建造整个汽车,你必须将工具和材料移动到汽车,并移动其他工具,让你的车移动通过工厂。一路上的每一步都完成了。
分支问题很简单。假设管道中有12条指令,有些分支在管道末端或末端附近不会被确定。如果分支被占用,那么你在管道中有一堆无法执行的指令,你必须丢弃它们。您使用分支目标重新启动管道,并且必须等待多个指令周期才能使管道恢复到完全运行。
有很多方法可以解决这个问题,有些方法有分支阴影,无论如何都会在分支后执行指令。其他是分支预测,猜测分支目的地可能是什么,并独立从那些备用路径中获取一些指令,如延迟槽,您可能会节省几个周期,但是如果/因为您的管道从一代传到下一代(没有指令集更改匹配)你仍然必须基本上冲洗管道。
I / O是我们最大的问题,现在不是cpu,当cpu是瓶颈时,发明了管道来解决问题。例如,分支预测,导致随机查看获取周期使I / O问题变得更糟......Simon提供的维基百科链接也谈到了其他的危害,比如写之前的读取。如果源代码说要写一个位置,那么在写完之后再读回来,这就是代码需要发生的事情。如果硬件的编译器和体系结构导致不按照它编写的方式发生,则软件可能崩溃/失败。问题可能来自并行执行,如果读取和写入被分成不同的执行单元并且读取执行单元中的内容较少或者执行单元执行读取之前执行读取,则存在问题。这可以很容易地发生在cpu核心之外,但也可以在内存或缓存系统中发生。读取和写入可以在存储器控制器内的单独路径上,一个引起高速缓存行读取,另一个在写入缓冲器中找到行的末尾,并且可以首先发生读取。写入通常是火和忘记,这里是地址,这里是数据,信使接收消息,你就完成了。就像在FedEx上放下一个包裹一样,这里是带有地址的盒子,我的部分已经完成,但盒子真的没有送达好几天。读取你必须等待结果返回,这可能是,对于执行单元,它在cpu或内存控制器中显着更长。这一切都必须在系统级别进行管理,你可以解决并行cpu中的read before write问题只是为了让你绑定它的内存系统不能按预期工作,只是因为写入指令在内存系统之前就已经到了读你觉得你赢了这场战斗。这就是为什么像延迟插槽这样的解决方案通常最终会被填充为nops。 (系统工程涉及编程语言和人类编写代码需要包括人类及其做事方式)。
这些危害,特别是维基百科链接所描述的
http://en.wikipedia.org/wiki/Hazard_(computer_architecture)
用于提高吞吐量的流水线操作无法在输出上提供正确的产品。
假设您的管道是汽车,沿着装配线的每一步都会将一件事放在汽车上,比如挡风玻璃或轮子或发动机与底盘配合等等。我们现在有几十年的“及时”供应和在这条装配线上。但是在某些国家发生的自然灾害会影响到世界上蓝色涂料的供应,而生产用于生产汽车的装配线的门的装配线已经用完了蓝色的门。你怎么处理蓝线车?与在读取周期中获取数据中止不同,您必须停止管道,调用中止处理程序并能够从受影响的指令或随后的指令返回执行。
无论您怎么想都会导致管道设计无法正常工作,这是管道危险。是的,我同意内存系统中导致系统级故障的事情不是管道故障而不是管道危险。与将指令置于错误位置/顺序的编译器错误相同也不是管道错误。系统故障,而不是管道故障。