前回、性能ベンチマーク編と題してZambeziコアのAMD FX-8150の性能ベンチマークをお届けしたが、これに続き内部解析編をお届けしたい。既に製品の素性とかを説明する必要もないだろうから、早速解析に移りたい。メインとなるのはRMMA(RightMark Memory Analyzer) 3.8を利用しての分析である。ちなみにここではCore i7-2600K、Phenom II X6 1100T、AMD FX-8150の3製品のみを対象とし(Core i5-2500Kを入れてもCore i7-2600Kと同じ結果になるだけだからだ)、すべての製品でTurboは無効としている。
■前回の記事
・【特集】Bulldozer世代の8コアCPU「AMD FX」"Zambezi"徹底攻略 - 性能ベンチマーク編
http://news.mynavi.jp/special/2011/zambezi/
RMMA Decode(グラフ1~16)
さて、まずはDecodeから見てゆくこととしよう。Bulldozerアーキテクチャは、2つのCoreにまたがる形で、共用のフロントエンド部を装備している(Photo01)。
理論上はそんなわけで、4命令/Cycleでのデコードが可能である。このデコード部について、RMMAは、
NOP(1): | nop |
---|---|
SUB(2: | sub eax, eax |
XOR(2): | xor eax, eax |
TEST(2): | test eax, eax |
XOR/ADD(4): | xor eax, eax; add eax, eax |
CMP #1(2): | cmp eax, eax |
CMP #2(4): | cmp ax, 0x00 |
CMP #3(6): | cmp eax, 0x00000000 |
CMP #4(6): | cmp eax, 0x0000007f |
CMP #5(6): | cmp eax, 0x00007fff |
CMP #6(6): | cmp eax, 0x7fffffff |
Prefixed CMP #1(8): | |
Prefixed CMP #2(8): | |
Prefixed CMP #3(8): | |
Prefixed CMP #4(8): |
という1Bytes/命令~8Bytes/命令まで15種類のパターンを用意し、これらを延々と実行した場合のThroughputを測定している。
さて結果だが、いきなりグラフ1で4命令/Cycleの結果が叩き出されるという、ちょっと解せない結果になった。NOPは1Bytesだから、これは4命令/Cycleという計算になるのだが、これは続くグラフと全くマッチしない結果である。結果から言えば、これはBulldozerのデコーダにはSandy BridgeのZeroing Idiomsと同じく、命令を発行せずにRetirement Unitだけで処理する形の実装と想像される。
ではNOPではないとどうか? というのがグラフ2~15となる。ご覧いただければ判る通り、L1 Hitの範囲ではきっちり2命令/Cycleで律速されているのが判る。すべての命令で、やはり3命令/CycleとなっているPhenom IIや、簡単な命令で4命令/cycle、複雑な命令で3命令/CycleとなっているCore i7と比較するとその差は明瞭である。XORとかSUBといった単純な命令だけでなく、Prefixed CMP命令でもこれは変わっておらず、なので単に命令が複雑になったから速度が遅くなるというわけではない。そもそもPhenom IIでは3命令/cycleでDecodeができているのだから、今更複雑な命令だと遅くなるという話でもないだろう。
これの意味するところは、Decoder自身はちゃんと4命令/cycleで動作しているが、そこからInt Schedulerへは2命令/cycle分しかSlotが用意されていないということだ。これが律速段階になっていると考えて間違いはなさそうだ。
Decodeに関してはもうひとつ、Decode Efficiency(グラフ16)についても見てみた。これは要するにALU命令の前に無駄なNOP命令をずらずらPrefixとして付加すると、どれだけデコード速度が落ちるかを見るものだ。いずれの場合でも、1個付加しただけで通常のDecode Pathとは異なりMicrocodeを使ったPathを通る事になるようだ。ただ、そのMicrocodeを通るときのThroughputがぜんぜん異なるのが面白い。Phenom IIの場合、Prefixのサイズによって多少Throughputが変わるが、14個(命令長15Bytes)の場合で3.74Bytes/cycleだから、4cycle/命令で動く。Core i7は(これも途中で変わるが)15Bytesの場合で1.08Bytes/cycleだから、概ね14cycle/命令程度。でAMD FXは?というと15Bytesで0.33Bytes/cycleだから、45cycle/命令程度。Microcodeを使った場合の性能が著しく悪化しているのが、AMD FXの特徴と言えるだろう。