内容导航
K7和K8 解码器(Decoders)和管线(Pipelines)的区别
现在让我们来比较K7和K8 。在文章的前面部分我们曾经说到管线有几个,甚至更多的层。它们与解码器有更深层次的接触,特别是解码器的命名无论从质量还是数量来说都有了很大的改变 。
为了让大家更加明确地了解到改变,现在先让我们看看K7解码器。在之前让我们描述一下什么是解码器,"decoder"(解码器)术语被使用在K7架构的很多地方:
-
Predecoder -- 在指令写入I-cache之前对它们进行分析,检测它们的起始和结束地址,前缀位置和解码类型(DirectPath 和 VectorPath;这将在后面解释)。所有这些内容都储存在L1 cache 的特定解码阵列bits里。同时它会认识"goto"指令,并预备分支选择器来选择快速的预测,并goto转到检测到的地址。Prerecording 在速度不快过4 bytes/时钟的时候将开始作用。
-
Decoder(解码器)本身 -- 从I-cache 读取 x86 指令 到mOPs,并进行转换排列和标记 。
我们能够在K7的解码过程中看到它包含了一系列的操作,这里我们称"decoder"没有进行深层次的挖掘。现在让我们澄清在#1提到的DirectPath 和 VectorPath 术语究竟是什么意思。K7 的解码器能够通过DirectPath 或者 VectorPath 来处理x86 指令。前者,DirectPath 仅处理转换为单个mOPs的x86 指令 。
其它的指令则由VectorPath 处理,并把它们转换为连续的两个或者更多的mOPs 。在这些指令中(包括最复杂的整数分割/integer division)都使用了Microcode Engine 。通过内建的表单,它能够把x86指令放到mOPs 序里面。
让我们检测一下K7 decoder和pipeline 的运作:

-
1.FETCH(取):predecoder(预解码器)从I-cache 读取16 bytes ,并同步检测将要进行fetch(取)的下个段 。顺便说一下,K8也是读取16 bytes 的。在特定的情况下(如果x86指令大于16/3 bytes),这个阶段将变为限制的因素之一。 平均的x86指令容量在5-6 bytes 。
-
2.SCAN(扫描):预先排列好的Decode Array(解码阵列)被分开,并分别通过DirectPath 或者VectorPath。超过6个单独的指令将发送到DirectPath,若只有单个指令将进入VectorPath和Microcode Engine 。
-
3.ALIGN1(排列):在这个阶段,可以缓冲超过9个DP指令(超过24 bytes) 。其中3个的每个时钟将发送到三个信道执行。信道的数字(0/1/2)被分配给mOP DP 指令,并转换为需要的子阶段。该阶段的总共性能是3DP 指令/时钟。VectorPath 指令也通过这个阶段,并保持在解码器的mOP顺序,并输出到相应的源指令顺序。VectorPath 指令立即占据了三个解码器的信道,但并不和早前DirectPath 指令联合。如果最后一个时钟少于3个DirectPath,那么空信道仍旧是空的。
下面让我们停下来讨论一下VectorPath 指令的弱点 --- 它的宽度占据了3个解码信道,因此不允许DP 解码器并行工作。其实VectorPath 指令本身并不"坏" -- Microcode 引擎 以3倍 mOP/时钟 的速度运行,如DP 解码器一样。在这个VectorPath 的mOP就像DirectPath 一样,产生超过10个的复杂指令(例如division (分割),很多系统指令)。VectorPath 是相当不错的解决方案,在"triplet" 中,VectorPath起到了辅助的作用:
-
如果VP指令在一线的第一位(有第0个位置),那么它将直接到Microcode Engine 产生mOP 系列(使用它的表格)。Mops以三个为单位输出,如果最后triplet 有少于三个mOPs,空的则分配NULL -ROP 。单元的另外两个指令则通过向左移(到0位置),然后下个指令则附加到3个。
-
如果VP指令并不是一线的第一位,那么上述的DP指令将被首先解码,而空的mOP位置则被分配NULL-ROP 以补足3个。然后它再进行和前面一样的工作 - VP 指令在下一行被处理。
-
4.ALIGN2
-
5.EDEC
-
6.IDEC
-
7.SCHED
-
8.EXEC
下面让我们列举一下FP指令的各个阶段。
-
7.STKREN
-
8.REGREN
-
9.SCHEDW
-
10.SCHED:
-
11.FREG
-
12-15.FEXEC1-4
所有这些阶段都是K7里面的,而对于K8目前的资料还不详细。但是从以下我们还是可以看到K8与K7的区别:
- FETCH1 (对应K7的 FETCH )
- FETCH2
- PICK
- DECODE1
- DECODE2
- PACK
- PACK/DECODE
- DISPATCH (对应K7的IDEC)