问题标签 [cpu-hazard]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
pipeline - 争论某种情况是否会导致数据危害
我正在阅读Hamacher 等人的Computer Organization [5e]文本中的流水线部分。人。. 在那里,我遇到了作者声称会导致数据危害的情况。
情况如下图所示:
例如,
E
图 8.2b 的四级流水线中的 stage 负责算术和逻辑运算,并为此任务分配一个时钟周期。尽管这对于大多数操作可能已经足够,但某些操作(例如除法)可能需要更多时间才能完成。图 8.3 显示了一个示例,其中指令中指定的操作I2
需要三个周期才能完成,从周期4
到周期6
。因此,在周期5
和6
中,写入阶段必须被告知什么都不做,因为它没有数据可以使用。†:同时,缓冲区中的信息B2
必须保持完整,直到执行阶段完成其操作。这意味着舞台2
,反过来,舞台1
被阻止接受新指令,因为其中的信息B1
不能被覆盖。因此,步骤D4
和F5
必须推迟,如图所示。...任何导致管道停止的情况都称为危险。我们刚刚看到了一个数据危害的例子。数据危险是指指令的源操作数或目标操作数在流水线中预期的时间不可用的任何情况。
在上面的示例中,作者假设发生了数据危险,并且在管道中引入了两个停顿周期。他们给出这种数据危险的主要原因是,由于执行阶段需要2
比通常需要的指令更多的周期2
,因此回写阶段应该工作的数据必须等待2
周期......
但我有点难以接受这种分析。通常,这些书籍会在存在数据依赖性(通常的 RAW、WAR 等)的情况下给出数据危害的示例。但是这里没有这样的事情。我认为这是一个结构性危险,假设 I2 不能使用 EX 阶段,因为 I1 正在使用它。
此外,文本假定缓冲区中没有阶段的结果排队。从标有 †, , 的语句中清除Meanwhile, the information in the buffer...
(这里也有一点缺陷,因为如果没有排队,那么D3
in cycle的输出4
将覆盖B2
EX 阶段正在其上工作的缓冲区中的值,这与他们自己的假设)。
我认为引入摊位是因为没有排队的情况……和结构性危险,如果事情如下图所示管理得当,就不会有摊位了。
这就是我的假设:
- 我假设执行阶段有多个单独的功能单元(例如,一个用于
1
执行指令计算的功能单元。[基本 ALU 需要 1 个周期持续时间],一个用于整数除法,另一个用于整数乘法等)[所以结构风险已消除现在的方式。] - 我还假设管道缓冲区可以将阶段中产生的结果存储在队列中。[因此,标有 † 的语句中的问题不再存在。]
话虽如此,现在的情况如下:
无论我多么努力地尝试这些假设,我都无法消除以蓝色显示的气泡。[即使假设在缓冲区中排队,缓冲区也不能给出乱序的结果,所以这些停顿仍然存在]。
通过我的这个练习,我觉得文中显示的示例确实是一个危险,而且也有数据危险(即使没有数据依赖关系?),因为在我的练习中没有结构危险的机会......
我对么?