組込み技術者にとってのFPGAについて考察してみる
半導体進化に思うこと
組込み技術者がシステム設計を行う場合に考える3大リソースは、「時間」、「空間」、「エネルギー」の3つであろうかと思います。時間は言うまでも無く、空間はトランジスタ数(演算機能やメモリ量)、 エネルギーは電力であります。コンピュータを単なる計算機として使うのではなく、これら制約の範囲で現実世界に対する価値を生み出す設計を行うのが組込み技術の組込み技術たるところかと思います。
、このうち、多くの従来の組込み技術でもっとも設計に腐心してきたのは「時間」だったのではないでしょうか。
従来、組込み技術者に与えられる設計自由度において、MPUやメモリの制約は非常に厳しく、この中でいかに処理をやりくりするか、時分割でのリソース共有、すなわちスケジューリング問題であり、この中でRTOSの進化は遂げられて来ました。
一方で、今日では設計時の重要性が、空間リソースやエネルギーリソースに移行しつつあるように思えます。時間当たりの処理能力(早い話は周波数)の増加は頭打ちを見せつつも、相変わらず空間リソースだけはムーアの法則に則って、指数関数的な増加速度を保っています。また微細化の進歩から面積あたりの電力は増加方向であり、エコの観点からも電力に対する重要性も増してきております。
上記の理由から組込みの世界にも間違いなく並列化の波がやってきます。即ち、ムーアの法則に則ったトランジスタ数の増加に対して、演算器数の増加を維持しなければならず、マルチコアやSIMDといったアプローチは今後組込み技術者にも利用する機会はどんどん増えてくるかと思います。
FPGAに期待するもの
組込み技術者として最近近私が非常に注目しているデバイスはFPGAです。このデバイスはトランジスタ数の増加に合わせて確実にその容量増加に比例して内部に乗算器や内蔵メモリの量を増やしてきています。ロジック規模、価格ともに組み込み分野への適用レンジに入り始めたと思います。
また、VHDL や Verilog HDL といったハードウェア記述言語は幸いなことにCやLISPやPrologなどと同様にチューリング完全な言語です(注:私はLISPやPrologは使えませんが)。実行環境のデバイスがFPGAという非ノイマン型のデバイスというだけで、おそらくC言語を駆使する組込み技術者にとって、例えばPrologのような非手続き型言語を覚えるよりはるかに簡単に、HDLを覚えることができるでしょうし、それらを駆使して性能のいいコードを書くのは、超並列プロセッサで性能のいいコードを書けと言われるより恐らく楽だと思います。
我々組み込み技術者は、有限なリソースを効率よく使いこなすことを常に考えねばなりません。その際、今後、並列プログラミングにせよ、HDLにせよ、逐次処理言語の呪縛を乗り越えて何らかの形で並列モデルの記述が必要になります。どのみち逐次処理言語が限界を迎えるのであれば、限界を超える部分のフォローアップにまで無理にノイマン型を延命させる必要は無いのではないかと言うのが私の考えです。スーパーパイプライン、スーパースカラ、アウトオブオーダー実行、レジスタエイリアシング、分岐予測、キャッシュ、などなどのノイマン型の延命技術は素晴らしいものですが、投入するトランジスタ数に対する性能向上の点では効率が良いものではなく、まさにこの効率の点が現在壁となって立ちはだかってしまいました。
もちろんHDLを使いこなすのが簡単とは言いませんが、並列動作モデルの記述が非常に物理的で直感が働きます。そしてその並列動作の記述がノイマンボトルネックを発生させること無く直接デバイスにロードされて実行されるわけです。かつて命令のサイクル数を数え、NOP挿入しながらタイミングあわせを行なっていたようなプログラマにとっては、サイクルありきのHDLは逆に最近のプロセッサより簡単に扱えるかもしれません。
FPGAのおかげで、コード修正→コンパイル(合成)→ダウンロード→RUN といった、殆どソフトウェアと同じ開発手順が適用できます。デバッグもシミュレータや埋め込みロジアナなど安価なものが充実してきました。
今後のこのデバイスの進化は目が離せないと思います。