ニューロン、考え出すと面白い。今日は通信編

意識する機械のニューロン、3千ロジックエレメントを持つチップに16のニューロンモジュールを設け、それぞれのモジュールが256のニューロンを担当することとしましょう。結局、500円のチップ一つが4096のニューロンの働きをすることになります。

ここで、FPGAのロジックエレメントとは、1ビットの加減算が出来る最小の論理回路で、ニューロンそのものは3ビットの加算と、16ビットの加算、8ビットデコーダ程度ですから、30程度のロジックエレメントで一つのニューロンが構成できるでしょう。

さて、通信は、チップ間の通信と、チップ内部のニューロンの通信があります。ニューロンを8次元接続する場合、3つの次元はチップ内部、5つの次元はチップ外部と接続されます。これらの接続は、次元ごとに異なるモジュールが担当することにしましょう。

送られる信号は、ニューロンの興奮を表す4ビットの信号(符号1、指数部3ビット)で、接続先のニューロンを特定する4ビットの符号と、シナプスを指定する12ビットの符号と共に、特定次元の配線に出力されます。

一つのニューロンモジュールに割り当てられるRAMは、受信側では256の時分割×4000のシナプス×(信号強度4ビット+係数4ビット)の1MB必要で、チップ一つで16個のニューロンモジュールを含むときは16MB必要ですから、外付けのRAMに格納するのがよさそうです。(送信側もありますしね。)

RAMは、種々の次元に接続されてますので、リクエストをバッファに受けるようにします。チップ内部のシナプス接続であれば、送信側の要求をチップ内でRAM書き込みバッファに送ればよい。

チップ間のインターフェースには、いろいろな方式があると思いますが、ここでは速度を狙って、5チャンネルの4ビットデータ線と12ビットのニューロン識別信号、12ビットのシナプス識別信号、及び4ビットのアドレス線を、パラレルに接続することを考えましょう。本来の8次元接続であれば、チップ内の4000のニューロン全てが5チャンネルの通信線を持たなくてはいけないのですが、それではハードウエアが大変になるため、それぞれの通信チャンネルは4000の通信チャンネルをまとめて引き受けることにします。このために、ニューロンを指定するアドレスはビットの数が多くなります。

各チップの出力と次のチップの入力を結ぶ形でループ状に接続しておきます。通信制御モジュールは、受け取ったアドレスがゼロでない場合は、アドレスを一つ減らして次のチップにデータとアドレスを送ります。アドレスがゼロなら、自分のチップに送られたデータと解釈し、指定されたアドレスのRAMに書き込みリクエストを送ります。また、アドレスゼロのデータを受け取ったタイミングで、送信待ちのデータがあれば、これを送ります。送信待ちのデータがなければ、空信号を次のチップに送ります。空信号を受け取った場合は、受信処理をスキップして送信処理を行います。

このような方式を使うと、一つのループにいくつものデータを同時に送ることが出来ます。