今年の「Hot Chips 28」の冒頭を飾ったのは、ARMの「Bifrost GPU」の発表である。学会での論文発表のプログラムは、最初に興味深い発表を持ってきて、朝から参加者が多くなるようにするというのが一般的である。ARMのBifrostの発表がトップバッターに選ばれたというのは偶然ではなく、多くの参加者が聞きたがる良い論文と評価されたからであろう。

なお、Bifrostというのは北欧神話に出てくる燃える虹の橋で、人間の世界であるMidgardと神の世界であるAsgardの間に架かっている。現在、スマートフォンなどに使われているMali T600~T800 GPUはMidgardアーキテクチャで、BifrostアーキテクチャのMali G71 GPUは、今年の終わり頃にはハイエンドスマートフォンに搭載が始まると考えられる。

Mali G71については、今年5月に発表されているが、学会での発表は、今回のHot Chips 28が最初であり、同社のフェローで、テクノロジ関係のVPであるJem Davies氏が発表を行った。

新GPUアーキテクチャ「Bifrost」について発表するARMのJem Davies氏

まず、Davies氏は、同社のMali GPUは2015年には7億5000万コア出荷され、世界で出荷量ナンバーワンということをアピールした。

Mali GPUは2015年には7億5000万コア出荷された。これはスマートフォンでは約40%、タブレットでは約50%、デジタルTVでは約75%のシェアで達成されている (この記事の図はすべて、Davies氏の発表スライドのコピーである)

そして、初代のUtgardアーキテクチャは、頂点シェーダとピクセルシェーダが分離されたアーキテクチャであったが、2代目のMidgardアーキテクチャでは、両方が共通のユニファイドシェーダとなり、今回のBifrostアーキテクチャでは、スカラISA、Clause実行に代わったと説明した。

初代のUtgardアーキテクチャ、2代目のMidgardアーキテクチャを経て、今回のBifrostアーキテクチャに進化している

技術的に見て一番大きな変更は、Bifrostではシェーダコアの設計を従来のSIMDから、スカラのクローズ(Clause)ベースの命令を処理するようにしたことである。また、シェーダコアの最大搭載数を32個と倍増し、ジオメトリデータの流れを変更して、必要メモリバンド幅やメモリ使用量を減らしたことも性能向上に寄与している。

結果として、同一の半導体プロセスで作ったMali-T880と比較して、エネルギー効率は20%改善し、メモリバンド幅は20%改善、面積当たりの性能は40%改善したとのことである。

Bifrostでは、シェーダコアの作りをスカラのClauseベースアーキテクチャに合わせて設計を変更した

Bifrost GPUでは、シェーダコアが最大32個並ぶ構成が取れるようになった。そして、メモリはL2キャッシュとメモリコントローラが1対1になるメモリサイドキャッシュ構成を取り、4チャネルのメモリをサポートしている。

そして、次の図に見られるように、ジョブマネージャが32個のシェーダコアでの実行を制御し、MMU(Memory Management Unit)と画面をタイルに分割して描画処理を行うタイラーがあるという構成になっている。

最大32個のシェーダコアと4チャネルのメモリインタフェースを持つ。それにジョブマネージャ、MMU、タイラーなどがある

シェーダコアは3つの実行エンジンを持っている。各実行エンジンは、Quadと呼ばれる4つの演算を並列に実行することができる。大まかに言うと、1個のシェーダコアはNVIDIAのCUDAコア12個分の演算ができる。

そして、コンピュートフロントエンドと対のQuad Creatorが計算用のQuadを作り、フラグメントフロントエンドと対のQuad Creatorがピクセル処理用のQuadを作って、Quadマネージャに実行命令を供給する。

シェーダコアは、その他にLoad/Storeユニット、Attributeユニット、Varyingユニット、Textureユニット、Blender&Tileユニット、Depth&Stencilユニットなどを持っている。Depth&StencilユニットはDepthやStencilを処理するためのZSメモリに繋がっている。

シェーダコアは3つの実行エンジンとLoad/Storeユニット、Attributeユニット、Varyingユニット、Textureユニット、Blender&Tileユニット、Depth&Stencilユニットなどを持っている

次の図は、現在のMidgardアーキテクチャのGPUの実行状況を示す図で、各サイクルには1つのスレッドの命令を実行する。そして、1つのスレッドから、命令の順序を入れ替えたりして、4つの並列に実行できる命令を見つけて、まとめて実行できるようにするのは、コンパイラの役目である。しかし、必ずしも4つの並列に実行できる命令が見つかるとは限らず、次の図のようにLane 3では実行すべき命令がなく、演算器が遊んでしまうということが起こる。

Midgard GPUではサイクルごとに1つのスレッドを実行する。しかし、コンパイラが並列に実行できる4つの命令を常に見つけられるとは限らない