後藤弘茂のWeekly海外ニュース

「Xbox One」のAPUのカギとなるカスタムアーキテクチャ

AMD APUとは異なるインターコネクトアーキテクチャ

Xbox One(E3 2013)

 いよいよ次世代ゲーム機の登場が間近に迫って来た(日本では遅れるが)。次世代ゲーム機のハードウェアアーキテクチャのポイントは、PCアーキテクチャをベースにしながらも、独自のカスタマイズを加えた点だ。そして、そのカスタマイズのアプローチがMicrosoftとソニー・コンピュータエンタテインメント(SCEI)では異なっており、それが両者の今回の戦略や背景の違いを示している。

 2つのゲーム機アーキテクチャのうち、APU(Accelerated Processing Unit)のカスタマイズ度がより高いのがMicrosoftだ。MicrosoftのXbox Oneのアーキテクチャを理解すると、PlayStation 4(PS4)も理解しやすい。

 下の図は、推測されるXbox OneのAPUの構成図だ。CPUコアはJaguar(ジャギュア)が8コア、GPUコアはGCN(Graphics Core Next)アーキテクチャで12 CU(Compute Unit)が有効となっている。ここまでは、AMD APUの拡張だが、Microsoftは内部インターコネクトとMMU(Memory Management Unit)を通常のAPUより大きく変えている。

Xbox One APUのアーキテクチャ(PDF版はこちら)
Hot Chips 25で概要が発表されたXbox One APU
SoCのシステムコンポーネント

 内部インターコネクトで目立つのは、CPUコアとGPUコアの間に新しいインターコネクトが新設されていること。このインターコネクトはCPU側のコヒーレントキューと、GPU側のMMUを直結すると見られる。AMDのAPUでは、通常はGPUコアとDRAMコントローラの間をRadeon Memory Bus(GARLIC)で接続し、CPUコアとGPUコアの間はFusion Compute Link(ONION)で接続する。

 GPUからのメモリアクセスのうち、CPU側のメモリ空間へのアクセスは基本はOnion経由、GPUメモリ空間へのアクセスはGarlic経由となる。しかし、Xbox Oneには3つ目のバスがあり、GPUコアからCPUキャッシュとコヒーレントを取るアクセスはこちらを使う。

 ある関係者は「Xbox Oneでも、依然としてGarlicバスはGPUとDRAMの間をバイパスするために使っている。また、I/Oを接続するOnionバスも持っている。しかし、それらとは異なるバスも備えている。そのバスはGarlicはOnionと似たようなコードネームを持っているが、まだ言えない」という。

I/Oコントローラをバイパスする

 AMD APUでは、CPUコアとGPUコアはI/Oコントローラを介して接続されている。下の図のような構造だ。AMDがこうした構成をとったのは、歴史的にGPUが別チップでI/OコントローラからPCI Express経由で接続されていたからだ。Onionは、I/O経由でのCPUとGPUの接続をAPU内部に持ち込んだバスとなっている。それに対して、GarlicはGPU内部でのGPUコアとDRAMコントローラの接続をそのまま移し込んだバスだ。

AMD Trinityのアーキテクチャ(PDF版はこちら)

 しかし、Xbox Oneは大きく異なり、CPUコアとGPUコアはI/Oコントローラを介さずに接続されている。「歴史的にGPUはI/Oコントローラの先のPCI Expressに接続されていた。AMDはそのパスを継承して実装した。しかし、ゲーム機ではその構造を継承する必要がない。だから専用バスを作った」という。

 PCでは、ドライバソフトウェアの互換性などのために、I/Oコントローラ経由のバスを継承する方が楽だった。それに対して、専用機のXbox Oneでは後方互換性を考える必要がないので、I/Oコントローラを外したパスを設定したという。そのため、Xbox Oneの場合は、CPU側へのGPUからのメモリアクセスはIOMMU(I/O MMU)経由にならない。このアーキテクチャには利点と難点があり、利点はI/Oコントローラを経由しない分、レイテンシなどで有利になる。難点は、ドライバソフトウェアスタックにかなりユニークな変更を加えなければならなくなる。

 ちなみに、このインターコネクトのプロトコルは部分的にAMDのFSBであるHyperTransportから転用されている。Microsoftが特にHyperTransportを使いたかったからではなく、AMDが持っている技術がHyperTransportだったから実装したという。また、HyperTransportをそのまま使っているのではなく、カスタマイズされているという。

 HyperTransportのプロトコルを借用したのは、プロセッサ間のコヒーレンシのためだと見られる。通常は、GPUコア側からCPUコアのキャッシュをスヌープできるが、CPUコア側からGPUコアのキャッシュのスヌープはできない。GPUからCPUの片方向のキャッシュコヒーレンシとなっている場合が多い。Xbox Oneでは双方向なのか片方向なのかは明言されていない。

 ちなみに、PS4はOnion+でGPU側のキャッシュをバイパスすることで、GPUキャッシュ階層に対してのキャッシュコヒーレンシを取る必要を実質的になくしている。また、AMDのHSA(Heterogeneous System Architecture)のhUMAの場合は、hUMA構想の発表の際のスライドでは、双方向のコヒーレンシを取ることになっていた。ただし、AMD APUの実際の実装が最終的にどうなるかは、次のAPU「Kaveri(キャヴェリ)」がOnion+を実装しているという資料がリークされたことで怪しくなってきた。

HSAの「hUMA」ではCPU-GPU双方向でコヒーレンシを取る

ページベースでテーブルを共有するMMU群

 内部バスの大幅なカスタマイズとともに、Xbox One APUではメモリを管理するMMUも拡張されている。GPU側のGPU MMUと、I/OのIOMMUはそれぞれ大きく変更された。いずれも、ページマネージドベースのメモリアドレッシングで、ページテーブルをCPUのMMUとGPU MMU、I/O MMUでシンクロするように設計し直されている。GPU側のMMUのページベースのメモリ管理は、AMDのhUMAでも実装を予定している。Xbox OneのGPU MMUも、ページフォルト(Page Fault)のハンドリングが可能だと推測される。

 このアーキテクチャによって、Xbox OneではCPUと他のプロセッサ間でメモリ空間を共有してポインタを渡すだけで、それぞれのプロセッサが同じデータにアクセスできるようになっている。利点は、CPU側のメモリ空間上でのデータストラクチャに、GPUコアがそのままアクセスできる点で、データストラクチャの再構築などのオーバーヘッドをなくすことができる。AMDのHSA的な機能だが、HSAランタイムを使うものではないという。

 Xbox OneのGPUとI/OのMMUは、Xbox Oneのためのカスタム設計で、MicrosoftとAMDで開発したという。APU全体で一元化したMMUを共有する方法もあるが、Xbox Oneではその手法はとらなかったという。理由は明白で、GPUコア側のメモリアクセスを広帯域のカスタム設計にしたかったためだ。

 ちなみに、Xbox One APUでも、CPUコア側のMMUやMMUが内蔵するTranslation Lookaside Buffer(TLB)はソフトウェア的な視点では変更されていないという。もちろん、GPU MMUとIOMMUとテーブルを同期させるためのメカニズムは加わったはずだが、ソフトウェアから見える形での変化はない。逆を言えば、GPU MMUとIOMMUが、x86 CPUに合わせたMMUになっていると見られる。例えば、GPU MMUはもともと独自のテーブルとTLBを持っているが、それが共通化されたと見られる。下は、Llano(ラノ)APUのメモリシステムだ。

AMD Llanoのメモリシステム

 GPU側のMMUは実際には複雑な構造になっており、内部的には2つのMMUで構成されているという。まず、GPUコアとDRAMコントローラを接続するGarlicのためのMMUがある。そして、新しいインターコネクトを経由してCPUクラスタ側のキューに接続するためのMMUがあるという。また、Xbox Oneは32MBのオンチップストレージを持つが、こちらにも専用のインターコネクトがある。このオンチップストレージのMMUは、GarlicのMMUと一体化されていると推測される。

 オンチップの32MBのeSRAMは8MBずつに分割されており、それぞれ256-bitで双方向のインターコネクトで接続されている。GPUコアとDRAMコントローラを接続するGarlicも4本と見られる。APUに接続するDDR3 DRAMが64-bitの4チャネル構成になっているからだ。

CPUコア自体は同じでコヒーレント帯域を拡張

 Xbox OneのCPUコアは、実はAMDのスタンダードなJaguarから変わっていない。実行パイプライン自体はAMDのオリジナル設計のままで、変更されたのはマイクロコードとCPUに付属するコヒーレントキューの部分だという。コヒーレントキューは、CPUコアのクラスタとメモリコントローラの間のキューで、I/O側からのインターコネクトもここに接続される。そして、Xbox OneではGPUからの、CPUキャッシュコヒーレントなメモリアクセスも、このキューに接続される。

Jaguarのブロックダイアグラム(PDF版はこちら)
Jaguarのパイプライン(PDF版はこちら)
Xbox One APUのCPU部

 Jaguar部分の構成の基本は、4CPUコアとL2で構成するAMDのJaguar CU(Compute Unit)をそのまま使っている。しかし、Xbox OneのJaguarクラスタでは、GPUコアからCPUへのキャッシュへのスヌーピングの帯域の拡張ために、CPUのL2キャッシュへのスヌープは拡張されているという。ちなみに、JaguarはインクルーシブキャッシュなのでL2をスヌープすればL1をスヌープする必要がない。

 AMDはGPUコアはカスタム化するが、CPUコアは、少なくとも今回はPS4とXbox Oneともに大きなカスタム化は行なわなかった。GPUコアとメモリ回りのカスタム化は次の記事で説明したい。

Xbox One GPUの概要(PDF版はこちら)
Xbox Oneの全体構造
GPU MMUの接続

【お詫びと訂正】初出時、図「Xbox One GPUの概要」において、ジオメトリの数値が誤っておりましたので修正いたしました。お詫びとともに訂正いたします。

(後藤 弘茂 (Hiroshige Goto) E-mail