皆さん、こんにちは。ACRi ブログ第3期の第4コースを担当する飯田です。
このコースでは、タイトル通り「そもそもFPGA って何」という謎に迫っていきます。何となく判っているような、いないような FPGA の不思議にこたえていければと思っています。
例えば、FPGA ってどうやって生まれてきたのかとか、どうして配置配線に時間がかかるのかとか、結局、CPU や GPU と何が違うのかとか、FPGA にまつわる話をしていきます。
このコースは、高校生から大学1年生ぐらいでも理解できる内容にしたいと思っています。したがって、エンジニアや工学系・情報系の大学院生の皆さんにはやや物足りないかもしれません。ですが、是非、気楽にお付き合いいただければと思います。
第1回のこの記事では、CPU と何が違うのかというお話です。
まずはコンピュータの中の出来事
FPGA とは何者かを語る前に、まずコンピュータの中で行われていることについて説明します。
皆さんは、このブログを見ているわけですから、コンピュータを使っています。それが PC なのかスマートフォンなのかはここでは気にしません。中は同じようなものなので。また、動作を説明するために単純化して、CPU とメモリ、キーボードなどの入力装置とディスプレイなどの出力装置の4つからできているものとします。これは、三文字略語の爆発を防止するためです。なにしろ、コンピュータ業界は、この三文字略語や四文字略語が大好きで、傍から見ていると宇宙人の会話のように感じてしまうからです。
まずは、CPU からです。
CPU はセントラル・プロセッシング・ユニット (Central Processing Unit)、日本語では中央演算処理装置とか言われます。よく PC などの頭脳に例えられるので知っている人も多いと思います。それで、その役割ですが、読んで字のごとく、PC の真ん中にどんと構えて、何かの「処理」を行うヤツです。そこで疑問に思うのは、どんな処理をするのかと、どんなデータを処理するのかです。どんな処理をするのかは、皆さんも知っている通りプログラムに書かれています。どんなデータを処理するのかは、PC の外の世界から入ってきたデータです。そうすると、もう一つ疑問が出てきます。それは処理したデータはどこへ行くのかです。まぁこれも実は自明で、PC の外の世界にお返しするだけです。
つまり、CPU は、プログラムに従って、どこからか来たデータを処理して、どこかにデータを吐き出すことが仕事なのです。これさえ理解すれば、コンピュータの半分を理解したのと同じです。Windows などの OS がどうのとか、最近は Rust が良いよねとか、Python で Deep Learning とかは枝葉末節です。「どこからか来た」というのは入力装置から来たデータという意味ですし、「どこかにデータを吐き出す」とは大概はメモリですが、たまに出力装置に吐き出すなんてこともあります。入力装置から CPU へ直接データが来ることはなく、これもメモリを介して行います。なので、CPU はメモリに対してプログラムやデータを出し入れして働いているというわけです。
例えば、ワープロ Word で書き物をする時は、キーボードから文字を入力して、日本語変換して画面に出力されます。変換されたデータは、他の装置内のディスクに保管されたりもしますが、ワープロ Word のプログラムも、キーボードからのデータも全部一回はメモリに必ず入るのです。もちろん変換後のデータもです。
CPU が働いているのを見たことありますか?
ところが、この CPU が働いているところを見たことがある人は誰もいません。電子使い (よくSF やファンタジーに出てくるコンピュータなどの情報を頭で考えただけで見たり操作できたりする特殊能力を持つ人たちですね) ならいざ知らず、普通の人は目で情報の流れやデータの操作を見ることはできません。それはプログラムを作った人も同じです。
では、プログラムを作った人は、どうやって「よしよし、ちゃんと動いているな」とか「あぁ、バグった」とか判るのでしょうか?それは、やりたいことはプログラムで書いたので知っていて、入力データがわかっているので、出力データがこうなるはずというのもわかります。そこで、コンピュータの出力データをこうなるはずというデータを比較して、あっていれば OK、間違っていれば何かおかしいと判るわけです。つまり、間接的に知るということですね。
だから、CPU の仕組みやコンピュータの構成なんかを知らなくても、プログラムが書けて、それを CPU が理解できるデータに変換できて、処理すべきデータがあれば、結果を得ることができます。この「CPU が理解できるデータに変換」というところが重要です。
優秀なプログラマは、この CPU が理解できる変換、これはコンパイラとかインタプリタとか言いますが、これを熟知しています。さらに、コンピュータの構成も内部動作も知っています。でも、コンパイラの構造や内部動作を知らない普通の人も、「なぞ変換 (コンパイラ)」の使い方さえ知っていればプログラムを書いて動かすことができるのです。なぜならば、どんなプログラムを書いても、普通のプログラムを動かしてコンピュータが物理的に壊れることがないからです。もちろん、データは壊すことはできますし、意図した動作をしなければ、何の意味もないですが…。
しかし、FPGA の場合はそうはいかないところが問題なんです。下手を打つと FPGA の場合は本当に壊れます。ですから、慎重にならざるを得ず、その結果、FPGA を動かすための手続きが複雑になり、普通の人が気楽に使うことができないのです。
それでは FPGA はどう動く
では、FPGA はどのように動くのでしょうか?
CPU が処理したい動作をプログラムとして書いて動かしていましたが、FPGA は少し違います。FPGA は、元々は処理したい動作をする回路 (これが何かわからなくて大丈夫です) を書いて動かしていました。最近は「動作」を書くと「回路」が出てくる「なぞ変換」のおかげで、だいぶ簡単になってきています。で、回路って何?という話になりますよね。
ここでいう回路は、デジタル回路のことですが、なんだか難しそうです。なので、ここでは一旦棚上げします。また別の回で説明したいと思います。ここでは CPU と FPGA の動作の違いを見ていきます。
CPU と FPGA の「動かすまで」の違いをまとめます。
CPU は前にも説明した通り、プログラムを書いて、コンパイラなる「なぞ変換」で CPU が理解できる形に作り直します。それをメモリ上に置いて、実行するという流れです。
FPGA はもう少し複雑です。第一にプログラムではない何かを書きます。ここが CPU とまず違います。次に、FPGA で動かすための「なぞ変換」が沢山あります。この中身の説明は後の回でします。ここが CPU のコンパイラより複雑で怪奇です。そして、最後の実行ですが、ここも CPU とは違います。FPGA は、メモリ上に変換後のプログラムを置いて実行するということはしません。FPGA 内部に直接書き込みます。一度書き込むと、電源を切るまで忘れません。
CPU のようにプログラムをメモリ上に置いて、それを読みながら実行するのと、FPGA のように直接書き込んで実行するのとでは、何が違うのでしょうか?
つまり、CPU と FPGA の「動き」の違いのことです。
データは同じく外からメモリに入ってきて、それを処理するとします。処理結果のデータもメモリに格納して、外の世界に発信します。この部分は全く同じです。
ここで料理を例にとって考えてみます。料理は、材料 (データ) を入力して、レシピ (プログラム) に従って調理し、その結果、料理 (データ) をお皿に盛りますね。CPU はレシピを見ながら作る料理人で、FPGA はレシピを暗記している料理人になります。
どっちが優秀かは微妙です。レシピを覚えている量が少なければ大した料理人ではないですし、レシピを見ながらでも超高速に調理ができれば、それはそれで優秀な料理人です。これは適材適所ということがお分かりかと思います。
寿司屋では、お客さんの注文は単純ですが、魚の種類 (データ) が多く捌く量も多いです。こういうのは FPGA 向きですね。
それに対して、フランス料理は、たくさんのメニューから何が注文されるかわかりません。食材は限られていますが、調理法 (レシピ=プログラム) は多種多様です。実際のフランス料理人はレシピを見ながら作ることはありませんが、こうゆうのは CPU が得意です。
なんとなく CPU と FPGA の動作の違いがお判りいただけたでしょうか?
この回の最後は、なぜ FPGA という名前なのかについて説明します。
すべては FPGA という名前が悪い?
ここまで、あえて FPGA が何の略なのか説明してきませんでした。もちろん、FPGA はフィールド・プログラマブル・ゲートアレイ (Field Programmable Gate Array) の略です。これは、FPGA が最初に使われ始めた頃の状況を表しています。
「フィールド」とは現場のことです。どの現場かというと、この半導体デバイスが使われている現場です。「プログラマブル」は、これは分かりやすいと思いますが、コンピュータのプログラムで制御できるとかプログラム化できるという意味ではなく、この半導体デバイス (LSI) の機能を変更できるという意味になります。そして、最後の「ゲートアレイ」ですが、これは、半導体デバイスの種類のことです。厳密には、ゲートアレイは LSI の構造を指す言葉ですが、ここでは設計・製造したら変更できない半導体デバイスのことになります。
つまり、FPGA というのは、「現場で (ゲートアレイと異なり) LSI の機能を変更できるゲートアレイ (のようなもの)」となります。
CPU は中央演算処理装置というように、真ん中で頑張って処理するという目的のデバイスですし、GPU はグラフィック・プロセッシング・ユニットの略で、画像を頑張って処理するという目的を表しています。それに対して、FPGA は、こんな特徴ですという自己紹介しかしていないのです。これでは、FPGA は「何が出来て」「どんな目的」のデバイスか誰もわかりません。この辺りが、FPGA のわかりにくさの原因ではないかと思います。
90 年代に、FPGA のことを RPU、すなわち、リコンフィギャラブル・プロセッシング・ユニット (Reconfigurable Processing Unit) と呼んでいた研究者がいました。これは FPGA が持つ特徴と目的を併せ持った名前で良かったんですが、残念ながら、はやりませんでした。
調べてみると、xPU というのは APU から XPU まで見つかります。今のところ、YPU と ZPU はなさそうなので、この際、ZPU とかを名乗ってしまうのはどうでしょか?
ZPU の Z は何かって?もちろん「究極」を表す Z です。
まとめ
まとめです。
この回は、CPU と FPGA の処理方法の違いを説明しました。CPU は処理が書かれたプログラムを見ながら動き、FPGA は処理を覚えて動く、ということです。
この「覚えて」ってところが良い点でもあり、弱点にもなります。そのあたりの話を次回にしたいと思います。お楽しみに!
熊本大学 大学院先端科学研究部 飯田全広
※ 主に Peggy und Marco Lachmann-Anke による Pixabay からの画像を使用しました。