後藤弘茂のWeekly海外ニュース
PlayStation 4のGPUコンピュート機能
(2013/4/22 00:00)
チップレベルでの差別化が難しい現在のゲーム機
ソニー・コンピュータエンタテインメント(SCE)がPLAYSTATION 3(PS3)を開発した時、そのポリシーは既存のCPUより10倍高性能なCPUを作ることにあった。実際、PS3のCell Broadband Engine(Cell B.E.)のチップ全体のスループットは、当時のPC向けCPUに対して10倍程度に達した。
Cell B.E.の衝撃は大きく、IntelやAMDなどCPUベンダーはCPUコアを肥大化させてシングルスレッド性能を追求する方向から、マルチコアに転じた。一方、GPUベンダーは、GPUコアをCell B.E.のように汎用に使うというアイデアを推し進めた。その結果、現在のクライアントCPUの多くは、程度の差はあれ、マルチコアCPUと汎用性の高いGPUコアという組み合わせになっている。モバイルデバイス向けのアプリケーションプロセッサにも同じ波が押し寄せている。そのため、汎用デバイスのコンピューティング性能は膨れあがり、PC向けCPUもワンチップでTFLOPSのレベルに上がろうとしている。
こうした状況では、ゲーム機向けにフルカスタムでチップを設計しても、汎用デバイスの10倍の性能を達成することは難しい。具体的に言えば、ワンチップ10TFLOPSのプログラマブルなチップを作ることは不可能だ。半導体チップ側からは、現在のゲーム機のチップが、汎用アーキテクチャのカスタム化に向かっているのは必然に見える。
皮肉にもCell B.E.の衝撃で変貌した汎用デバイスは、今やゲーム機と同じ方向に向かっており、そのために、ゲーム機がチップレベルで差別化を図ることが難しくなっている。PS4が、CPUコアやGPUコアをゼロから開発しないで、汎用アーキテクチャのカスタム化に留めたのは、そうしなければ得られるパフォーマンスに対する開発投資が見合わないからだ。また、小さな高スループットコアにオフロードするというCell B.E.の発想を受け継ぐアーキテクチャとして、CPUコアからGPUコアにオフロードできるAPU型のアーキテクチャを選んだのも必然と言える。APUの構成は、ある程度はCell B.E.からインスパイアされたものであるからだ。
Cell B.E.の発想を受け継ぐAPU GPUでのコンピュート
ハードウェア的にはPS4のAPUのGPUコアは、18個のCU(Compute Unit)を備えており、ACEs(Asynchronous Compute Engines)と呼ばれるユニットが、コンピュートのためのタスクのセットアップと、各CUへのワークのディスパッチを行なう。GPUはCPUと異なり、各コアへのワークの発行はソフトウェアではなくハードウェアで制御している。以前も説明したが、PS4のAPUの大きな拡張ポイントは、GPU上で汎用プログラムを走らせるコンピュートのためのディスパッチャの部分にある。
AMDのハイエンドGPUではACEは2ユニットでコンピュートタスクのディスパッチが非常に弱いが、PS4ではこの部分が著しく強化されており、多数のワークのディスパッチを並列で行なうことができる。また、PS4のACEsには64個のキューがあり、多数のワークをハンドルすることができる。PS4では、GPUコアをコンピュートで使う場合に、細粒度に柔軟に使うことができるようになっている。これは、PS3で、Cell B.E.の各SPUを個別に異なるスレッドで動作させたのとやや似ている。
ちなみに、上の図でグラフィックス固定機能パイプラインが2つになっているのは推定。PS4のGPUは、CUが18なので、おそらく物理的には20個のCUを備えており、歩留まりを上げるために2個のCUをリダンダンシとしていると見られる。ただし、AMDのGCN(Graphics Core Next)では通常は4個のCUで1クラスタを構成しているため、数字的には5クラスタで20個のCUという構成がありそうだ。しかし、その場合は、グラフィックスパイプが2個は合理的に考えておかしい。処理分割を考えると、下のCUのクラスタは偶数で2分割できるようになっている方が、2グラフィックスパイプでの制御が容易になるからだ。このあたりの詳細は、まだ分からない。
PS4では、GPUコアでコンピュートとグラフィックスを並列で走らせることができるが、これは、AMDが以前からハードウェア的にはできると明言している機能だ。PS4のソフトウェア層で、コンピュートとグラフィックスの並列化が可能になったと見られる。また、PS4ではCPUコアとGPUコアがそれぞれのメモリにダイレクトにアクセスができる。これも、AMDが次世代のAPUで実現するはずの機能だ。しかし、パフォーマンスを引き出すには、現在、ボトルネックとなっている「Onion(オニオン)」の部分の拡張が望ましい。
AMDのAPUには、GPUとメモリインターフェイスの間に2系統のバスがある。Onionは、CPUのメモリバスを経由するバス「Fusion Compute Link (FCL)」とも呼ばれる。もう1つGPUコアとDRAMコントローラを直結する「Garlic(ガーリック)」の通称で呼ばれる「Radeon Memory Bus(RMB)」がある。Garlicはフルスピードのアクセスが可能だが、Onionは相対的にかなり遅いバスとなっている。
ちなみに、以前のレポートでは、PS4 APUのI/O部分が不明としていたが、AMDブログの説明ではPS4 APUがディスプレイアウトなどもフルに備えているとなっているため、通常のAPUのI/O回りのブロックを図に描き加えた。PS4 APUのPHYが、正確にこのような構造になっているかどうか分からないが、遠くはないはずだ。
コンピュートの言語はシェーディング言語で兼用
Cell B.E.の発想をある程度受け継ぐPS4のAPU。しかし、CPUとしてローレベルのアクセスが可能だったCell B.E.のSPU(Synergistic Processor Unit)に対して、GPUを統合したAPUは、プログラミング面では大きく話が違っている。
PS4のGPUコアに対してソフトウェアがアクセスする道はいくつかある。グラフィックスの固定機能については、ローレベルAPIとラッパーAPIの2層のインターフェイスが提供され、汎用OS上のインターフェイスよりローレベルのアクセスが可能となっている。ゲーム機の場合は、異なるハードウェアを抽象化する必要がなく、単一プラットフォームであるためAPIをよりダイレクトにできる利点がある。
グラフィックスのシェーダ(プログラム)については、新しいシェーディング言語「PlayStation Shader Language (PSSL)」が採用された。GDC時の説明では、PSSLはMicrosoftのシェーダ言語であるHLSL(High Level Shading Language)とよく似ているとされている。HLSLはもともとNVIDIAの最初のシェーダ言語「Cg(C for Graphics)」とよく似ていた。CgはPS3の時にも採用されている。そのため、PSSLはその系統の言語からの拡張と見られる。
重要な点は、GPU上で汎用プログラムを走らせるコンピュートについても、PSSLでサポートされるとしているとしていることだ。アプローチとしてはシェーダ言語を拡張してコンピュートをサポートするスタイルのように見える。この場合、PSSLが果たしてPS4 GPUコアのコンピュートの機能を十分に引き出すことができるのかどうかに疑問符がつく。そうした懸念を払拭するためか、SCEAではコンピュートの機能としてはDirectX(Compute)やOpenCLを越えると説明している。しかし、既存のプログラミング言語からのアクセスを重視する最近のGPUコンピューティングの方向とはずれている。
コンピュートでもアセンブラアクセス?
もっとも、実際にはゲーム機では、プログラマブルハードウェアにアセンブラレベルでアクセスできるのが一般的だ。GPUコアについても、アセンブラインターフェイスでアクセスできるようにするなら、話は違ってくる。コンピュートのプログラミングの難度は増すが、機能の露出的には問題がなくなるはずだ。ただし、GPUに対するアセンブラコーディングを可能にするためには、SCEがアセンブラをサードパーティに対しても公開する必要がある。それがないと、SCE自体はアセンブラコーディングができても、サードパーティはできないといった形になるかも知れない。
これまでのゲーム機の流れで行くなら、GPUコンピュートに対するアセンブラは必須だ。なぜなら、ハードをできるだけローレベルで叩くことでハードのパフォーマンスを引き出し、厚いソフトウェア層に包まれた汎用デバイスと差別化することがゲーム機の命だったからだ。特に、ゲーム機を5年あるいはそれ以上同じスペックで保つなら、途中の3年後あたりからは低いレベルでハードにアクセスできる経路は必須となる。そうした背景を考えるとSCEはアセンブラを出さざるをえないかもしれない。
しかし、よく考えてみると、GPUコアのCU自体は、AMDのGCNアーキテクチャそのままだ(拡張されたのはワークディスパッチャのレベル)。だとするとAMDのアセンブラでそのまま通る可能性が高い。それなら、コンピュートでも開発者は、やる気になればAMDのGPUコアにそのままアクセスできることになる。コンピュートでも、ローレベルでのアクセスが可能になる。
もちろん、GPUなので完全にハードウェアが露出するわけではないが、よりハードウェアに近いアクセスであるため、今後、PS4のハードウェアが世代交替し、もし、GPUコアの世代間の移行が行なわれると、若干の問題が発生する可能性が出てくる。また、ハードウェア側にエラッタがあった場合も露出してしまう場合があるので、エラッタの情報を出さなくてはならない。
このように、PS4のGPUコアのコンピュート機能へのアクセスでは、今の段階でも、まだ疑問がいくつも残る。ただし、ハードウェア的にはPS4のGPUコアは、ワークディスパッチャの大幅な強化などコンピュートのための機能拡張がなされている。そのため、ソフトウェア層の整備が進めば、コンピュートの利用が加速する可能性がある。
PS4のOSは、すでに報道されているようにFreeBSDで、SCEの従来のゲームOSの系統ではない。ここは予想と大きく異なっていた。
PS4のソフトウェア層で1点面白いのは、LLVM(Low Level Virtual Machine)を使っていること。単一プラットフォームのPS4でLLVMは奇妙に見えるかも知れないが、言語サポートを容易にするためだという。LLVMのオープンコミュニティの力を使って、より短時間で言語をサポートできるようにする。開発環境はVisual Studioに統合されたツールで、ディストリビューテッドビルドがサポートされている。