BTBを強化したBulldozerコア
Bulldozerコアは64KBの1次命令キャッシュを持ち、2階層のBTB(Branch Target Buffer)を備えている。BTBは過去の分岐先アドレスを記憶するキャッシュで、分岐予測が間違っていなければ、条件分岐の方向が確定する前に次の命令アドレスが分かる。BulldozerではこのBTBを使ってどんどんと予測される方向の命令を読み出してくる。命令フェッチと実行を分離するこのような方式は珍しくは無いが、Bulldozerでは512エントリの1次BTBと5Kエントリの2次BTBを持つという構造をとり、高いヒット率を実現する大容量と、高速アクセスを両立させている。
また、1次BTBのヒット率はかなり高いと思われるので、大部分のケースでは2次BTBは動かず、この2階層構造は消費電力の点でも有利であると思われる。なお、これらのBTBは2つのスレッドで共有されており、命令キャッシュからデコーダまでの各ユニットはサイクルごとにどちらのスレッドの命令を処理するかを切り替えている。
整数コアは加減算や論理演算などを実行するEX機能を持つパイプラインを2本持ち、一方は乗算、一方は除算も実行できるようになっている。そしてロードストアのためのアドレス計算を行うパイプラインが2本設けられている。
これにより、ほぼ任意の2つの整数演算命令と、2つのLoad命令、あるいはLoadとStore命令を実行することができる汎用性の高い整数ユニットとなっている。そして、2スレッドで共用されるFPコアは2つの128ビット幅のFMAC(浮動小数点積和)演算を実行するパイプラインをもっている。この構成は、64ビットの倍精度FP点演算の場合、各パイプラインは2つの積和演算を実行できるので、合計4演算で、Bulldozerコア全体では8演算となる。この演算数は現在のOpteronコアと比較すると2倍であるが、スレッドあたりでみると同じである。また、FPコアは2個のMMXパイプラインをもっており、MMX(SSEを含んで)命令の実行もFP演算と同様に扱われる。
競合するIntelのSandy BridgeはAVXを実装し、コアあたりのFP演算数を倍増すると見られており、この点では弱体ではないかとButler氏に質問したところ、Intelの実装は加算、乗算ともに256ビット幅のものが各1パイプラインとみており、Bulldozerは128ビット幅の積和演算が2パイプラインであり、Sandy Bridgeと同じ数の演算を可能にしている筈との答えであった。なお、BulldozerはAVX命令をサポートしており、この場合は2つの128ビットパイプラインを並列に動作させると思われる。
また、各整数コアはロード/ストアユニットと1次データキャッシュを持っている。1次データキャッシュは16KB 4wayの構成であるが、次にアクセスするWay番号を予測し、そのWayだけをアクセスする構造になっている。1次キャッシュでは、4way全部のタグとデータアレイをアクセスし、ヒットしたWayのデータだけを使うという構造が一般的であるが、この方法ではヒット以外の3つのWayのアクセスに使われた電力は無駄になってしまう。予測を使うと、予測機構と予測が間違った場合の回復機構をつける必要があり構造が複雑となり、予測はずれによる性能ロスも出るが、BulldozerではWay予測を使うことによって消費電力を減らす方を選んだ。
2次キャッシュは16Wayで強力なデータプリフェッチ機構を備えている。メモリアクセスが一定の番地跳び(ストライド)になっていることを検出して、先回りして次の番地をプリフェッチする機能を持つプロセサは多いが、Bulldozerのプリフェッチ機構は、このようなストライドについても系列数やストライドサイズを拡大しているだけではなく、一群のメモリアクセスが関連がありそうな場合はストライドで無いケースも予測を行ってプリフェッチを行うという。一般のマルチスレッドプロセサの場合は、メモリアクセス待ちで実行が止まったスレッドは後回しにして別スレッドに切り替えて実行すればコアは遊ばないが、Bulldozerでは整数コアを遊ばせないためにはキャッシュミスを減らすプリフェッチの精度を上げることが重要になるので、プリフェッチ機構を頑張るのは理解できるアプローチである。
なお、この図ではFPコアには1次データキャッシュが無いが、それぞれのスレッドを実行する整数コアの1次データキャッシュとロード/ストアユニットがFPコアのデータのロード、ストアも担当する。
これまでのOpteronがメモリからのデータを直接1次キャッシュに入れ、1次キャッシュを追い出されたデータを2次キャッシュに入れるビクティムキャッシュ方式を使っていたのに対して、Bulldozerではメモリからのデータは2次キャッシュに入れ、さらに1次キャッシュに入れるというインクルージョンキャッシュに変更された。ノンインインクルージョンの現在の方式では、他コアからのスヌープ要求に対しては1次、2次の両方のキャッシュのタグをスヌープする必要があるが、インクルージョンにすれば2次キャッシュのタグのスヌープだけで済む。また、インクルージョン方式の方がキャッシュ間のキャッシュラインの移動回数が少なく、全体として消費電力が少ないという。
他のプロセサでもある程度、動作する部分を減らすようなマイクロアーキテクチャの採用が行われているが、ここまで徹底して省電力マイクロアーキテクチャを追及したプロセサは筆者の知る範囲では、初めてである。また、具体的にクロックがどの程度になるかは明らかにされなかったが、クロックあたりのゲート段数を減らす設計であると述べられており、IBMと同じSOIプロセスを使うと考えられることから、同様の低ゲート段数設計であるPOWER7並みの4GHzを超えるクロックを実現するのではないかと予想される。これで従来のパワーエンベロープを実現すれば、非常に強力なプロセサになると考えられる。