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

ARMが力を入れるGPUアーキテクチャ「Midgard」



●GPUアーキテクチャに注力し始めたARM

 ARMはモバイル機器向けの組み込みCPUコアでは強力なシェアを誇る。しかし、同社はCPUコアに留まらず、GPUコアも強化し始めた。その目的の1つは、CPUコアとGPUコアを連携させるヘテロジニアスコンピューティングによって、パフォーマンス/電力を高めることにある。そのため、ARMの新世代のGPUコアは、汎用コンピューティングの機能を充実させている。NVIDIAやAMDと同等か、機能によっては汎用度で上回る部分さえある。

 ARMは、ノルウェーのトロンハイムにあったGPUベンチャーFalanxを2006年に買収。それ以来、Falanxが開発したMaliブランドのGPUコアを発展させて提供してきた。Mali-200、Mali-400MP、Mali-300の「Utgard(ウトガルド)」ファミリがそれで、メインストリームのコンシューマ製品をターゲットとしている。SamsungのAndroidスマートフォン「Galaxy S II」になどに採用された。

Maliシリーズの概要

 しかし、Utgardシリーズは、基本は垂直型のグラフィックスパイプライン構造を取るアーキテクチャだった。頂点シェーダとフラグメント(ピクセル)シェーダをそれぞれ個別に持つアーキテクチャで、PC向けCPUで言えばDirectX 9までの世代のアーキテクチャに近い。そのため、非グラフィックス処理への汎用性は低かった。そこで、ARMはアーキテクチャを一新、PC向けGPUと同じユニファイドシェーダアーキテクチャを開発した。それが「Midgard(ミッドガルド)」シリーズだ。

 ちなみに、ウトガルド(巨人の都)とミッドガルド(中つ国:人間の世界)は、いずれも北欧神話に登場する地名。ARMのGPU開発拠点の中核は、依然としてノルウエーにあるため、北欧神話からコードネームが取られているという。

Midgardの名前の由来

 Midgardアーキテクチャの最初のGPUは、昨年(2010年)11月に発表された「Mali-T604」。第2世代が、今年(2011年)11月に世界に先駆けて日本で発表された「Mali-T658」だ。T658はT604と同じMidgard系だが、大きく発展させたアーキテクチャとなっている。ARMは1年置きにGPUコアアーキテクチャを刷新する予定で、しばらくはMidgardの発展系が続くと見られる。

 Mali-T604は2012年のタブレットなどハイエンドモバイルをターゲットにしたGPUコアだ。ARMの次世代高パフォーマンスCPUコア「Cortex-A15」と対になる。次の世代のためのGPUだ。

●GPUコンピューティングの機能が充実したMidgard

 Midgardアーキテクチャの特長は、汎用コンピューティング向けの機能を充実させつつ、グラフィックスの効率性も維持しようとしている点にある。汎用コンピューティングでは、64-bit倍精度浮動小数点演算や64-bit整数演算、64-bitアドレッシング、シェーダコア間のメモリコヒーレンシ、CPUとのメモリコヒーレンシ、OpenCL 1.1フルプロファイルサポート(組み込み系では互換性の低いエンベデッドプロファイルが多い)、などが挙げられる。NVIDIAやAMDの次期コアと同程度のレベルの、汎用コンピューティングへの最適化を行なっていることがわかる。モバイル市場でライバルとなるImagination TechnologiesのPowerVRが、どちらかといえば汎用コンピューティングへの最適化に慎重に構えていることとは対照的だ(PowerVRも次世代は大きく変わる)。

Midgardシリーズの特徴

 その一方で、演算パイプラインはグラフィックスに向いた128-bitのベクタエンジンを備えている。NVIDIAやAMDの次期コアが、ベクタエンジンを分解してスカラエンジンのSIMD(Single Instruction, Multiple Data)構成へと組み替えたこととは対照的だ。また、グラフィックスAPIも、第一線のDirectX 11をサポートする。ただし、テッセレーションは専用ハードウェアによる実装ではなく、シェーダコアを使ったソフトウェア実装となる。

 スケジューリング機能もMidgardの特長だ。GPUコア内部に充実したジョブマネージャとタスクスケジューラを備え、多数のスレッドを並列に走らせることでコアの稼働率を上げている。ジョブマネージャはパワーマネージメントユニットと一体化されており、使わないユニットをシェーダコア単位でパワーゲートすることで、電力をセーブする。

 また、Midgardは、PC向けGPUのような一定粒度のSIMD型のコントロールも行なわないという。分岐粒度も1だとARMは説明している。

●ARM CPUとよく似たGPUのマルチシェーダコア構造

 Midgardの最初のアーキテクチャであるMali-T604は、ラフに示すと下の図のような構造をしている。全体のジョブや電力制御を管理するジョブマネージャがフロントエンドにあり、そこからジョブを分解したタスクがシェーダコアにディスパッチされる。シェーダコアは最大4個で、それぞれのシェーダコアは独立して制御されている。グラフィックスやコンピューティングのシェーダタスクは、全てシェーダコアで実行されるユニファイドシェーダアーキテクチャとなっている。

Mali-T604の構造
PDF版はこちら
ジョブマネージャの仕組み

 シェーダコア群はL2キャッシュを共有しており、スヌープコントロールユニット(SCU)によって、シェーダコアそれぞれが内蔵するキャッシュのコヒーレンシも保たれている。この構成は、Cortex-Aシリーズのマルチコア構造とそっくりだ。ARMはCPUでの経験をGPUにも持ち込んだと説明している。

 ARMのGPUはタイリングアーキテクチャを取っており、階層型のタイリング制御を行なっている。これはタイラーによって管理されている。メモリマネージメントユニット(MMU)は、ARMv8から導入される64-bitメモリアドレッシングもサポートする。

 GPUコア自体はARMの新しいCPUバスであるAMBA4に接続される。AMBA4のキャッシュコヒーレント機能を利用することで、GPUコアがCPUキャッシュをスヌープすることも可能だ。そのために、CPUからGPUへのデータ移動はコヒーレントバス経由が可能で、メモリに書き出す必要がなく、低レイテンシかつ低消費電力に行なうことができる。ただし、CPU側からGPUへはスヌープはできない。

●スレッドスケジューラが制御するシェーダコア

 Mali-T604の実行エンジンであるシェーダプロセッサコアは、下の図のような構造となっている。演算パイプ(Arithmetic Pipe)が2本に、ロード/ストアパイプが1本、テクスチャパイプが1本の構成だ。3種類のパイプラインで構成することから、ARMでは「トライパイプ」と呼んでいる。パイプラインの長さの違いは、実行レイテンシの違いを概念的に示している。

Mali-T604のシェーダコア
PDF版はこちら
3種類のパイプライン構成

 各シェーダコアは、独立したスレッドスケジューラを持つ。ジョブスケジューラが、各ジョブをスレッドに分解してシェーダコアに割り当てる。スレッドスケジューラは、それぞれのスレッドのプログラムからの命令を、それぞれのパイプラインに割り当てる。

 ARMのJem Davies氏(ARM Fellow, VP of Technology, Media Processing Division, ARM)は「それぞれのパイプラインは、それぞれ別なスレッドからの命令を実行する。128個のパイプラインがあれば、128スレッドを同時に走らせることができる」と説明する。ARMのスライドでは、グラフィックスの頂点とピクセル、コンピュートのそれぞれのタスクを混合して走らせる構造が示されている。PC向けGPUにあるような、1つのシェーダコアに一度に走らせることができるカーネルが1つに限られるといった制約はない。

 スレッドがメモリ待ちである間は、別なスレッドの命令を走らせる。リソースが利用可能なスレッドの命令から、スレッド順はアウトオブオーダで命令を発行できると言う。Mali-T604のシェーダコアでは、200以上のスレッドを、インフライトで制御できる。

 シェーダコアのレジスタファイルの構成はよくわかっていない。ARMの図を参考にした上の図で示したように演算パイプ毎に分離されたレジスタファイルを備える場合は、それぞれのスレッドは同じ演算パイプで走らせる必要がある。これはスケジューリングの制約となる。それに対して、演算パイプが共有レジスタを持つ場合は、それぞれのスレッドはどの演算パイプでも走らせることができる。レジスタとの配線の複雑度は、GPU設計の泣き所の1つであるため、ハードウェア設計を容易にしようとすると個別レジスタ構成を取ることになる。ちなみに、NVIDIAは共有レジスタ、AMDの次世代アーキテクチャは個別レジスタを取る。

●64-bit倍精度浮動小数点演算もサポート

 シェーダコアの中の演算パイプは、ベクタユニットとスカラユニットのペアで構成されている。ARMによると、ベクタ命令とスカラ命令の同時発行が可能だと言う。この場合の2命令は、同一スレッドの連続する命令だと推測される。

 演算ユニット中のスカラユニットは32-bit、ベクタユニットは128-bit SIMDだ。Midgardのベクタユニットの大きな特長は、CPUのベクタユニットと似たような構造になっている点。浮動小数点演算なら、16-bit幅のFP16、32-bit単精度のFP32、64-bit倍精度のFP64までをサポートする。FP64の場合は2-wayのベクタとなる。PC向けGPUでさえ全てがサポートするわけではない倍精度のサポートは、汎用コンピューティングではCPUとの共通性が必要だと見るARMの思想を反映している。

Mali-T604では倍精度浮動小数点数をサポートする

 整数演算も同様で、16-bit/32-bit/64-bitがサポートされており、さらに8-bitも可能だ。これは、カメラなどからの8-bitピクセルの処理のようなメディアプロセッシングで威力を発揮する。GPUのベクタユニットは、整数演算機能が弱い場合が多いが、Midgardでは浮動小数点演算と同等の整数演算機能を備えている。

 ロード/ストアパイプは、汎用メモリアクセスのためのパイプラインだ。128-bit幅のロード/ストアをサポートし、レンダターゲットへのリード/ライトもこのパイプが受け持つ。アトミックオペレーションをサポートする。テクスチャパイプは、テクスチャフェッチ&フィルタのためのユニットだ。

 下のスライドは、Mali-T604の4シェーダコア構成のフロアプランだ。ダイエリアはわからない。ARMのSteve Steele氏(Product Manager, MPD)によると、グリーンとブルー、パープル、それに右下のイエローの4エリアがそれぞれシェーダコアだという。左端はフロントエンドでジョブマネージャを含んでいる。

Mali-T604のフロアプラン

●Mali-T658ではGPUコアグループを2重化

 第2世代のMidgardアーキテクチャであるMali-T658は、Mali-T604の基本アーキテクチャを発展させたものとなっている。下がMali-T658の全体構成だ。Mali-T604の4シェーダコアに対して、Mali-T658は8シェーダコアとなっている。

Mali-T658の構成
PDF版はこちら
Mali-T658の概要

 Mali-T604では、4個のシェーダコアとL2キャッシュを備えたコアグループを1個備えていたが、Mali-T658はグループ数を2倍にしている。4個のシェーダコアとL2で構成されるコアグループを2個備える。言ってみれば、デュアルGPUのような構成となっている。

 ただし、2個のコアグループは単一のジョブマネージャで統合されている。単一のディスパッチャから、ロードバランスでタスクがそれぞれのグループにディスパッチされるという。シェーダコア間のメモリコヒーレンシは、コアグループ内のコア間に関してはスヌープコントロールユニット(SCU)によって保たれる。ただし、コアグループ同士は、スヌープユニットもL2キャッシュも分離されている。グループ間のコヒーレンシは、AMBA4バスを経由して保たれる。そのため、ジョブの割り振りはグループ構成に最適化する必要があると見られる。

 Mali-T658はシェーダコアの中もMali-T604より拡張されている。下がシェーダコアの構成図だ。Mali-T604では2個の演算パイプだったのが、Mali-T658では4個の演算パイプへと倍増されている。命令発行ポート数がMali-T604よりも増えているが、各パイプへと異なるスレッドの命令を発行するなら、命令発行ポート数を増やすことは比較的簡単だ。

Mali-T658のシェーダコア
PDF版はこちら

 このように、Mali-T604からMali-T658では主に演算リソースの強化が図られている。Mali-T658の4シェーダコア構成では演算パイプは8本であるのに対して、Mali-T658の8シェーダコア構成では演算パイプは4倍の32本となる。ロード/ストアユニットは増えていないため、ロード/ストアと演算の比率は2分の1に下がると推測される。

Mali-T604とT658の比較
PDF版はこちら

 Mali-T658を見ると、2グループに分離されたGPUコアなど、まだ充分に整備されているとは言いにくい部分も見える。また、GPUアーキテクチャの潮流は、Midgardのようなショートベクタ(Midgardでは128-bit)から離れつつある。Midgardアーキテクチャが本当に、ダイ面積などの面で効率的なのかどうかは、まだわからない。PowerVRにどこまで対抗できるか、不鮮明だ。

 しかし、ARMにとってMali-T658は、まだユニファイドシェーダの2世代目に過ぎない。ARMが力を注ぐなら、今後もアーキテクチャは変わって行くと推測される。最も重要な点は、ARMが、プロセッサの効率とパフォーマンスを高めるためには、ヘテロジニアスコンピューティングに舵を切らなければならないと判断した点だ。汎用コンピューティングに、かなりフォーカスしたMidgardアーキテクチャは、そうした思想に沿ったアーキテクチャで、方向性自体は、おそらく間違えていないだろう。