後藤弘茂のWeekly海外ニュース
PlayStation 4のAPUアーキテクチャの秘密
(2013/10/28 12:21)
コスト面からAMDに傾いたPS4
もうすぐ米国などで発売される次世代ゲーム機「PlayStation 4」(PS4)は、よく知られているようにAMDアーキテクチャのAPU(Accelerated Processing Unit)を使っている。伊藤雅康氏(ソニー・コンピュータエンタテインメント 第1事業部 事業部長兼SVP)によると、SCEがAMDと交渉を始めたのは2009年頃だったという。
「x86ベースでやろうとなった段階で、Intelを含めてどことやろうかと検討した。AMDを選んだのは2009年くらい。最終的にはコスト面からAMDを選んだ」と伊藤氏は語る。
おそらく、AMDを採用することで安くつくのは開発だけでなく、ウェハ自体のコストも安くつくと推測される。Intelで設計した場合は当然製造もIntelとなるが、その場合、ウェハ当たりのコストが高くつくというファウンダリとしてのIntelの弱点が表面化する。いずれにせよ、結果としてこの選択は、ライバルゲーム機であるMicrosoftのXbox Oneとかぶることになる。
PS4とXbox Oneは、AMDのカスタムAPU戦略の下で生まれた双子のようで、どちらも、「Jaguar」(ジャギュア) CPUコアを8コアと、GCN(Graphics Core Next) GPUコアをAPUに搭載する。しかし、両次世代ゲーム機にはさまざまな設計思想上の違いがあり、カスタマイズのアプローチが大きく異なる。両者とも最大の目的がGPUコアを汎用コンピューティングで使いやすくする点にあるにも関わらず、その手法が異なっている。
PS4もXbox OneもAPUのCPUコアはJaguarを使っており、内部パイプライン自体には手を加えていない。SCEとMicrosoftのどちらに対しても、CPUコアはほぼブラックボックスで提供されたと見られる。AMDはカスタムAPU(Accelerated Processing Unit)設計では、CPUコア側はブラックボックスで、それ以外をカスタマイズする方式を採っているのかも知れない。あるいは、MicrosoftもSCE同様に、APU設計の最終段階になってほかのCPUコアからJaguarへと切り替えを余儀なくされ、その結果としてCPUコアのカスタマイズができなかったのかも知れない。
PS4の場合は、Steamroller(スチームローラ)コアを4コア使う予定だったのが、Jaguarの8コアに変わった。これは、製造ファウンダリがGLOBALFOUNDRIESからTSMCに変わったからだ。SteamrollerはカスタムロジックとしてGLOBALFOUNDRIESで設計したため、TSMCでは製造できない。そのため、シンセサイザブルコアでファウンダリを選ばないJaguarコアへと切り替わった。Jaguar 8コアはちょうどSteamroller 4コアと性能的に同レベルで、ダイエリアもSteamroller 4コアとJaguar 8コアで同程度となる。
Xbox Oneも現在はTSMCの28nm HPプロセスだが、GLOBALFOUNDRIESの属するCommon Platform系のファブで製造すると言われていた。PS4と似たようなことが起きた可能性はある。ちなみに、Jaguarはゲーム業界では縁起の悪い名前だ。Atariの不成功に終わったゲーム機が“Jaguar”という名称だったからだ。
3つの拡張を施したPS4 APUアーキテクチャ
CPUコア自体は、ほぼAMD設計通りのPS4だが、CPU以外の部分にはいくつも変更が加えられている。SCEによると、APUのアーキテクチャ上の大きな拡張は3つだと言う。CPUコアとGPUコアコアを結ぶOnionバスの拡張、GPUコアの汎用コンピューティングの制御を行なうACE (Asynchronous Compute Engine)の追加、GPUコアのキャッシュのタグの拡張だ。面白いのは、この3つとも、GPUを汎用コンピューティングで使いやすくするための拡張であることだ。
「そこは我々がシステムアーキテクトに選んだSCEAのMark Cerny(Lead System Architect)の発想だ。トップゲームクリエイターでもありながら、ハードウェアも熟知している彼が、ゲームを作る場合に使いやすいハードウェアを考えた」と伊藤氏は語る。
内部インターコネクトや汎用コンピューティングの制御部分を拡張したという点は、Xbox Oneの拡張ともある程度似ている。Microsoftも、GPUコアでの汎用コンピューティングをやりやすくするためにこうした拡張を行なっている。しかし、両者のAPUの拡張は大きく異なっている。
Microsoftは内部インターコネクトに大きく手を入れ、かなり独自色を出した。それに対して、SCEは最小限の変更に留めた。と言っても、それはSCEの拡張が付け焼き刃だと言っているわけではない。かなり考え抜いて、効率的に性能やプログラマビリティを高める部分だけを拡張したように見える。PS4はカスタマイズ度に対して効率が高いと言える。
Garlicバスは4本に
「Onion」はAMD APUに特有のバスだ。AMDのAPUの内部バスのうち、GPUとメモリコントローラを結ぶバスは「Fusion Compute Link」(Onion)と「Radeon Memory Bus」(Garlic)の2系統に分かれている。下はAMDの初代APU Llanoと2代目APU Trinityのバス構造図だ。
PS4 APUではこのOnionとGarlicの両方のバスが拡張されている。
Garlicは、GPUコアとDRAMコントローラに広帯域に直結するディスクリートGPUのメモリバスをAPUに持ち込んだバスだ。Garlic経由でアクセスできるのは、CPUコアとGPUコアで共有するメモリのうち、GPUコア側が管理するデバイスメモリと、GPUコアがCPUコア側が管理するシステムメモリのうち、GPUコアがマップしているエリアにコヒーレンシを取らずにアクセスする場合だ。
AMD APUではGarlicのバス帯域は、APU自体のメモリ帯域と一致する。また、GPU側のメモリコントローラと、DRAMコントローラは1対1で接続されている。PS4 APUの場合は、DRAMコントローラは4チャネルに分割されている。そのため、Garlicも4本となっていると伊藤氏は説明する。通常のAMD APUでは、下の図のようにDRAMコントローラが2チャネルでGarlicバスも2本なので、PS4は2倍のバスを持つことになる。それによって、176GB/secの広いメモリ帯域に見合ったバス帯域になった。
キャッシュスヌープの方向性のためにOnionバスが抱える問題
しかし、PS4で特徴的なのは、すでに触れたように、もう1つのバス「Fusion Compute Link」(Onion)の方だ。OnionはCPUキャッシュとコヒーレンシを取るバスになっている。このバスを使うと、GPUコアが、CPUキャッシュへのスヌープをできるようになる。そのため、Onionバスを使うことで、GPUでの汎用コンピューティング時に、CPUとGPUの間での無駄なメモリコピーを排除するゼロコピーが実現できる。
ただし、従来のOnionには、アクセスのオーバーヘッドが大きいという問題があった。初代のAPUであるLlanoの場合は、Onionを経由したCPUキャッシュコヒーレントアクセスではGPUコア側からの読み出しは4.5GB/sec、書き込みは5.5GB/secと非常に遅くなっていた。
Onionの問題の根源は、CPUコア側からGPU側のキャッシュをプローブ(調査)できない点にある。つまり、CPUは、GPUのキャッシュにどんなデータが入っていて、それが書き換えられたかどうかを、知ることができない。GPUキャッシュへのスヌープを行なわないのは、CPUと高スループットのGPUの間で双方向の完全なキャッシュスヌープを行なうと、スヌープトラフィックが膨大になって帯域を食い、レイテンシも増やしてしまうからだ。この問題は、CPUコアとGPUコアを統合するアーキテクチャで常に大きな困難となる部分で、AMD以外のメーカーも頭を痛めている。
AMD APUの場合は現状では、Onionでアクセスする度にGPUキャッシュをフラッシュすることで対応している。GPUが書き換えたデータがGPU側のキャッシュに存在した状態で、CPUがメモリ上の古いデータにアクセスすると問題が発生するからだ。また、こうしたCPU側からのGPUアクセスは、同期のメカニズム(キャッシュフラッシュを含む)をドライバソフトウェアに負っている。こうしたことがオーバーヘッドの原因となっている。
Onion+でGPUコアのキャッシュ階層をバイパス
この問題を解決するために、SCEはOnionバスの制御を拡張して「Onion+」にしたという。Onion+では、GPUコア側のキャッシュメモリ階層をバイパスしてしまう。AMD GPUコアのキャッシュ&メモリ階層は下の図のようになっている。共有のL2キャッシュとGPUコアのCU(Compute Unit)それぞれのL1キャッシュがある。これをOnion+経由のアクセスではバイパスする。
Onion+によってPS4では、GPUコアがCPU側のシステムメモリに、CPUキャッシュコヒーレントにアクセスする場合は、GPU側のキャッシュは原則として使われない。そのため、GPUキャッシュをフラッシュする必要がなくなり、Onion経由のアクセスの効率が上がる。結果として20GB/secの帯域のアクセスが可能になったという。
Onion+の難点は、もちろんGPUコアからのCPUメモリへのCPUキャッシュコヒーレントアクセスには対してはキャッシュが効かないことだ。Garlic経由のデバイスメモリへのメモリアクセスがキャッシュされるのに対して不利になる。しかし、現状でもOnionアクセスではキャッシュは使う度にフラッシュされてしまうので、オーバーヘッドが少なくなる分、Onion+の方が効率的だ。また、根本解決のためにフルに双方向のキャッシュコヒーレンシを取ろうとすると、コヒーレントトラフィックの問題を解決しなければならず、それは大変な作業になってしまう。Onion+は効率的な現実解だと言える。
PS4 APUのOnion+でも物理的なアクセス経路はOnionと同じで、I/Oコントローラを経由する。つまり、ディスクリートGPUがI/Oコントローラ経由でCPUに接続されていた形態をエミュレートしたバスの形式のままだ。それに対して、MicrosoftのXbox Oneは下の図のように、I/Oコントローラをバイパスして、専用のMMU(Memory Management Unit)を設置する設計を採った。
Microsoftは、ゲーム機ではPCアーキテクチャを踏襲する必要がないため、I/Oコントローラを外したと説明していた。それに対して伊藤氏は次のように説明する。
「それ(ゲーム機だからI/Oコントローラを外してもいい)は、その通りだが、I/Oコントローラを外した設計にすると、これまで持っていた技術が使えなくなり、ドライバなどソフトウェアの開発期間もより長くかかるという問題が生じる」。
PS4のグラフィックスドライバは、SCEが開発を行なっているカスタムドライバだ。とはいえ、ひな形にはAMDのドライバがあるはずで、AMDは従来型のドライバ設計にしている。SCEは、大きなアーキテクチャ拡張を加えて、ソフトウェア設計を複雑にすることで開発期間や開発コストの増大を招かないという姿勢だ。PS4の拡張は、あくまでも、小さな拡張で効率を上げる方法だ。