そもそも「FPGA」って何なんですか? (3)

前回、FPGA は小人さんを流れ作業で働かせるという話をしました。第3回では、この「働かせる」という部分を掘り下げていきたいと思います。働かせるための指示書である CPU のプログラムとFPGA のそれがどう違うのかに迫っていきたいと思います。

CPU のプログラムって何?

プログラムとは何でしょうか?

一般的には、やるべきことの順番を示したものですね。例えば、運動会のプログラムでは、1.入場行進、2.開会式、3.ラジオ体操、という具合です。コンピュータのプログラムも基本的には同じです。つまり、前にも説明した通り、コンピュータに処理させる内容とその順番を示したものです。コンピュータのプログラムは、日本語で書かれてもわかりませんので、プログラム言語を用いて書かれます。それを第1回で説明した「なぞ変換」であるコンパイラが、コンピュータが理解できる形式に変換します。

プログラム?

ところで、むかし 5W1H ゲームというのがありましたが、皆さんはご存知でしょうか?

これは、「いつ (When)」「どこで (Where)」「だれが (Who)」「何を (What)」「なぜ (Why)」「どうした (How)」のタイトルの紙を参加者が1枚とり、それに好き勝手書いた後、持ち寄って文章をつくるゲームです。例えば、「昨日、墓の中で、サンマが、ステーキを、腹が立ったので、頭に乗せた」のように、意味不明かつ奇天烈な文章が出来て笑いを生む遊びです。いや、この遊びがなぜ笑いを誘うかについて話すつもりはありません。

実は、プログラムもこの 5W1H が重要なのですが、「どこで (Where)」「だれが (Who)」「なぜ (Why)」の3つが抜けているのです。つまり、プログラムには「何をして」とか「この順番でやって」とかは書かれますが、「だれが」とか「どこで」というのは書いてありません。まして理由なんかどこにも書かれません。「だれが」はプロセッサが1つなら自明ですし、「どこで」もメモリーの1カ所しかないからです(正確には「どこのデータを」という意味ですが)。それに「なぜ」を知らなくてもプロセッサは働いてくれます。これで書く項目が半分に減るので、グッと簡単になります。その結果、逆に複雑な手順や処理内容を書けるようになり、発展してきたという歴史があります。

「なぜ」はどうでもいいのか…?

FPGA には何を教えてあげればいいの?

一方、FPGA の方はどうでしょうか?実は、この「だれが」と「どこで」というのが問題になります。これについて詳しく見ていきます。そのためには、FPGA にどうやって仕事をさせるかを順を追ってみていく必要があります。

まずは、やることを決めます

FPGA の処理は、CPU のプログラムと同じように「何を」と「どう」するかを書きますが、「いつ」するかの書き方が違います。CPU では「あれがこうなったら、こうして」のように条件で処理を変えたり、「〇〇回実行」のように繰り返し処理するやり方を駆使して、どう言う順番で何を処理すればいいかを書いていきます。FPGA では流れ作業を書かなければならないので、「あれがこうなったら、こうして」のように条件で処理を分けるというよりも、処理したデータの送り先を変えていきます。繰り返し処理も自分自身へ送る処理です。つまり、FPGA では、処理の内容を書き出し、その処理間のデータの受け渡し先を変えていくイメージです。CPU ではデータに対して条件に従って処理内容を変えていくイメージです。

ということで、まず、やることをすべて書き出します。

例えば、カレーを作る場合、1.食材を切る、2.食材を炒める (焼く)、3.食材を煮る、4.カレールーを入れて煮る、と大きく分けて4工程があります。しかし、それぞれの工程は、実は細かく分かれていて、例えば1.の食材を切るでは、肉を切る、野菜を切ると分かれ、さらに野菜を切るは、ニンジンを切る、ジャガイモを切る、玉ねぎを切る等に分解されます。それぞれは似ていますが異なる処理です。さらに、2.の食材を炒めるでは、炒める順番も大事です。先に硬いニンジンから炒め、玉ねぎ、ジャガイモを入れ、最後に肉を入れるなどです。

つまり、FPGA で処理する内容を書き出す場合は、小さい単位の処理をまとめて大きな処理にするという階層化を考えて書き出すことになります。

カレー作成フロー

つぎは、ここで書き出した処理のつなぎを考えます。例えば、ニンジンを切る、玉ねぎを切る、ジャガイモを切る、肉を切るという作業は、同時に進行できますが、最初に炒めるニンジンから処理した方が良さそうです。そして、切ったニンジンは 2. の工程の炒めるためにナベに送られます。以下同様に、すべての処理の順番と、各処理の入力と出力が決められます。これで、この FPGA ではニンジン、玉ねぎ、ジャガイモ、肉、油、水、ルーを入力として、最終的にはカレーが出力される処理 (カレー作成フロー) の記述が出来ました 。実際のカレーでは「焼く・炒める」と「煮る」は同じナベで行われますので、この並列処理は時間並列ですね。つまり、野菜を炒めて、次に肉を投入して炒めて、最後に水を入れて煮るという時間順です。

そして、小人さんに割り振ります

さて、「処理の記述」が出来れば FPGA で実行できるかというと、この状態ではまだできません。「だれが」実行するのかを考えなければならないからです。つまり、各処理を小人さんに割り振らなければなりません。ここで「仕事の割り振り」を考える上で、必要な情報について整理します。

引き続きカレー作成 FPGA の例で考えると、1つ目は食材の到着順番です。ニンジン、玉ねぎ等がどういう順番で到着するのか、また、同時に到着する食材はあるのかなどが重要になります。2つ目は各処理を行う場所と各処理間の接続です。これが大変な作業です。

最初は厨房には調理台が沢山並んでいる状況です。それぞれの調理台には何人かの小人さんがスタンバイしています。ここで、一つの調理台では一つの処理しかしません。さて、食材の到着から調理台までの接続、ある調理台で調理された中間食材の次の調理台への接続等は、すべて自動化するためにベルトコンベヤーで接続されます。つまり、各調理台の小人さんには仕事の内容を配布し、各調理台間をベルトコンベヤーで接続するわけです。簡単に言うと完全自動のカレー工場を作るのに似ていますね。

これで「どこで」処理するかも決まりました。「だれが」処理するかもおのずと決まります。それは、各調理台に配置されている小人さんたちです。それぞれ決まった仕事が割り振られ、それだけを行います。

この小人さんへの仕事の配置とベルトコンベヤーの接続 (配線) が効率よくできると、全体としてカレーが素早く生産されるということです。下図の左と右では右の方がうまくいきそうです。この配置と配線が FPGA で一番時間が掛かり、かつ性能に効いてくるところ、というのがお判りいただけたでしょうか。

カレー工場の出来上がり

結局、手順なのか構造なのかの違い

さて、以上で小人さんたちのカレー工場ができました。このカレー工場を作るのに難しいところは小人さんへの仕事の配置とベルトコンベヤーで接続する部分です。

その理由は、ここでは中間食材が行き来しますが、間違わないように受け渡しをしなければなりませんし、時間が掛かっては冷めてしまいます。また、各調理台の仕事の配置次第では、そもそもベルトコンベヤーで接続することができないかもしれません。うまい配置では、ベルトコンベヤーも短くて済み、カレーが出来上がるまでの時間も早く済みます。

つまり、FPGA を働かせるためには、処理手順だけを示せばいいのではなく、処理手順とそれを処理する構造まで決めなければならないのです。ここが CPU と FPGA の大きな違いです。

まとめ

今回のまとめです。

今回は、「FPGA をどうやって働かせるか」について説明しました。CPU は「いつ」「なにを」「どうする」がわかれば処理できるのですが、FPGA はこれらに加えて「だれが」と「どこで」が必要でした。

つまり、CPU はデータに対して処理を変えていきます。FPGA は逆に処理の連なりにデータを流していきます。この処理の連なりを作ることが FPGA を使う上で難しくしている原因です。

しかし、利点もあります。カレー工場の例でもわかる通り、一旦できてしまえば、材料を入れるだけでじゃんじゃんカレーが生産されます。CPU の場合は基本的に一人しかいないので、別の仕事が入ると中断してしまいますが、FPGA の場合はそれはありません。なぜかって?それは、1つしか仕事を覚えていることしかできないからです。別の仕事をさせようと思うと、工場を作り直さなければならないからです。

ということで、今回は FPGA の仕事ぶりを見てきました。次回こそ、この工場設営の自動化の秘密に迫っていきたいと思います。お楽しみに!

熊本大学 大学院先端科学研究部 飯田全広

※ 主に Peggy und Marco Lachmann-Anke による Pixabay からの画像を使用しました。

タイトルとURLをコピーしました