|
xbitlabs 经过数月的研究写成的报告
Prescott: The Last of the Mohicans? (Pentium 4: from Willamette to Prescott)
里面介绍了 P4 NetBurst 鲜为人知的架构秘密: Replay Queue
前两天用了 5 个小时慢慢的看了上下两篇文章,看完以后让人心里发毛....
P4 L1 miss 以后竟然会执行出错误计算结果,然后指令进入 Replay Queue 被重新执行一遍
这就是 P4 架构效率低下的主要原因
简介(我对文章分析的理解):
P4 NetBurst 因为为了提高频率,采用了超长流水线,从而导致了 Decoder 和实际的 Execution Unit 相隔了很多个时钟周期
这个时候如果执行两条 Dependent Instructions 的话,就会出现麻烦:例如
mov eax, [ecx]
add ebx, eax
这个时候 [ecx] 所指向的数据不知道在 L1/L2 还是 RAM,甚至 Page File 中。如果等第一条指令的结果出来以后
Decoder 再发送第二条指令到流水线,那么第二条指令就要用十几个时钟周期才能传输到 Execution Unit,这将造成严重的流水线
气泡,使效率降低一大截,是不可取得方案。而 Intel Netburst 设计团队想出了让人觉得不可思议的处理方法:
注意仔细阅读...........
首先记住 P4 Northwood 的 L1 Cache 延迟为 2 Clks,L2 延迟为 7 Clks
当遇到上述的 Dependent Instruction Chain 的时候,Netburst 会在发送 mov 指令的两个周期之后发送 add 指令,假设数据在 L1 中。
如果数据确实在 L1 中,那么两个 Clk 之后,数据就会到达 register,这个时候两条指令以 100% 效率运行,很不错的设计 呵呵
但是:当数据不在 L1 的时候,也就是 mov 产生了 L1-Miss,这个时候 add 已经离两个 clk 就要到达 Execution Unit
但是 L2 Cache 里去取数据的话需要 7 Clk。由于流水线里的指令不能后退,而把整个流水线停止来等待数据也是很不可取得方法
这个时候,add 指令就会被 错误的执行。而相关的电路监测到了这个情况,就会在指令结果被写回的时候
把指令废除,而进入一个称为 Replay Queue 的执行单元,顾名思义,Replay = 重放,也就 add 指令要在
7 clk 之后被再次送回流水线执行。因为 L2 延迟为 7 Clk,所以如果数据在 L2 中,7 clk 之后正好到达 L1/Register,从而得出正确的结果。
但是,事实远比这个复杂。如果数据不在 L2 中,会发生生么???
add 指令 7 clk 后仍然被 错误执行,所以还会被 第二次送入 Replay Queue重新执行第三次
这种状况将一直持续下去,直到数据到达 Register。结果是,如果 [ecx] 的数据在 RAM 中,这条指令将被重复执行数十次,直到得出正确的结果
这不是天方夜谭,大家可以细细的看完整的文章来研究
相关链接:
http://www.xbitlabs.com/articles/cpu/display/netburst-1.html
http://www.xbitlabs.com/articles/cpu/display/netburst-2.html
注意,次贴仅供 Netburst 超长流水线的学术研究,禁止进来起哄的。谢谢合作! |
|