NVIDIA Tegra4 / Tegra4iのCPUとGPUのスペック

ISSCC 2013でNVIDIAからTegra4とTegra4iのスペックが詳細に語られたようなので、まとめました。

【重要】情報の信頼性は保証しません。

ソース:NVIDIAがMWCに合わせて「Tegra 4/4i」の詳細を明らかにNVIDIA、Tegra 4の詳細をついに公開 – CPUだけでなくGPUも大規模アーキテクチャ変更と明らかにNVIDIA Tegra 4 Architecture Deep Dive, Plus Tegra 4i, Icera i500 & Phoenix Hands OnNVIDIA Tegra 4 Family CPU Architecture(PDF注意)、NVIDIA Tegra 4 Family GPU Architecture(PDF注意)、ARMのinfocenter

■SoCスペック比較

Tegra4と他社の最新SoCの比較です(怪しい部分が多々あります)。

SoC Tegra4 Snapdragon800 Exynos5450 AppleA6X Z2760
メーカー NVIDIA Qualcomm Samsung Apple Intel
ISA ARMv7 ARMv7 ARMv7 ARMv7s x86
FPU ISA VFPv4 VFPv4 VFPv4 VFPv4 SSSE3
製造 TSMC 28nm HPL TSMC 28nm HPM Samsung 28nm Samsung 32nm Intel 32mn P1269
メインCPU Cortex-A15 Krait 400 Cortex-A15 Swift Cloverview
コア数 4 4 4 2 2
スレッド 4 4 4 2 4
クロック 1.9GHz 2.3GHz 0.2 – 1.8GHz 1.4GHz? up to 1.8GHz
L0キャッシュ(I/D) NA 4kB(1way) + 4kB(1way) NA NA
L1キャッシュ(I/D) 32kB(2way) + 32kB(2way) 16kB(4way) + 16kB(4way) 32kB(2way) + 32kB(2way) 32kB + 32kB 32kB(8way?) + 24kB(6way)
L2キャッシュ shared 2MB(16way) shared 2MB(8way?) shared 2MB(16way) shared 1MB shared 1MB(8way)
パイプライン 15-24 11- 15-24 16-
OoO Yes Yes Yes No
デコード 3命令 3命令 3命令 3? 2命令
発行 8命令 7命令? 8命令 5? 2命令
実行ポート 8 7 8 5? 4
省電力CPU Cortex-A15 NA Cortex-A7 NA
コア数 1 NA 4 NA
クロック ? NA 0.2 – 1.2GHz NA
L2キャッシュ 0.5 MB NA 0.5MB NA
GPU ULP GeForce Adreno 330 PowerVR SGX544MP3 PowerVR SGX554MP4 PowerVR SGX545
vec ALU 24+48 256? 48 128 16?
クロック 672MHz 280MHz? 533MHz
GFLOPS 96.8 100? 71.7? 19.2
Direct3D 9 level 1? 9 level 3 9 level 3 NA 9 level 3
OpenGL ES 2.0
(3/25訂正)
3.0 2.0? 2.0 2.0
OpenCL NA 1.1? 1.1 1.1 NA
メモリ LPDDR3
LPDDR2
DDR3L
LPDDR3 LPDDR3
LPDDR2
DDR3L
LPDDR2? LPDDR2
クロック 1866MHz 1600MHz 1600MHz 800MHz
バス 64bit 64bit 64bit 128bit 64bit
帯域 14.9GB/s 12.8GB/s 12.8GB/s 6.4GB/s
容量 up to 4GB 2GB 1GB 2GB

この記事を書いているときにタイミング悪くAtom Z2580が出てしまいましたが、面倒なので改定していません。CPUが2.0GHz、GPUがPowerVR SGX544MP2、メモリはLPDDR2のままです。

Tegra3はCortex-A9(2.3GHz)、Tegra4はCortex-A15(1.9GHz)をベースにしています。

Cortex-A9は最大4コア、2命令フェッチ・デコード、4命令発行のアウトオブオーダ実行です。ライトバックは7命令です。整数ALUのパイプラインはライトバックを含めて9~11段です。実行ポートは4つあり、ALU1(Alithmetic Logic Unit)、ALU2、乗算器、VFP・NEON・AGU(Address Generation Unit)です(NEONへの2命令発行は不可能)。NEONパイプのみ分離しています。命令プリフェッチステージには、命令キャッシュ、Fast Loop Mode、プリフェッチユニットの3ブロックがあります。Fast Loop Modeは64バイト以内の小さなループを検出してキャッシュします(Intel Core2のLoop Stream Detectorに相当)プリフェッチユニットには、4096エントリ(各2bit)のGHB(Global History Buffer)、512エントリの2way BTAC(Branch Target Address Cache)、8エントリのReturn Stackがあります。ROBは32~40命令で、(おそらく)OoO Writeback Stageにあります。RSは全実行ポート共有で、命令数は不明です(8命令?)。物理レジスタは56本で、フラグレジスタ用に9bitの物理レジスタが8本あります。レジスタリネーミングは1サイクルで最大2本です。ALUは1~3サイクルかかります(例:レジスタ指定シフトつき加算は3サイクル)。FPUはVFPv3で、オプションです。大抵の命令はスループット1で処理できます(意外にも32bit/64bitどちらもスループット1、レイテンシは4以上)。NEONはシンプルな命令のみ128bit幅のALUで、オプションです(が、Tegra2以外でNEONがないSoCを見たことがない)。TLBは2レベルです。L1 TLBはuTLBと呼ばれ、データ32エントリ、命令32エントリで、1wayです。L2 TLBは一般に128エントリで、2wayです。プリフェッチャーは8ストリームです(r3以降は16ストリーム?)。ストアバッファが4エントリ(1エントリにつき64byteのデータ+32bitのアドレス)あります。L1キャッシュは32byte(8ワード)キャッシュラインで4wayで、16 or 32 or 64kBです(一般に32kB)。ただし、フェッチは1サイクルにつき64byteまでです。L2キャッシュはコアとAXIバスの間にあり、コア間共有で、32byteキャッシュライン、128kB~8MB(一般に1コアあたり256 or 512kB)、4~16wayです(512kB/1coreのとき8wayにすることが多い)。レイテンシを下げるためにL2キャッシュを半クロック動作にすることができます。また、L2を排他キャッシュにするかどうかを変更できます。TSMC 40nm Gプロセスで最大2.0GHzで動作します。

余談ですが、Cortex-A9はメモリアクセスのアウトオブオーダができない、FPUパイプではアウトオブオーダと投機実行もできないという噂がありますが、本当かどうかは未検証です。

Cortex-A15は最大16コア(1モジュールあたり最大4コア)、3命令フェッチ・デコード、8命令発行のアウトオブオーダ実行です。整数ALUのパイプラインはライトバックを含めて15段、NEONは16~24段です。実行ポートは8つあり、2つのSimple Cluster、1つの分岐、2つのComplex Cluster、1つのMultiply Divide Cluster、2つのLoad&Storeです。ループ検出はLoop Bufferに名前を変え、デコードステージに併設され、32エントリのuOpをキャッシュします(Core iのLoop Stream Detectorに相当)。Global History Bufferは2レベル構成で容量不明です。BTACはBTB(Branch Target Buffer)に名前を変え(Cortex-A8時代の名前に戻った)、2つの前方ジャンプと1つの後方ジャンプを予測できます。BTBは2レベル構成になり、L1 BTB(microBTB)は1way 64エントリです。L2 BTBのエントリ数は不明ですが、間接分岐のためのBTBが256エントリあります。Return Stackは不明です(8~32エントリ?)。ROBは128 uOp(60 uOp説もあり)、RSは40 uOp以上です。物理レジスタは不明で、ARMレジスタ用とNEONレジスタ用の2種類があります。Simple Cluster(VFPレジスタを使った整数SIMD命令を含む)やBranchは1サイクル、Load&StoreやMultiply Divide Clusterは4サイクル(LoadとStoreは限定的アウトオブオーダでそれぞれ1クロック1命令まで)、Complex Cluster(NEON命令やVFP命令)は2~10サイクルです。Cortex-A15では整数除算命令とSIMD積和命令を新たにサポートします。FPUはVFPv4で必須です。NEONのbit幅は不明です(64bit?)。Complex Clusterには。各ポートに8エントリのキューがあります。Load&Storeには16エントリのキューがあり、ARMレジスタとNEONレジスタで共用です。L1 TLBはデータ読み込み32エントリ、データ書き込み32エントリ、命令32エントリで、1wayです。L2 TLBは512エントリで、4wayです。L1キャッシュは64byteキャッシュラインで2wayで32kBです(フェッチは1サイクル128byteで、アライメント不要)。L2キャッシュは64byteキャッシュラインで16wayで0.5 or 1 or 2 or 4MBです。TSMC 28nm HPで最大2.5GHzで動作します。

表を作るのが面倒なので文章で書いてしまいましたが、Cortex-A15のCortex-A9に対する利点は、3命令並列実行(とそのためのパイプライン・キャッシュの強化)、NEONパイプラインが2倍、アウトオブオーダの強化、TLBの増量、VFPv4などです。

Tegra4はソフトマクロで提供されたCortex-A15をあまり弄ることなく実装していると思われます。Qualcommにかなりライバル心を燃やしているようで、KraitがL2キャッシュが共有でない(コア単位独立で各512kB、これはKraitが非同期SMPのためらしい)こと、ROBが40エントリしかないこと(Tegra4は128uOp)、L1データキャッシュが16kBしかないこと、電力抑制コアがないなど、細部に渡ってKraitの劣る点を指摘しています(”OoO window lookup size”がROPを指すのかRSを指すのか不明ですが、RSが128というのは有りえないと思うのでROPとしています。ちなみにIntel Core2は3RS,96ROBでCortex-A15の方が上だったりします)。

余談ですが、KraitはARMのCortex-A15が出る前に独自にCortex-A15相当の機能を実装したもので、Kraitの前身であるScorpionでもCortex-A9が出る前にCortex-A9相当の機能を実装しています。ARMより機能を先取りして製品化できる点は良いのですが、ScorpionはCortex-A9よりわずかに性能が低くなりがちで、KraitもCortex-A15より若干性能が低くなる可能性があります。

Tegra4iはCortex-A9 r4です。r4は製品リビジョンを表しています(おそらくcat /proc/cpuinfoしたときに表示されるrevisionに相当するものと思われます)。Tegra3はr2でした。ARMによるとr0p0、r1p0、r2p0、r2p1、r2p2、r3p0、r4p0、r4p1があり、r4p0に相当するものと思われます。リビジョン間の違いは、エラッタ(バグ)の修正や、電力管理やキャッシュなどの制御用レジスタの追加などがあるようですが、機能的な違いはほとんどありません。r0のCortex-A9はTSMC 40nm LP or Gプロセスをターゲットにしています。おそらくr4では28nmにターゲットを移し、高クロックで動作できるようにするなどの若干の改良を加えたものと思われます。Tegra4ではL2 BTBが128エントリから512エントリに増やされていますが(Cortex-A15と同等)、これがNVIDIA独自の改良なのかARMのリビジョン変更による改良なのかは不明です。ホワイトペーパーを見るとNVIDIAが設計したものをARMが採用したように読めなくもないです。また、分岐の”History Buffer”と分岐予測アルゴリズムもCortex-A15相当に引き上げられ、L1データキャッシュのプリフェッチが新設されました(History BufferがBTBなのかGHBなのかは不明)。

ちなみにTegra4iの製造プロセスはTSMC 28nm HPM(HPLではありません)で、Snapdragon 800と同じです。メモリはシングルチャネル32bit接続で、DDR3L-2166をサポートします。DDR3L-2166というと、今デスクトップPCで標準のDDR3-1600より3割以上速いメモリになります。そんな無理をするより(他のメーカーがそうしているように)メモリをデュアルチャネル接続にすればいいと思うのですが、どうもNVIDIAはデュアルチャネルが嫌いのようです。

■OpenGL ES 3.0を見据えた新機能サポート

GPUクロックが672MHzという、GeForce GTX480に追いつきそうな高クロックも驚きですが、GPU内部のアーキテクチャはさらに興味深いものでした。

OpenGL ESの対応バージョンは非公開のままですが、3.0に必須の機能がほぼ全て備わっています。4x MSAA(Tegra3は5x CSAAのみ対応)、24bit深度バッファ(Tegra3は16bit)、深度テクスチャ、テクスチャ配列、環境マップ、テクスチャフィルタ時の境界色、PCFフィルタ、4k解像度テクスチャ、FP16テクスチャとブレンド、sRGBテクスチャとブレンド、ジオメトリインスタンシング(Direct3D 9レベル)、オクルージョンクエリ、非正方行列、マルチレンダーターゲット、サーフェイスなしのコンテクスト生成、Uniform Buffer Object、PBO、Separate Shader Objects、Explicit Attribute Location、Framebuffer Blit、ARB_copy_buffer、RG8テクスチャなどを新たにサポートします。

一方で、EACやETC2などの新しい圧縮テクスチャに対応しません(ETCとDXTCで代用)。CSAAも対応しません。

プログラマブルブレンドなど、Tegra3の独自Extensionも引き続きサポートするようです。

■グラフィックス効率とダイ面積を重視してGPGPUの正反対に突っ走ったULP GeForce

(2/27追記)一部勘違いがあったため修正しました。今後しばらく記述が二転三転するかもしれません。

Tegra4でもユニファイドシェーダに移行しないことを以前から公開していましたが、その理由はコアあたりのダイ面積削減にあったことが分かりました。PowerVR、Adreno、Mali、Vivanteなど他のメーカーがユニファイドシェーダを採用してリッチな演算ができる方向に向かっているのとは正反対に、Tegra4のGPUは機能を抑えてコアを小さく抑えることに注力しています。

頂点シェーダは4コア(4ALU)を1つのVPE(Vertex Processing Engines)にまとめました。VPEが6個なので、24コアになります。VPEは32bit浮動小数点数(GLSL ES 3.0におけるhighp精度に相当)の4way SIMD積和命令を1クロックにつき1つ実行できます。Tegra3やPowerVRでは精度を落とす代わりにSIMDのデータ数を増やすことができるので、Tegra4でも16bit浮動小数点数(mediump精度)なら8way SIMDとして実行できるのではないかと思われます。1サイクルあたりのトライアングルセットアップ数はTegra3と同じです。

Tegra4iでは、VPEが3個になり、結果として全部で12コアになります。

ROPは4です(深度ステンシルは最大8?)。Tegra3のROPは2でした。Tegra4iも2 ROPです。Tegra3から早期Zカリングのアルゴリズムを見直し(1クロックあたり最大8ピクセルの判定・破棄が可能)、深度バッファの精度が内部20bitから24bitに上がりました。

VPEには16kBの頂点キャッシュがあります。頂点キャッシュはVBO(Vertex Buffer Object)を96エントリまで格納します(Tegra2やTegra3は32エントリ?)。1エントリはおそらく1頂点に対応すると思われます。ここで、エントリ数を無駄なく使い切るには1頂点あたり何バイトまでに抑えなければならないかを計算します。16384÷96=170.677…で、170バイトまで使えます。座標のために3変数、法線のために3変数、テクスチャのために2変数、頂点色のために4変数を使うとき、48バイトです。あれ?多すぎますね。もしかしたら3頂点~4頂点で1エントリなのでしょうか。これは分かり次第検証したいと思います。

ピクセルシェーダは4コアのグループを3つまとめてPFS(Pixel Fragment Shader)としています(PFSは私の造語です。毎回Pixel Fragment Shaderと書くと大変なので)。PFSが4個なので、4×3×4=48コアになります。4コアごとに1つのMFU(Multi Function Unit)が付随します。MFUはTegra4から新設で、算術関数、逆数、平方根、mov命令などを実行します。PFSには1つのROP(メモリバスではなくピクセルシェーダ内にROPがあります)、4kB L1ピクセルキャッシュ、L1テクスチャキャッシュ、テクスチャフィルタがあります。GeForceでいうSMXのようなイメージです。PFSの外に共有16kB L2テクスチャキャッシュがあります。1クロックあたりのピクセルフィル・テクスチャフィルはTegra3の2倍です。16x異方性フィルタができる点はTegra3と同じです。

Tegra4iでは4コアのグループを6つまとめて(Tegra4の倍)PFSとしています。総コア数は同じですが、PFSの数が半分に減るので、テクスチャフィルレートは半分に落ちます。

ピクセルシェーダ内のコアは最高20bit浮動小数点数です。これはOpenGL ES 2.0/3.0でいうmediump精度に相当します。よって、highpが非サポートであることを意味します。Tegra2、Tegra3の内部精度も20bitなので、NVIDIAは精度を軽視したことになります。

もう少し詳しく説明します。OpenGL ES 2.0の仕様では10bit精度でmediump、16bit精度でhighpを要求します。仮数部と指数部と符号部を合計して20bitのTegra3(13bit+6bit+1bit?)は、highpに対応していません(それでいいのかという話はすぐ後で)。OpenGL ES 3.0はmediumpの精度は変わっていないので、Tegra3の精度で計算しても仕様違反ではありません(ただし整数は10bitから15bitに増え、符号なし整数のサポートも必須)。一方、highpは24bit精度(IEEE754 single precision相当)を要求するので、highpは非対応ということになります。じゃあTegra4はOpenGL ES 3.0に対応しないのかというと、そうではなくて、実はピクセルシェーダに限りhighpはオプションです(OpenGL 3.1以降がhighp必須だった…記憶が正しければ)。なので、mediumpまでの対応でOpenGL ES 3.0対応を名乗ることができます。Tegra4がOpenGL ES 3.0の仕様を無視したと主張する記事が多いので、念のため。ただし、Tegra以外で24bit精度をサポートしないGPUはARM Mali-400くらいしか現存しません(ARM Mali-T604以降はユニファイドシェーダなので24bit精度のはず)。速度犠牲でもhighpで動くモードがあればよいのですが。

PowerVR、Adreno、MaliはGPGPU対応を謳っており、実際OpenCLのSDKを公開しています。GPGPUには32bit精度が必要で、Tegra4はGPGPUをばっさり切って捨てたことになります(32bit精度のVPEで無理やりGPGPUすることも出来なくはないですが)。ただし、画像処理は基本的に8bit整数精度で間に合うので、”Computational Photograph Architecture「Chimera」API”によってGPUを活用したRAW現像やコンピュータビジョンを実現する計画のようです。GeForce 6/7時代の古典的GPGPUといえそうです。が、CPUが4コアもある(しかもCortex-A15だからNEON用のSIMDパイプラインが2つもある)のだから、そっちでやればよい気もするのですが。正直、モバイルでOpenCLが活躍したところを見たことがありません。ホワイトペーパーによると、Bayer配列の変換、YUV変換、HDRのトーンマッピングなどのためにGPUを使うようです。

1ピクセルあたりのレジスタ数が16から24に増えました。インフライトに扱えるスレッド数は不明です。

命令セットはVLIWです。nコア+(4-n)コア+MFUの最大3way VLIW(あるいはテクスチャサンプル命令を含めて4way VLIW?)だと思われます。4つに纏められたコアに1つの”しきい”を入れることで1+3、2+2、3+1、4+0のように分け、それぞれ別の命令が実行できます。これはGeForce6のピクセルシェーダの(変態)アーキテクチャそのものです。そういう意味では、MFUはGeForce6のmini-ALU(Scalar ALU)に相当するかもしれません。

VLIWなのでコンパイル時に命令レベルの並列化を行うことになります。RadeonもHD 2xxxからHD 6xxxまでVLIWでしたが、こちらはVLIW命令長が必ずALUの数と一致していたのに対し、ULP GeForceではALU数よりVLIW長の方が短いです。よって、できるだけ変数を(GLSLの)vec4型にまとめて一気に演算した方が、効率のよいVLIW命令を生成できるでしょう。スカラ演算だけの場合はVLIWに命令を2個しか詰め込められないので、半分のALUが遊ぶことになります。一方で、アルゴリズム上どう頑張っても命令を並列化できないときに、VLIWに空き命令が出現してしまう可能性は低くなります。GeForce6ベースのVLIWは、ダイ面積(言い換えれば電力効率)とVLIW充填率(ALU実行効率)のバランスをとったアーキテクチャであり、落としどころとしては悪くないと思います。GPGPUは犠牲になりました。

■ダイ面積最重視

ソースに示したサイトではSnapdragon、Exynos、AppleAxのGPU面積の比較がありますが、Tegra4のGPUは他の半分以下しかありません。ピクセルシェーダが20bitとはいえ、この面積でこれだけのALUを敷き詰めるのはなかなか困難だと思います。その代わり、高クロック動作と熱密度向上という問題が生まれるわけですが、まぁ、問題ないと判断したのでしょう。

■OpenGL ES 3.0に対応するのかしないのか良く分からないTegra4

結局、ホワイトペーパーにはっきりと「OpenGL ES 3.0対応」と書かれることはありませんでした。触れられているのは「EAC/ETC2や32bit浮動小数などのOpenGL ES 3.0の機能を完全に(explicitly)サポートしない」「多くの重要なOpenGL ES 3.0の機能をサポートする(図付き)」「OpenGL ES 3.0の使用はしばらく(for quite some times)期待しない」だけです。こう書かれるとOpenGL ES 3.0に対応しないようにも取れます。

ちなみに、Androidは5.0からOpenGL ES 3.0に対応するようです。

■感想

ハードがすごいのは分かったけどマーケティングとかファブの問題でコケたりしないか不安

■3/19追記

GTC13にて、Tegra4の後継(Tegra5とTegra6?)の話が出てきたようです。

Tegra4の後継はコードネームLoganで、Keplerアーキテクチャとなります。従って、CUDA 5やOpenGL 4.3が動作します。リリースは2014年です。

Loganの後継はコードネームParkerで、CPUコアはProject Denverの成果となります。Maxwellアーキテクチャで、FinFET対応のプロセス(おそらくTSMC 20nmか16nm)で製造されます。リリースは2015年です。パフォーマンスはTegra4の10倍になるそうです。

Tegraとはあまり関係ありませんが、Maxwellの次のVoltaアーキテクチャベースのPC向けGPUでは、グラフィックスメモリをスタック(Stacked)させるそうです。メモリをスタックしたプロセッサといえばApple A5XやApple A6Xがありますが(モバイルSoCではパッケージオンパッケージ(PoP)でメモリを載せることが多く、スタックはPoPより製造コストが高くなる代わりにメモリ帯域を広く取れる)、PC向けGPUでは世界初のような気がします。これにより、1TB/sもの帯域を可能にするそうです。ただし、DRAMは熱に弱く、90度を超えるGPUでどうやって熱の問題を解決するのか気になるところです(単にクロックを下げるだけだったりして)。

■3/30追記

GDC 2013にて、Tegra4に関する新たな情報がいくつか公開されました。

OpenGL ESのバージョンは2.0で確定です。3.0の新機能の一部はOpenGL Extensionとしてサポートすることになります。

また、4Gamerによると、シャドウマップ系のextensionにOES_depth24やOES_depth_textureだけでなく、OES_depth_texture_cube_map、EXT_shadow_samplers、NV_shadow_samplers_cube、NV_shadow_samplers_arrayまでサポートします。これでカスケードシャドウマップや全方位シャドウマップがやりやすくなりそうです。また、ハードウェアで近傍比率フィルタリングをサポートするそうですが、おそらくEXT_shadow_samplersのTEXTURE_COMPARE_FUNCによる比較付きサンプルのことだと思われます。

フラグメントシェーダでは、変数の精度変換がコスト0であること、lowp(8bit正規化符号付き整数精度)ではmediump(16bit浮動小数点数精度)に比べて内積等の演算のスループットが2倍になること、1つのMADユニット(=4コア?)ごとに1クロックで線形補間ができること、理想のALU/TEX比率が3であることが読み取れます。

広告

NVIDIA Tegra4 / Tegra4iのCPUとGPUのスペック」への1件のフィードバック

  1. ピンバック: NVIDIA Tegra K1のCPUとGPUのスペック | shobomalog

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中