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

PlayStation 4のGPUコアとサブシステムチップ

GPUコアの8ユニットのACEはRadeon R9 290Xと同じ構成

 ソニー・コンピュータエンタテインメント(SCE)の次世代ゲーム機「PlayStation 4」(PS4)は、AMDのカスタムAPU(Accelerated Processing Unit)をベースにしている。GPUコアはGCN(Graphics Core Next)アーキテクチャの拡張版だ。

 PS4のGPUコアのフロントエンドのコマンドプロセッサ群の構成は、AMDの最新GPUである「Radeon R9 290/290X」(Hawaii)によく似ている。1個の「グラフィックスコマンドプロセッサ」(Graphics Command Processor)と、それぞれ最大8個のキューを持つことができる8個の「ACE」(Asynchronous Compute Engine)で構成されている。つまり、現在のAMD最上位のディスクリートGPUと同じフロントエンドを、PS4は持っていることになる。

PS4 GPUコアのフロントエンド部(PDF版はこちら)
AMDの最新GPU「Radeon R9 290(Hawaii)」(PDF版はこちら)

 ACEは、GPUコアの演算ユニット群に対して、汎用演算タスクを発行する制御ユニットだ。Hawaiiは44ユニットの演算クラスタ「CU」(Compute Unit)に対して8 ACE。それに対してPS4は18ユニットのCUに対して8 ACEで、PS4の方が演算コアに対しての制御ユニット数が多い。Xbox Oneは12ユニットのCUに対して2 ACEとなっている。

 世代的に見ると、最初のGCNのRadeon HD 7900(Tahiti)は、GPU全体でACEが2個の構成でタスクキューも少なかった。現在はPS4もAMD GPUも、ACE当たり8キューに拡張されており、Xbox Oneの2個のACEもそれぞれ8キューだとMicrosoftは説明していた。

 キューに格納されたタスクは原則的にはスタックの順番にシェーダコアにディスパッチされ実行される。タスクには優先度も設定されており、ACEはそれに応じてディスパッチもできる。また、ACEはタスク側の依存性のタグを見て、依存性のチェックを行なうこともできる。ACEはディスパッチしたタスクの完了も行なう。そのため、タスク間に依存性がある場合は、前のタスクが終了するまでは、次のタスクは発行されない。

 以前にも説明したが、ACEと演算タスクキューが多いことは、より細かな粒度の演算をハンドルできることを意味している。演算タスクは、グラフィックスと比べると粒度が小さいタスクが発生する可能性が高い。ACEが十分な数がないと、タスクのディスパッチが間に合わず、汎用コンピューティングで性能を発揮できない可能性がある。ACEの数が多ければ、より多くのタスクをハンドルできる。

 ACEの数が必要なのは、1個のACEがハンドルできるタスクに制限があるからだ。そのため、多種の異なるタスクを流そうとすると多数のACEが必要となる。PS4の場合は、発想的にPLAYSTATION 3(PS3)のSPU(Synergistic Processor Unit)的な使い方をGPUのCUにやらせることにあるため、ACEが多い。GPU上のコンピュートタスクの粒度を小さくし、種類を増やすことができるようにするための仕組みだ。

L2キャッシュの動作をフレキシブルに

 GCNアーキテクチャではメモリマネージメントユニットにL2キャッシュが付属している。PS4では、GPUコアのL2キャッシュに新たに「Volatile flag」がキャッシュタグに加えられた。これは、GPUの中で走る演算タスクのメモリアクセスに使われるタグだ。GPUのL2の各キャッシュラインごとのタグの中に、新しいステイトを記述できるビットが設定されている。GPUのCUで走る演算タスクからのメモリアクセスは、L2でこのフラグが立てられ“Volatile”と示される。

 これまでは、CUで走るグラフィックスと演算の2タイプのタスクは、L2キャッシュ上では区別されなかった。しかし、PS4では演算タスクが読み込んだデータはVolatileタグで区別できるようになる。

 そして、Volatileタグがついたキャッシュラインに対しては、ソフトウェア側が明示的にキャッシュの制御を変更することができる。GCNのL2キャッシュは基本的にはライトバック(L1はライトスルー)だが、Volatileがついたライン毎にこうしたキャッシュビヘイビア(キャッシュの動作)を変更できるようだ。基本のキャッシュビヘイビアをオーバーライドして制御できるキャッシュとなっている。

AMD GPUのメモリ階層(PDF版はこちら)

 この仕組みの効用は、グラフィックスと演算の両方のタスクが同時にGPUコアで走る場合に、キャッシュを効率良く使うことができるようになることだ。キャッシュラインのタグに1bitのフラグを足すだけで、効率を上げることができる。ただし、この機能を活かすにはプログラム側の対応が必要となる。

 ちょっとややこしいかも知れないが、PS4 APUの「Onion+」は、GPUコアがCPUコアの管理するメモリ領域に、CPUキャッシュとコヒーレンシを取りながらアクセスする場合に、GPUキャッシュをバイパスする機能だ。それに対してVolatile flagは、GPUコア上で演算タスクがメモリアクセスする場合に、GPUキャッシュにフラグを付けて制御する機能だ。

グラフィックスと混合して使うことが前提の演算処理

ソニー・コンピュータエンタテインメントの伊藤雅康氏

 PS4がGPU拡張でこうしたアプローチを採っているのは、ゲーム機でのGPUコンピューティングの使い方が、グラフィックスタスクと混合させて使うことにあるからだとPS4の開発を担当する伊藤雅康氏(ソニー・コンピュータエンタテインメント、第1事業部 事業部長兼SVP)は説明する。GPUにコンピュートタスクだけを集中して実行させるHPC(High Performance Computing)タイプの使い方とは多く異なる。

 実際、PS4でのGPUコンピュートは、グラフィックスと同じシェーダ言語「PlayStation Shader Language」(PSSL)を利用する。「グラフィックスの中に演算処理を混ぜるという使い方に、アーキテクトのMark Cerny(Lead System Architect)がこだわった。だから、これまで我々のシェーディング言語で積み上げてきたものをコンピュートにも入れ込みたかった」(伊藤氏)という。

 例えば、シャドウマップの生成で演算コアが空いている隙間に、演算タスクに回した方がいい処理をGPUに流すといった使い方だという。プログラム側から見ると、投げるキューがグラフィックスリングなのか演算リングなのか、というだけの違いになるという。

PS4のプログラミング言語とAPI(PDF版はこちら)

 PS4 APUの大きな特徴であるOnion+とVolatile flag、8個構成のACEだが、これらがいずれもPS4だけのものかというと、そうでもなさそうだ。まず、8個構成のACEのフロントエンドは、すでにRadeon R9 290(Hawaii)にも採用されている。Volatile flagのビットも、実はGCNに実装されているという話もある。Onion+がAMD APUに入るという噂も流れた。そのため、PS4独自の技術になるかどうかは分からないが、これらの組み合わせが、それなりに効率的なのは確かだ。

2つに分かれると見られるGPUコアの内部

 PS4のGPU全体像は下の図のようになっていると推測される。フロントエンドと演算コアは明らかだが、ほかは推測となる。ジオメトリパイプはXbox Oneと同じく2本だと推測される。だとすると、ジオメトリプロセッシングとピクセルへのラスタライズの性能は、Xbox Oneと大差がないことになる。ジオメトリが2エンジンに分かれることから、GPUの内部も大きく2つに分かれると推測される。GPUコアのマルチ化は現在のGPUのトレンドだ。

PS4のGPUコア推定図(PDF版はこちら)
AMD GPUのマルチコア化の動き(PDF版はこちら)

 ROP(Rendering Output Pipeline)/レンダーバックエンドは8クラスタで32ユニットと推測されている。これは、GDDR5で176GB/secのメモリ帯域と比べると微妙なラインだ。メモリ帯域はCPUコアとの共有帯域で、それに対してROPが32でピクセルフィルレートが25.6Gpixels/secとすると、バランス的にはROPが若干多すぎてバランスが悪いかも知れない。

 とはいえ、SCEには選択肢がなく、4ユニットに分かれたメモリコントローラに対して、整数倍となる4クラスタ16ユニットのROPか、8クラスタ32ユニットのROPとなる。整数倍とならないクラスタ数の構成にすると、ROP回りの設計が複雑で非効率となる。Xbox OneはROPが半分の4クラスタ16ユニットで、これは逆にメモリ帯域に対して弱い。

 PS4もXbox Oneと同様にCUの内部を大きくカスタマイズすることはしていない。基本のCU構成はAMD設計のままだと見られる。

GCNの演算ユニット(PDF版はこちら)

独立して動作できるサブシステムチップ

 PS4全体のアーキテクチャで大きな特徴はセカンダリのサブシステムチップだ。このチップは、PCのチップセットのようなコンパニオンチップとは異なり、メインのAPUからは独立して動作できるサブシステムとなっている。ARMコアを搭載し、DRAMインターフェイスを持ち、システムメモリとして2個のDRAMが接続されている。PS4システムが省電力モードに移行した時は、このサブシステムチップだけで動作を続ける仕組みだ。ビデオ出力はメインAPU側だが、それ以外のI/Oのほとんどはサブシステムチップに集中している。

サブシステムチップ側にもCPUコアとDRAMが(PDF版はこちら)
セカンダリのサブシステムチップ側でバックグラウンド処理を実行するという発表

 そのため、本来ならサブシステムチップだけで、待機時のダウンロードやバックグラウンドダウンロードなどができる仕様になっている。ただし、現状のPS4では、そうなっていない。

 「最初はバックグラウンドダウンロードをサブだけで行なおうとしていた。しかし、一部の処理はメイン側でやらなければならなくなった。スタンバイ時にバックグラウンドダウンロードを行なうと発表しているが、その中身がどうなっているのかは発表していない。現在は、実際にはメインの一部を動かしている」と伊藤氏は説明する。

 現在はプロトコル処理など重い処理はJaguarで行なっているという。サブシステムチップ側に搭載したARMコアには、重すぎて処理が間に合わなかったようだ。そのあたりの目算を誤ったのかも知れない。そのため、せっかくのサブシステムチップの省電力効果が薄まってしまっている。ただし、この仕様は、今後、サブシステムチップ側が設計変更すると変わる可能性がある。

 PS4発表時のカンファレンスでフィーチャされたゲームプレイ動画のエンコードも、現状ではメインAPU側で行なっている。GPUが生成した描画データをバブ経由でAPU内のエンコーダに流し込み、エンコードしてからI/O経由でPCI Expressでサブシステムチップに送っているという。ワークメモリはメインメモリを使っている。伊藤氏によると、そのままでは、バックグラウンドの処理がOSのメモリフットプリントには収まり切らないため、さまざまな工夫によってゲームプレイ中でもエンコードできるようにしているという。ちなみに、BD再生もメインAPUを使っている。PS4のサブシステムチップは電力効率的には優れた試みではあるものの、当初の目的を完全に果たすことはできていないように見える。

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

 PS4のサブシステムチップは、家電メーカーらしい発想だ。明らかにAMD設計ではなく、SCE側の設計と見られる。電力効率を考えると発想的には正しいアプローチだ。

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