FPGAとは「回路そのものを作る」技術
FPGA(Field Programmable Gate Array)は、買ってきた後に中の回路を自由に書き換えられるチップです。
ソフトウェアを書いてCPUに実行させるのではなく、「こういう電子回路が欲しい」と記述して、その回路をチップの中に実際に作ります。
このアニメモでは、設計の流れ → なぜ可能なのか → CPU・GPUとの違い → 応用例、の順に図を動かしながら見ていきます。
FPGA設計で何をするのか、なぜ回路を書き換えられるのか、CPU・GPUと何が違うのか、どこで使われているのかを、図を動かしながら解説します。
FPGA(Field Programmable Gate Array)は、買ってきた後に中の回路を自由に書き換えられるチップです。
ソフトウェアを書いてCPUに実行させるのではなく、「こういう電子回路が欲しい」と記述して、その回路をチップの中に実際に作ります。
このアニメモでは、設計の流れ → なぜ可能なのか → CPU・GPUとの違い → 応用例、の順に図を動かしながら見ていきます。
まず Verilog や VHDL(最近は SystemVerilog、Chisel、Vitis HLS で C++ からも)で「欲しい回路」を記述します。
合成ツールがそれを論理ゲートの回路に変換し、配置配線ツールがチップ上のどこにどう置くかを決めます。結果はビットストリームというファイルになり、これをFPGAに書き込むと回路が完成します。
実際の設計時間の大半は、「クロックごとに何が起きるか」を考えるタイミング設計と、シミュレーションによる検証に費やされます。
FPGAの中には、小さな部品が何万〜何百万個も規則正しく並んでいます。主役は3つです。
この「論理」「記憶」「配線」の3つが揃うと、原理的にどんなデジタル回路でも組めます。
LUTを1つ取り出して拡大してみます。中身は、入力の組み合わせごとに出力を書いておく小さなメモリ(真理値表)です。
例えば2入力なら4行の表になります。右のように「A=1かつB=1のときだけY=1」と書いておけば、このLUTはAND回路として振る舞います。
つまり論理ゲートを「作る」のではなく、「表を書いて、その表を引く」ことで論理を実現しているのです。
ビットストリームの正体は、この真理値表の中身と、配線スイッチのON/OFFを並べた設定データです。
表の中身を書き換えると、同じLUTが今度はXOR回路になります。同時に配線スイッチも切り替われば、LUT同士のつながり方も変わります。
これが「電源を入れ直すたびに別の回路に物理的に変われる」理由であり、Field Programmable の名前の由来です。
CPUは回路が固定された汎用機です。命令をひとつずつ取り出し(フェッチ)、解読し(デコード)、演算器で実行します。
4つのデータに同じ処理をしたければ、1つの演算器に順番に流すしかないので、最低でも4クロックかかります。
CPUはこの「順番に処理する」仕組みを極限まで速くしたものですが、仕組み自体は変えられません。
FPGAには命令という概念がありません。自分で設計した回路が、電気的にそのまま動きます。
同じ処理を4つのデータにしたいなら、演算器を4つ置けばいい。4つのデータが同時に入り、1クロックで全部終わります。100個なら100個置けます(LUTが足りる限り)。
CPUがループで100回まわす仕事を、FPGAは回路の形で「展開」してしまう。これが並列性の正体です。
「並列ならGPUでもいいのでは?」と思うかもしれません。GPUは数千個の同じ演算コアが、同じ命令を違うデータに一斉に実行する構造(SIMD)です。
行列演算のように「同じ計算を大量に」という仕事には最強で、深層学習や分子動力学、流体計算はほぼGPUの独壇場です。
ただしコアはあらかじめ用意された固定回路。全部が32bit浮動小数点で、データの流れ方も変えられません。
FPGAでは、演算器の数も、ビット幅も、データの流れる経路も、全部自分で決められます。
3bitで足りる計算は3bitの回路に、48bit必要なところは48bitに。そして処理を一直線のパイプラインに組めば、データが入ってから出るまでの時間を固定できます。
ざっくり使い分けると、浮動小数点を大量にさばくスループット重視ならGPU、変則的なビット幅やストリーム処理でレイテンシ重視ならFPGAです。
FPGAの最大の武器は、処理を回路として固定できるので、データが入ってから出るまでの時間が毎回ぴったり同じになることです。
例えば高頻度取引(HFT)では、取引所からのパケットを受信→判断→発注まで、数百ナノ秒で完了します。CPUやGPUはOSやキャッシュの都合でマイクロ秒単位で揺らぐので、速度も確定性も足りません。
次のページで、パケットが3段のパイプラインを通り抜ける様子を見てみましょう。
各段は決まったクロック数で処理し、次の段へ渡します。途中で割り込みもキャッシュミスも起きないので、何万回流しても所要時間は同じです。
この性質は、モータ制御、レーダー、粒子加速器のトリガ系、通信機器など「遅れてはいけない」「ばらついてはいけない」現場で決定的に重要です。
クロック自体はCPUより遅い(数百MHz)のに速いのは、「命令を取りに行く」という無駄が一切ないからです。
もうひとつ重要なのがASIC試作です。チップを製造する前に、設計をFPGAで動かして検証する(エミュレーション)のは半導体業界の標準的な手順です。
FPGAの弱点は、クロックが遅い(数百MHz)、開発とデバッグが重い、逐次処理が苦手、単価が高いこと。だから実際の製品では、CPUの隣に「専用アクセラレータ」として置くのが普通です。
AMD(旧Xilinx)のZynqのように、ARM CPUとFPGAを1チップに載せた製品が主流になっているのは、この役割分担をそのまま形にしたものです。
NMRやTOF型質量分析計の内部には、ほぼ必ずFPGAが入っています。検出器から出てくるアナログ信号をADCでデジタル化したあと、積算・フィルタ・ピーク検出をリアルタイムで行うのがFPGAの仕事です。
データレートが数GB/秒になるので、いったんPCのメモリに貯めてから処理するのでは間に合いません。「流れてくる端から処理して、結果だけPCに渡す」構造が必要なのです。
MD専用機のAnton(D.E. Shaw Research)はFPGAではなくASICですが、「力場計算をパイプライン回路にする」という設計思想はFPGA的なものです。
ログインするとコメントできます。
読み込み中…
権利侵害・不適切な内容の連絡: [email protected]