AMDが打ち出した新GPU戦略「OpenGPU」 AMDはGPUのソフトウェア層を根底から変革する。GPUのソフトウェア層を上から下まで全てオープンソース化する「OpenGPU」を打ち出した。OpenGPUの元では、開発者がドライバを含めたソフトウェア層を修正することが可能になる。例えば、ディープラーニングのニューラルネットワークに最適化した独自バージョンのドライバなど、特定の用途に最適化したGPUソフトウェア層が開発可能になる。 新しいオープンソースソフトウェアスタックでは、CまたはC++のシングルコードから、CPUとGPUそれぞれのコードをコンパイラで自動生成する。また、オープンソース化と連動して、AMDはLinuxプラットフォームを重視する戦略も打ち出した。さらに、AMDは、従来のAPU(Accelerated Processing Unit)にフォーカスしたHSA(Heterogeneous System Architecture)戦略を修正、ディスクリートGPUとAPUをHSAの枠組みで同レベルに扱うようにする。 伝統的なGPUのプログラミングモデルは、ブラックボックス化されたソフトウェアスタック越しにアクセスする、非常に限定されたものだった。GPUの過去10年の進化は、ざっくり言えば、分厚いソフトウェア層を、ダイレクトに近いものに、いかに変えて行くかという流れだった。今回のAMDのオープンソース化戦略は、その方向性の最終的に行き着いたものだ。従来は企業秘だった部分まで公開してダイレクトなアクセスを可能にすることで、オープンソースコミュニティの支援を得て、ソフトウェアの性能、成熟度、使いやすさの向上を図ろうとしている。ソフトウェア開発にかけられる資金に限りがあるAMDの起死回生の策と言える。

よりダイレクトなアクセスの行き着いた先 グラフィックスでのオープンソース戦略は、今までのステップを振り返れば自然な流れだとAMDは説明する。GPUのプログラミングモデルは、従来はダイレクトに近いGPUアクセスが可能なゲームコンソールと、ブラックボックス化された分厚いソフトウェア層越しにGPUにアクセスするPCに二分されていた。ゲーム開発では、ハードウェアの性能をフルに引き出したいため、ダイレクトなモデルが使われていた。Radeonは、PCだけでなく、PlayStation 4(PS4)、Xbox 360/One、Wii Uとゲームコンソールにも幅広く使われているが、プログラミングモデルは異なっていた。また、各プラットフォーム毎に分断され、コードがシェアできないという問題もあった。 この問題を解決するために、AMDはPCに、よりダイレクトなAPI「Mantle」を発表。Mantleに刺激されて、DirectX 12やVulkanなどのダイレクトAPIが登場した。そこで、このコンセプトを進めて、GPUをさらにダイレクトにコントロールできるようにしようというのが、今回のオープンソース化だと位置付ける。GPUの上のほとんどのソフトウェア層のソースコードに、フルにアクセスできるようにする。オープンソースの開発者コミュニティの支援を得て、AMD 1社ではできないことを実現する。 OpenGPUには、ローレベルのスタックから、上位のエフェクトやツール、ライブラリ類やSDK(Software Development Kit)までを含む。ゲーム開発者によく知られている「TressFX」のようなエフェクトも含まれる。こうした側面だけを見ると、AMDのアプローチはNVIDIAのGameWorksの後追いのように見える。 しかし、AMDは、コントラクトを結んでいない開発者にも広くオープンされている点が異なると説明する。ブラックボックス化されていたエフェクトやツール、ライブラリのソースにアクセスできるようにすることで、開発者に自由度を与えるという。これらのリソースは、オープンソースコミュニティで幅広く使われているGitHubで来年(2016年)1月からホストされる。また、ポータルも設置される。ライセンス形態は、制限が最も緩いMITライセンスだ。

GPUコンピュートがオープンソース戦略の真の狙い AMDのオープンソース戦略の本当の狙いは、グラフィックスよりもコンピュートの方にある。GPUをCPUのように扱いたいGPUコンピュートのプログラマーに、よりダイレクトで自由度の高いGPUアクセスを提供する。 AMDは、GPUコンピュート面でのオープンソース化戦略について、スーパーコンピュータの学会「SC 15」で、「Boltzmann Initiative(ボルツマンイニシアチブ)」として、既に部分的に発表を行なっている。下のスライドの人物像は、統計力学の祖として有名な19世紀の科学者ルートヴィッヒ・ボルツマン氏。現在のディープラーニングのニューラルネットワークの始祖的なアルゴリズムである「ボルツマンマシン」の名前の由来になった人物だ。ボルツマンの名前を冠したところに、ディープラーニングでのGPUコンピュートの興隆を狙う意図が明確に見えている。 ボルツマンイニシアチブは、3つのピースからなる。ディスクリートGPU向けの低レイテンシのGPUコンピュート向けのLinuxドライバ、GPUとCPUを統合するオープンソースのC++コンパイラ「Heterogeneous Compute Compiler(HCC)」、CUDAからC++へコンバートしてAMD GPU上で走らせることを可能にする「Heterogeneous-compute Interface for Portability (HIP)」だ。 ここでのポイントは3つ。まず、これまでHSAではAPUを中心に据えていたAMDが、HSAフィーチャをサポートするGPUコンピュートに最適化したドライバを、ディスクリートGPU向けにも提供すること。APU中心から、APUとディスクリートGPUの両輪への戦略転換を象徴する。AMDは9月に組織変更を行ない、ディスクリートGPUビジネスの「Radeon Technologies Group(RTG)」を編成した。ディスクリートGPU重視の組織変更と連携した動きだ。 2つ目はOpenCLにフォーカスしていたAMDがC++も積極的にサポートする方向を明確にしたこと。ハードウェア的には「AMD Radeon R9 290(Hawaii)」の時からC++サポートの方向だったが、新コンパイラの提供で鮮明になった。3つ目としては、シングルソースからのCPUとGPUの両コードの生成で、ヘテロジニアスプログラミングを容易にすることだ。

CLANGフロントエンド/LLVMバックエンドのインフラを利用 AMDのオープンソースコンパイラスタックは、CLANG/LLVMのオープンソースコンパイラインフラストラクチャの上に乗っている。C++の単一ソースコードから、Heterogeneous Compute Compiler (HCC) C/C++コンパイラフロントエンドが中間コードに落とし込む。LLVMバックエンドで、中間表現からGPUネイティブに最適化コンパイルする。GCN(Graphics Core Next)アセンブラで最適化したいプログラマのために、GCNアセンブラアクセスも提供する。下のスライドの左側がフロントエンドのフローとなっている。 スライドの右側はドライバスタックの実行フローで、Heterogeneous Compute Compiler(HCC)ランタイムから、低レイテンシドライバスタックに渡す。ドライバのコアであるカーネルモードドライバ(KMD)「AMDGPU」がGPUハードウェアに最も近い層にある。AMDは、KMDもオープンソース化して行くとしている。言い換えれば、GPUを丸裸にすることになる。

Linuxをファーストシチズンに AMDの今回のオープンソース戦略でもう1つ重要な点は、Linuxを重視する姿勢を打ち出したことだ。オープンソースだから当然と言えるが、今後はLinuxを、Windowsと同等の「ファーストクラスシチズン」として扱うとAMDは宣言する。AMDとしては、HPCやデータセンタから組み込みやモバイルまで広がるLinuxのサポートを、今後の核としたいところだ。AMD自体の企業戦略は、PC市場依存から、サーバーや組み込みに向けて広げることにあり、そのためにはLinuxは欠かせないソフトウェアプラットフォームだ。 AMDのLinuxドライバモデルでは、カーネルモードのAMDGPUが基盤となる。オープンソースだが、修正はアップストリームでAMDに還流される仕組みを取る。AMDGPUは、2015年以降のAMD APUとGPUの両方をカバーするベースカーネルドライバとなる。 AMDGPUドライバは、幅広いLinuxディストリビューションでサポートされ、UbuntuやFedoraに統合される。AMDは、現在、LinuxにオープンソースのRadeonユーザーモードドライバ(UMD)と、クローズドなCatalystユーザーモードドライバを提供している。これらは、それぞれ異なるカーネルモードドライバを使っている。しかし、今後は、統合されたAMDGPUオープンソースカーネルモードドライバとなる。そのため、新GPUのフィーチャは、迅速にオープンソースの世界でも使うことができるようになる。オープンソース化したけれど、アクセスできるフィーチャは古いものだけ、といった制約はない。 また、AMDGPUのベースカーネルモードドライバ上で、オープンソースのユーザーモードドライバとクローズドのユーザーモードドライバの両方をサポートする。クローズドなのはOpenGLなどだ。クローズドかオープンかに関わらず、同じベースのランタイムとHSAカーネルを使う。