Mali-T880 GPUのブロックダイヤと処理フロー
Mali GPUは、共通のネットワークにすべてのユニットが接続されているという構造になっている。ネットワークは、シェーダコアが増えるとネットワークのバンド幅も増えるというスケーラブルな構造になっている。
L2キャッシュは、最大512KBのスライスを最大2個接続できるようになっている。ただし、実際の製品の要件により、実装されるスライスの数やスライスの容量などは変わってくる。
T880のタイラーは、各タイルに入るポリゴンのリストを作成する固定機能のユニットで、前述の階層的タイリングをサポートしている。このタイラーは、毎サイクル1個の3角形ポリゴンを処理することができる。
各シェーダコアには2個のμTLBが設けられておりアドレス変換を行うが、μTLBをミスした場合は、MMUに信号が送られ、MMUがページテーブルをたどって新しいエントリを見つけてμTLBに格納する。
各シェーダコアは2個のμTLBを持っている。Mali-T880はARMv8の64bit空間をサポートするMMUを備えており、μTLBミスの場合は、ハードウェアでテーブルウォークを行って必要なページテーブルエントリを読み出してμTLBに供給する |
ジョブマネージャは固定機能のブロックで、メモリからジョブの記述を読み、ジョブ間の依存性を考慮して、ジョブを複数のシェーダコアを分配する。
シェーダコアのブロックダイヤと処理フロー
シェーダコアは計算を行なうALUとメモリアクセス、テクスチャ処理の3種のパイプラインを持つARMが「Tri-Pipe」と呼ぶ構造になっている。128bit幅のSIMD演算器は32ビットの変数の場合は4演算を並列に実行できる。これに加えてスカラユニットが1個あり、ALUあたり32ビット演算器を5個持っている。
Mali-T880のシェーダコアは3個のALUを持つので、最大16個のシェーダコアを搭載すると、チップあたり240個の演算器を持つことができる。NVIDIAのTegra X1は256個の演算器であるので、フルの16シェーダコアの構成とすれば、Mali-T880は、概ね、Tegra X1に匹敵する演算能力を持っている。
シェーダコアは、演算とロードストア、テクスチャ処理を行う3つのパイプラインを持つTri-Pipeと呼ぶアーキテクチャである。ALUユニットは128bit SIMDのベクトル演算器とスカラ演算器を含んでいる。T880のシェーダコアは3つのALUユニットを搭載して演算性能を高めている |
頂点シェーディングを行うスレッドは「Compute Thread Creator」というブロックで生成され、命令はTri-Pipeの実行ユニットに送られる。実行ユニットは頂点座標と属性をメモリから読み、座標変換を行って、その結果をL1キャッシュ経由でメモリに書き出す。このL1キャッシュはすべてのシェーダコアでコヒーレンシが保たれており、アトミックアクセスもサポートされている。
フラグメントシェーダは、タイラーが作ったプリミティブ(この場合は三角形)リストを処理して描画を行う。「Triangle setup」と書かれたブロックが、メモリから描画する三角形のデータを読み出し、そのデータをRasterizerに送って、ピクセルに変換する。そしてEarly-Zというブロックで、そのピクセルが見えるのか、あるいはすでに描画したピクセルの後ろになって隠されて見えないのかを判定し、見える場合には、描画スレッドを生成して、Tri-Pipeに実行させる。
Tri-pipeはテクスチャの貼り付けや光源と面の向きなどの情報を使ってピクセルの色を計算し、結果をタイルバッファに書き込む。そして、1つのタイルのすべての描画データの処理が終わると、タイルバッファの情報をメモリに書き出す。
フラグメント処理は、タイラーの出力を入力として、三角形をピクセルに分解してZバッファを使って、隠れて見えないピクセルは除外して、見えるピクセルの描画スレッドを生成する。描画スレッドはテクスチャの貼り付けや光の反射計算を行なってピクセルの色を計算する。1つのタイルの全データの処理が終わると、タイルバッファのデータをメモリに書き出す |
Midgardアーキテクチャの演算部分は、SIMD+VLIWという構造になっている。T880の場合は、128ビット幅の演算器を持つ3つのSIMD部分と2つのスカラ部を持っている。SIMD部はFP32なら4演算、FP16なら8演算、INT8なら16演算を並列に実行することができる。
そして、ユニット全体としては、ベクタ乗算とスカラ加算、あるいはベクタ加算、スカラ乗算とロードストア命令を並列に実行することができるVLIWになっている。しかし、通常のVLIWのようにすべてのユニットが同期して動くのではなく、各ユニットが独立のスレッドで動くようである。
ALUは3つの128bit SIMD加算器と128bit SIMD乗算器を持ち、それに加えて32bitの加算器と乗算器を持っている。SIMD演算器は8bit、16bit、32bit単位で分割して使用できる。演算器はこの図のようにパイプラインになっている |
(次回は9月30日に掲載します)