Memory Bandwidth(グラフ17~28)
次に、D-CacheとMemory周りについて色々確認してみた。Bulldozerの場合、L1に関してはコア毎に装備する形になっており、これが共有L2経由でMemoryに繋がるという構造となる(Photo02)。
さて、まずグラフ17~19がSSE2命令を使ってのRead/Write/Copyである。Bulldozerの場合、L1 I-Cacheは(共有ではあるが)64KBなのに対し、L1 D-Cacheは16KB/Coreと控えめになっており、このため命令の読み込み速度で比較したグラフ1~15に比べると、早いタイミングで落ち込むことになる。それはそれでセオリー通りなのだが、もう少し仔細にグラフをみてみよう。まずグラフ17、L1は32Bytes/cycleでこれはまぁCore i7やPhenom IIと差はない。L2に関しては10Bytes/cycle程度で、Core i7の18Bytes/cycleには及ばないが、Phenom IIの8Bytes/cycleよりは改善されている。問題はL3で、本来は8MBのL3によって10MBあたりまでは完全Cachableの筈なのに、ほとんどMemory Accessと同等のBandwidthに落ち込んでいるのがまず気になるところだ。
これはグラフ18のWriteの結果でも再現される。L1は16Bytes/cycleの書き込みであるが、Way-predicted(データの繰り返しを自動推定)するのが逆効果なのか、4KBあたりで急激に性能が低下し途中から5.57Bytes/cycleあたりに悪化する。L2は5Bytes/cycle程度で、これはPhenom IIと同レベル。問題は2MBを超えたあたりで、ここからはほとんどMemory Accessとほとんど変わらない性能しか出ていない。結果として、グラフ19のCopyの結果がお世辞にも良いとは言えないのは、Writeの結果に引っ張られたものと推定される。
次がPrefetchの効果である。グラフ20~22がSoftware Prefetch(Prefetch命令を明示的に発行)、グラフ23~30はBlock Prefetch(特定のデータサイズで連続アクセスする形でHardware Prefetchの効果を期待)の効果をそれぞれみたものである。まずグラフ20、1KB付近に不思議な落ち込みはあるものの、AMD FXの性能はこの範囲で3.5Bytes/cycleを確保して、2.5Bytes/cycle程度のPhenom IIよりも良いスコアである。Core i7にはかなわないが、これはLoadユニットの数の差と考えるべきか。Write(グラフ21)の傾向も似ているが、Core i7はそれほど落ち込まないのにAMD FXやPhenom IIはややReadより数字が沈んでいる。面白いのは、これだけ差があるにもかかわらず、Copy(グラフ22)でCore i7がきっちり半分のスコアに落ち込んでいるのに、AMD FXのスコアはずっと良いことだ。要するにRead/Writeを並行して発行するような激しいトランザクションにおける最適化が進んでいる、ということになる。
ただし、もっと大きなサイズになるとどうか? というとこれが難しい。グラフ23~28はBlock Prefetchのケースである。Software Prefetchの場合は、通常Cache Line 1~2本分のデータの先読みとなるが、こちらではもっと大きなサイズでの先読みをハードウェアがちゃんとおこなっているか、の確認である。これを2種類のアクセスパターンで確認しようというものだが、まずRead(グラフ23・24)ではCore i7はサイズが大きくなると緩やかにBandwidthが低下しており、一応Prefetchの効果があるとみなせるのだが、Phenom IIではグラフ23こそ多少効果があるもののグラフ24では早い段階で一定値になっており、あまり効果がない(メモリの速度で決まってします)事が見て取れる。で、AMD FXは? というと、Phenom IIよりも更にひどい。まぁそれでもグラフ23では1024KBを境に多少帯域が下がっているあたり、その手前は多少Prefetchの効果があるが、グラフ24のパターンでは早い段階でメモリの速度そのままになってしまっている。
ただWrite(グラフ25・26)に関しては、AMD FXはPrefetchの効果があるとは言いにくいものの、どちらも2.7Bytes/cycleと比較的高めのスコアになっており、これはPhenom IIはもとよりCore i7と比較しても悪いスコアではない。これはあくまで1 Coreというか1 Threadでの結果である。Core i7の場合、2 Threadになってもこの値が大きく上がることは考えにくいからで、ところがAMD FXでは2 Threadだと倍は無理にしてもかなり帯域が上がることが期待できるからだ。
とはいえ、Readの結果が悪いためか、Copy(グラフ27・28)でAMD FXの結果が振るわないのは仕方ないところかもしれない。