IoTやAIといったテクノロジーの進歩とともに、最近では、これまでハードウェアに触れてこなかったソフトウェア・エンジニアもFPGAを知る必要がある……、としばし論じられるようになってきた。そうした現状を踏まえ、この連載では、なぜソフトウェア・エンジニアがFPGAを学ぶ必要があるのか、FPGAとは何か、またその基本的な仕組みや構造を3回に分けて紹介する。

なぜソフトウェアのエンジニアがFPGAを学ぶ必要があるのか?

ソフトウェア・エンジニアがいまからFPGAを学ぶ必要性について定量的に論じることは難しい。FPGAの設計手法やコンパイラ(※1)は日々進歩しており、既存のソフトウェア(※2)をそのままFPGA用にコンパイルできるケースも増えてきた。CPU(※3)とFPGAが搭載されたシステム上で、どのプログラムをどちらのハードウェアで実行するかを最適化する研究も以前から行われており、近い将来、多くのソフトウェア・エンジニアはCPUかFPGAかを意識する必要は無くなるかもしれない。

しかし、いますぐにシステムの高性能化を図りたい場合など、いくら設計手法やコンパイラが進歩してもFPGAに特化した設計手法が残り、FPGAについて学ぶ必要性がでてくることが考えられる。そのようなケースにはたとえば次のようなものがあげられる。

1) 速度、サイズ、消費電力の各性能やコストを突き詰めたい場合

2) 信号のタイミング制御に高い精度が要求される場合

3) 高い信頼性、動作のトレーサビリティが要求される場合

4) FPGAのコンパイラや開発ツール自体を開発する場合

4)のコンパイラの開発を行う場合は議論の余地はないが、このケースは極少数であろう。残りの1)~3)については、ソフトウェアにおける高級言語とアセンブラの関係に似ている。コンパイラが発展したことで、大部分のソフトウェアは高級言語で記述できるようになったが、一部の用途、特に組み込み機器のマイコン制御などはいまだにアセンブラで設計されているものがある。これは特にシステムの規模が小さい場合に有用だ。

FPGAの場合も、C言語で設計してコンパイル、実行することが可能である。これに対しアセンブラに相当するものがVHDLやVerilog HDLなど、より回路の動作指定に近い言語であるといえる。実際多くのFPGA向けのC言語のコンパイラは中間コードとしてHDL (Hardware Description Language) を出力する。従ってFPGAを深く学ぶことはHDLを学ぶことに等しい。

ただ、4)についてはまだまだ発展途上で、コンパイラだけでなく、その周辺ツール、フレームワークも日々進歩を続けている。このため、ソフトウェア・エンジニアにとっては一番興味深いところかもしれない。

脚注 :

(※1)FPGAではHDLなどで書かれたコードをネットリストと呼ばれる中間コードに変換することを「論理合成」と呼び、ネットリストはさらに実際のデバイスの物理的なピン配置、論理ブロック、マトリックス・スイッチ、メモリリソース、そのほかのハードマクロとの対応付けを行う。この対応付けをインプリメンテーションと呼ぶ。このうち論理合成はソフトウェアのコンパイルに相当する。正確にはライブラリとのリンクに相当する処理も論理合成に含まれるため、コンパイルというよりビルドに近い。C言語などの高級言語でFPGA設計を行う場合、C言語からHDLに変換する工程をコンパイルというため、これらは区別して扱う場合がある。

(※2)本稿ではコンピュータ上で実行されるプログラムのことをソフトウェアと呼ぶ。

(※3)CPU : Central Processing Unitは MPU : Micro Processing Unitとも呼ばれるが本文ではCPUで統一する。

アルゴリズムに合ったハードウェア

ハードウェアの主な性能として、速度、サイズ、消費電力の3つがある。これらの性能は半導体のプロセスの微細化の発展と共に向上するが、ある時点のテクノロジーでは、速度とそのほかの2つの性能はトレードオフの関係にある。つまり、速度を優先すれば、サイズや消費電力が大きくなり、小型化もしくは省電力化を優先すれば速度が遅くなる。従って開発者は用途に応じて最適な性能を選択、設計する必要がある。

そこで、これをアルゴリズム実装の視点で考えると、プログラムの記述の仕方、あるいは言語の違いなどによって性能に差が生じることは周知であるが、本来はハードウェアのアーキテクチャもアルゴリズムごとに適した構成が考えられる。ここでいうアーキテクチャとはCPUの命令セットの種類やノイマン型であるかなどに留まらない。アルゴリズムをCPUでソフトウェア実装するのではなく、直接回路でハードウェア実装することが可能であり、そうして作られるLSIをASIC (Application Specific Integrated Circuit) と呼ぶ。

もし設計・製造コストを考えなければ、世の中の全てのアルゴリズム向けに個別のASICを作れば、その時代のテクノロジーで達成可能な最高性能を得ることができる(ASICはその名の通り、特定の用途向けの処理に特化したLSIであるが、特定の構造などを指したものではない。設計次第で汎用性を持たせることは可能であるが、一般に汎用性も前述の3性能とトレードオフの関係にある)。

しかし、実際にはLSIの設計・製造コストは非常に高く(採用するプロセスにもよるが先端プロセスであれば軽く億は超える額が必要となる)、ハードウェアの単価を下げるには出来るだけ同じものを量産する必要がある。同じハードウェアにさまざまなアルゴリズムを実装できるように最も発展したLSIが、現在のノイマン型コンピュータ向けのCPUである。同様にFPGAも汎用的に多様なアルゴリズムを実装できるLSIのひとつではあるが、CPUとは構造が大きく異なるため、実装に適したアルゴリズムが異なる。CPUとFPGAの差異については後述するが、FPGAに向いたアルゴリズムは一言でいえば、並列度の高いアルゴリズムである。つまり、FPGAはCPUと同様に汎用のLSIであり、実装対象のアルゴリズム、要求性能、およびコストに応じて選択する選択肢のひとつであるというわけだ。

FPGAとは?

FPGAはField Programmable Gate Arrayの略で、直訳すれば「現場でプログラム可能なゲートアレイ」となる。ゲートアレイとはLSIの回路構成のひとつであるので、端的にいえばFPGAとは「プログラム可能なLSI」のことである。外観は以下に示すようにほかのLSIと変わらない。しかしほかのLSIと異なり、内部の回路が物理的に固定配線されている訳ではなく、外部メモリに格納された回路構成データ(Configuration Data)が電源投入後にFPGA内部にロードされてはじめて機能する(図1)。

  • FPGAの外観

    FPGAの外観写真

  • 一般的なLSIとFPGAの違い

    図1 一般的なLSIは予め回路が作成されているのに対し、FPGAは電源投入前は回路が構成されていない

なお、ここでいう回路構成データはパソコン上でHDL(Hardware Description Language)やC言語などで記述されたものをコンパイルしたバイナリデータであり、元のソースコードはプログラムコードといえるものである。

CPUとFPGAの違い

パソコンのプログラムの対象はCPUであり、CPUがどのように動作するかを記述するものである。一方、FPGAにCPUは存在しない。FPGA用のプログラムの対象はLUT(Look Up Table)と呼ばれる無数の小さなメモリと、配線を担うスイッチである。LUTがどのような論理演算を行うかと、スイッチでどことどこを接続するかをプログラムする。

またCPUの場合は演算を司るALU (Arithmetic Logic Unit)は1個~数個である代わりに、1回のALUで演算する時間、つまり1システムクロックが速いもので4~5GHz(1周期が200ps程度)と高速である。一方FPGAは数万~数十万の演算器がある代わりに、各演算器の演算時間は500~800MHz(1周期が1.2~2ns程度)と1桁近く遅い(図2)。

  • CPUとFPGAの演算の違い

    図2 CPUとFPGAの演算の違い、CPUの演算器が単一で高速であるのに対し、FPGAの演算器は多数であるが一つひとつは低速

FPGAに向く用途

FPGAに向く用途は、原則として並列性の高い演算が要求されるものである。先に述べた通り、FPGAはCPUに比べ動作周波数が1桁近く遅いことから、少なくとも10倍以上の並列度がなければCPU以上の演算速度の達成は困難となる。

しかし、FPGAの演算器の数は多いものならCPUのそれと比べて数万倍以上であるため、並列度の高いアルゴリズムであれば圧倒的に高速に処理できる可能性がある。具体的には画像処理やパターンマッチング、データの圧縮・解凍、暗号・復号器などに向くものが多い。

たとえば、画像処理では各ピクセルに対して独立して演算を行えることが多く、10x10[pixel]の各ピクセルの色空間変換を行う場合や、メディアンフィルタを行う場合などは全ピクセルは独立しているので、100並列で演算可能である。また、2値化した後にX、Y方向のヒストグラムを作成する場合は、10+10=20並列で演算可能となる。

ただ、ここで注意しなければならないのはI/Oのボトルネックである。CPUが外部のメインメモリとの通信がネックとなるのと同様に、大容量のデータ処理を行う際はそのデータを格納するストレージとFPGA間の通信がネックとなる場合が多い。このためハイエンドのFPGAは1,000ピン以上のI/Oを備えているものもあるが、それでも通信ボトルネックとならないように演算の順序を入れ替える、あるいはデータを圧縮して通信し、FPGA内部で展開するなどの工夫が必要となる。

ここまで、ソフトウェア・エンジニアがFPGAを学ぶ必要性、またFPGAとは何かについて触れてきた。次回以降は、FPGAの仕組みと構造、基本的なメモリの構成について紹介していきたい。

著者プロフィール:すすたわり

株式会社SUSUBOX代表取締役。慶應義塾大学 特任准教授。元FPGA-CAFE店長。主な著書に「回路図で学べるFPGA入門 回路図は読める人のためのHDLガイド」(秀和システム)がある。

[PR]提供:アヴネット