これに対して、Bifrostアーキテクチャでは、前の図と次の図を見比べると、実行の順番が90度回転している。1サイクルには、1つのスレッドの命令を実行するのではなく、サイクル1には4つのスレッドのxを処理する命令、サイクル2には4つのスレッドのyを処理する命令のように実行する。各演算器(Lane)は1つのスレッドの命令だけを実行する。これは、スカラ処理の場合と同じ実行である。

前の図ではLane 3は遊んでいたが、このように実行すると、次の図に示すように、すべてのLaneが使われ、3サイクルですべての処理が終わっている。

これに対して、Bifrostアーキテクチャでは、実行のやり方を90度回転し、サイクル1では、4つのスレッドの最初のxを計算する命令、サイクル2では2番目のyを計算する命令のように実行する

この実行方式は、SIMT(Single Instruction Multiple Thread)方式であり、NVIDIAが最初に採用したのであるが、現在では、AMDのGCNアーキテクチャのGPU、IntelのHD Graphics Gen 9、そして、今回のARMのBifrost GPUと、主要GPUのほとんどがSIMT実行に切り替わっている。

Bifrostの実行ユニットは4つの32ビット乗算を並列に実行するFMAと4つの32ビット加算を並列に実行するADD/SFで構成されている。加算器は、逆数や平方根などを計算するSF(Special Function Unit)と一体化して作られている。そして、メインレジスタから入力オペランドを読み、演算結果をメインレジスタに書き込む。

実行エンジンは4つの32ビットの乗算を行うFMAと4つの32ビットの加算を行うADD/SFで構成される。加算とSpecial Function Unitは一体に作られている

実行エンジンは32ビットのfloat32データだけでなく、半分の長さのfloat16の2つの演算を並列に実行することができる。また、整数の演算の場合は、1つのint32演算、2つのint16演算、4つのint8演算を行うことができる。

スマートフォンなどでは、消費電力を低く抑えるため、シェーダの演算は必要な精度が得られる最低のビット数で行うのが一般的で、16ビットや8ビットの演算も多用されるので、このような構成が採られている。

演算器はfloat32だけでなく、int32の演算もできる。また、16ビットのfloatやint、8ビットのint演算を並列に実行することもできるようになっている

Bifrostアーキテクチャでは、必ず連続して実行される命令の列をクローズと呼び、クローズの終了時にはメインレジスタなどにアーキテクチャ状態が格納されているように動作させる。一方、クローズの中では演算結果をメインレジスタには書き込まず、テンポラリレジスタでデータを受け渡すことができるアーキテクチャとなっている。テンポラリレジスタを使うことにより、メインレジスタよりも使用エネルギーが少なくて済み、消費電力を減らすことができる。

Bifrostアーキテクチャのキーポイントであるクローズ実行

次の図の左が通常のソースコードで、最初にr0にロードを行い、依存関係があるFADD.32命令が6個続いている。そして、最後にr0の値をメモリにストアしている。

中央のコードはクローズコンパイルを行った例で、ロード命令を1つのクローズとし、その他の命令をまとめて2番目のクローズにしている。そして、2番目のクローズは、ロードが終わるのを待つwait指定が付けられている。

右側のコードは最初のロードを1番目のクローズ、6個の連続したFADD命令を2番目のクローズ、最後のストア命令を3番目のクローズとしている。2番目のクローズの中ではメインレジスタに正しいアーキテクチャ状態が書き込まれることを保証しなくても良いので、テンポラリレジスタ(tの付いたレジスタ)を使っている。

そして、ストアは最後のFADDの結果を入力オペランドとして使っているので、中央のコードでは待ち時間が長くなる可能性がある。このため、右側のコードでは、ストアは別クローズとして、スケジューリングの自由度を上げている。

Bifrostアーキテクチャでは、クローズ単位で命令実行をスケジュールする。クローズの中ではテンポラリレジスタを使ってデータを受け渡すことができる

1つのタイルに入ってしまうトライアングル、4つのタイルにまたがるトライアングルのように階層的に分類して処理するのはMidgardアーキテクチャと同じであるが、Bifrostアーキテクチャでは、タイルのバッファの割り当ての単位を小さくし、左端の図の2行目の右端のタイルに見られるようなマイクロトライアングルは除去してしまうように変更した。細かいトライアングルが大量に存在する場合では、これはメモリ削減効果が大きい。結果として、メモリ使用量が最大95%小さくなったという。

Midgardと同じ階層的ビンを使うが、バッファ割り当ての単位が小さくなり、マイクロトライアングルは無視するように変更された。結果として、必要メモリが最大95%小さくなった

また、インデックスを使ったポジションシェーディングを行うことにより、Positions処理のメモリアクセスが平均3.5回から2回、Attribute処理のメモリアクセスが平均2.5回から1.5回と大幅に減ったという図が示されたが、詳しい説明はなく、なぜ、メモリアクセスが減るのかは分からなかった。

Positions処理に必要なメモリバンド幅が4/7、Attribute処理のメモリバンド幅が3/5に減少している

最高性能を狙うディスクリートGPUの場合は、CPUのメモリとGPUメモリは別々に設けられるが、Cortex-A73 CPUとMali G71 GPUの場合は、同じメモリを使い、次の図のように、キャッシュコヒーレンシをサポートするCoreLink CCI-550で接続される。このため、CPUとGPUのメモリのコヒーレンシが保たれ、使い勝手が良くなる。

Cortx-A73 CPUとMali G71 GPUは、同じDRAMをアクセスし、キャッシュコヒーレンシをサポートするCoreLink CCI-550で接続されている

まとめとして、Bifrost GPUは最大32シェーダコアまで拡張が可能で、シェーダコアを再設計している。新コアでは、命令がスカラ型のクローズベースとなり、クワッドベースの演算ユニットとなっている。

また、ジオメトリ処理の改良で、必要メモリバンド幅と必要メモリ量を減らしている。そして、CPUとGPUのキャッシュコヒーレンシから、細粒度のバッファの共用が可能になっていると述べた。

最大32シェーダコアまで拡張可能。新しいスカラ型のクロースベースの命令とクワッドベースの演算ユニット、新しいジオメトリ処理でメモリバンド幅を低減、CPUとの細粒度のバッファの共用