
Fermi は、 Nvidiaが開発したグラフィックス処理ユニット(GPU)マイクロアーキテクチャのコードネームで、 Teslaマイクロアーキテクチャの後継として 2010 年 4 月に市販されました。GeForce 400 シリーズおよび500 シリーズで使用された主要なマイクロアーキテクチャです。デスクトップ版 Fermi GPU はすべて 40nm プロセスで製造され、モバイル版 Fermi GPU は 40nm と28nm プロセスで製造されました。Fermi は、Microsoft のレンダリング API Direct3D 12 feature_level 11 をサポートする Nvidia のマイクロアーキテクチャの中で最も古いものです。
Fermiの後継としてKeplerが登場し、 GeForce 600シリーズ、GeForce 700シリーズ、GeForce 800シリーズでKeplerと併用されたが、後者2つのシリーズではモバイルGPUのみで使用された。
ワークステーション市場では、FermiはQuadro x000シリーズ、Quadro NVSモデル、およびNvidia Teslaコンピューティングモジュールに採用された。
この建築物は、イタリアの物理学者エンリコ・フェルミにちなんで名付けられた。



Fermiグラフィックス処理ユニット(GPU)は30億個のトランジスタを搭載しており、その概略図を図1に示す。
各SMは、32個の単精度CUDAコア、16個のロード/ストアユニット、4個の特殊機能ユニット(SFU)、64KB の高速オンチップメモリブロック(L1+共有メモリの項を参照)、およびL2キャッシュへのインターフェース(L2キャッシュの項を参照)を備えています。
クロックサイクルごとに16スレッド分の送信元アドレスと送信先アドレスを計算できるようにします。キャッシュまたはDRAMとの間でデータのロードと保存を行います。
正弦、余弦、逆数、平方根などの超越関数命令を実行します。各SFUは、スレッドごとにクロックごとに1つの命令を実行します。ワープは8クロックにわたって実行されます。SFUパイプラインはディスパッチユニットから分離されているため、SFUが使用中でもディスパッチユニットは他の実行ユニットに命令を発行できます。
標準的なプログラミング言語の要件に準拠し、すべての命令で完全な32ビット精度をサポートします。また、ワークステーションおよびサーバーモデルでは64ビットを効率的にサポートするように最適化されていますが、コンシューマー向けバージョンでは意図的に機能が制限されています。
新しいIEEE 754-2008浮動小数点規格を実装し、単精度および倍精度演算の両方に対して融合乗算加算(FMA)命令を提供します。SMあたり、クロックごとに最大16回の倍精度融合乗算加算演算を実行できます。[ 1 ]
融合乗算加算(FMA)は、乗算と加算(A*B+Cなど)を単一の最終丸めステップで実行し、加算の精度を損なうことはありません。FMAは、演算を個別に実行するよりも正確です。
Fermiアーキテクチャは、2段階の分散型スレッドスケジューラを採用している。
各SMは、図1に示す4つの緑色の実行列のうち、任意の2つを使用する命令を発行できます。例えば、SMは、16個の第1列コアからの16個の操作と、16個の第2列コアからの16個の操作を組み合わせたり、ロード/ストアユニットからの16個の操作とSFUからの4個の操作を組み合わせたり、プログラムで指定されるその他の組み合わせを実行したりできます。
64ビット浮動小数点演算は、最初の2つの実行列を必要とするため、32ビット演算の半分の速度で実行されます。
SMレベルでは、各ワープスケジューラが32スレッドのワープをその実行ユニットに分配します。各SMは2つのワープスケジューラと2つの命令ディスパッチユニットを備えており、2つのワープを同時に発行および実行できます。デュアルワープスケジューラは2つのワープを選択し、各ワープから1つの命令を16コア、16ロード/ストアユニット、または4つのSFUのグループに発行します。ほとんどの命令はデュアル発行が可能で、2つの整数命令、2つの浮動小数点命令、または整数、浮動小数点、ロード、ストア、SFU命令の混在を同時に発行できます。 倍精度命令は、他の操作とのデュアルディスパッチをサポートしていません。
Fermi GPU の理論上の単精度処理能力(GFLOPS)は、2 (1 サイクルあたり CUDA コアあたりの FMA 命令あたりの演算) × CUDA コア数 × シェーダー クロック速度 (GHz 単位) として計算されます。前の世代のTesla は、MAD+MUL を CUDA コアと SFU に並列に発行できましたが、Fermi は SM あたり 1 サイクルあたり 32 命令しか発行できないため、32 個の CUDA コアのみをフル活用する機能を失いました。[ 2 ]したがって、SFU を活用して 1 サイクルあたり CUDA コアあたり 2 を超える演算を達成することはできません。
Fermi GPU の理論上の倍精度処理能力は、GF100/110 の単精度性能の 1/2 です。しかし実際には、この倍精度処理能力はプロフェッショナル向けのQuadroおよびTeslaカードでのみ利用可能であり、コンシューマー向けのGeForceカードは人為的に 1/8 に制限されています。[ 3 ]
各SMごとにL1キャッシュ、およびすべての操作(ロード、ストア、テクスチャ)を処理する統合L2キャッシュ。
各SMには32K個の32ビットレジスタがあります。各スレッドは自身のレジスタのみにアクセスでき、他のスレッドのレジスタにはアクセスできません。CUDAカーネルが使用できるレジスタの最大数は63個です。スレッド数の増加に伴いワークロード(ひいてはリソース要件)が増大すると、使用可能なレジスタ数は63個から21個へと徐々に減少します。レジスタの帯域幅は非常に高く、約8,000GB /秒です。
個々のスレッドのデータをキャッシュするために使用できるオンチップメモリ(レジスタスピリング/L1キャッシュ)、および/または複数のスレッド間でデータを共有するために使用できる共有メモリ。この64KBのメモリは、48KBの共有メモリと16KBのL1キャッシュ、または16KBの共有メモリと48KBのL1キャッシュ として構成できます。共有メモリにより、同じスレッドブロック内のスレッドが連携し、オンチップデータの広範な再利用が容易になり、オフチップトラフィックが大幅に削減されます。共有メモリは、同じスレッドブロック内のスレッドからアクセスできます。中程度の量のデータ(一連の計算の中間結果、行列演算の1行または1列のデータ、ビデオの1行など)に対して、低遅延アクセス(10~20サイクル)と非常に高い帯域幅(1,600 GB/秒)を提供します。David Pattersonは、この共有メモリはローカルスクラッチパッドのアイデアを使用していると述べています[ 4 ]
ローカル メモリは、「スピル」されたレジスタを保持するために使用されるメモリ ロケーションです。レジスタのスピルは、スレッド ブロックが SM で使用可能なレジスタ ストレージよりも多くのレジスタを必要とする場合に発生します。ローカル メモリは、一部の自動変数 ( __device__、__shared__、または __constant__修飾子なしでデバイス コードで宣言されている変数) にのみ使用されます。一般的に、自動変数はレジスタに格納されますが、次の例外があります。(1) コンパイラが定数でインデックス付けされているかどうかを判断できない配列。(2) レジスタ スペースを過剰に消費する大きな構造体または配列。カーネルが SM で使用可能なレジスタよりも多くのレジスタを使用するときに、コンパイラがローカル メモリにスピルすることを決定した変数。
768KBの統合L2キャッシュは、16個のSM間で共有され、CPUホストとのコピーを含むグローバルメモリへのロードおよびストア、ならびにテクスチャ要求を処理します。L2キャッシュサブシステムは、スレッドブロック間、あるいはカーネル間で共有する必要のあるデータへのアクセスを管理するために使用されるアトミック操作も実装しています。
グローバルメモリ(VRAM)は、すべてのスレッドおよびホストシステムからPCIeバス経由で直接アクセスできます。レイテンシは400~800サイクルと高めです。
Nvidia NVDEC(旧称NVCUVID)およびNvidia PureVideoも参照してください。
SM内の4つの実行ブロックのうち任意の2つに、1つまたは2つのワープから合計32個の命令を各サイクルでディスパッチできる。
400シリーズのFP64パフォーマンスは、FP32パフォーマンスの1/8(12.5%)に制限されており、ハードウェアがネイティブに実行できるFP32パフォーマンスの1/2(50%)とは対照的です。