Shoubu上での人工小脳の開発

4月上旬の時点ではShoubu全体の約80%にあたる1008 PEZY-SCが使える状態で、単精度のピーク演算性能は2.6PFlopsであった。そこに、ネコ一匹分に相当する10億ニューロンの小脳を実装した。この小脳を平面に広げると、62mm×64mmの面積となる。これは世界最大規模で、これを時間刻み1msで計算して実時間シミュレーションを行うのは世界最高速で、最も精緻な小脳モデルであるという。

Shoubuへの人工小脳の実装。世界最大で最高速の実装で、最も精緻なモデルという

シミュレーションを行うに当たって、この小脳を平らに広げて、1008個のPEZY-SCチップに対応させる。この時、1チップに2mm角の小脳を分担させることになる。

1008個のPEZY-SCチップに小脳をマップする。1チップは2mm×2mmの小脳を分担する

1チップには、1M個の顆粒細胞(GR)1024個のゴルジ細胞(GO)、32個のプルキンエ細胞(PKJ)、32個の分子層介在細胞(BS)、1個の下オリーブ核(IO)、1個の前庭神経核(VN)が含まれることになる。

1チップは1M個の顆粒細胞を分担する

プログラムとしてはシナプスのコンダクタンスを計算するループと膜電位を計算してスパイクを発生するループがあり、これを全細胞について繰り返す。そして、コンダクタンス計算、膜電位の更新、スパイク生成の部分は、PEZY-SC上で動作するカーネルを呼び出して計算する構造になっている。

シナプスのコンダクタンスを計算するループと膜電位を計算してスパイクを生成するループをホストで実行する。コンダクタンス計算などのカーネルはPEZY-SCで実行する

プログラムの実装は、ホストコードはC99、PEZY-SCのコードはPZCL(OpenCLの主要機能をサポートするPEZY版の言語)で記述している。このとき、先ず、元のCUDAプログラムをOpenCLに書き直し、それをさらにPZCLに書き直すという2ステップの移植を行うとスムーズにできたとのことである。

とりあえずPEZY-SC上で、8192スレッド並列で動作させるのは容易で、敷居は低かったとのことである。ただし、その版では性能は低く、実時間のシミュレーションには遠く及ばず、性能向上との戦いになったという。

CUDAからPZCLに書き変え、一応動作させるのは容易であったが、性能向上には苦戦した

PEZY-SCは次の図のように、4個のPEを含むVillage、4個のVillageからなるCity、16個のCityからなるPrefectureという階層構造で出来ており、4つのPrefectureがPEZY-SCチップを構成している。それぞれの階層にキャッシュが付いており、性能向上のためには、これらをうまく使うことが重要になる。

PEZY-SCチップの階層構造

PEZY-SCチップ1個に実装する顆粒細胞の総数は1Mであるが、これを32×32クラスタに分割し、各クラスタは1024細胞とする。そして1PEには1クラスタ(1024細胞)を割り当てる。クラスタ内の細胞は必ず同時にアクセスされるので、この割り当てはプログラムの処理上も有利である。

実装する1M細胞を32×32クラスタに分け、1クラスタは1024細胞とする。これを1PEに分担させる

また、PEZY-SCのPEは16KiBのローカルメモリを持っているので、これを積極的に利用したいが、1024個の細胞のV、gex、ginhという3つの変数をローカルメモリに置くと、それだけで12KiBを占めてしまう。そうなると、4KiBしかスタックに使えるローカルメモリが残らない。1PEで8スレッドを動かせるが、そうするとスレッドあたり512バイトのスタックで、さずがにこれではスタック領域が足りないので4スレッドだけを使うという実装にしている。さらに、スタックの気持ちになってコードを書き、なんとか4KiBに抑えたという。

PEあたり16KiBのローカルメモリに1024細胞のV、gex、ginhを載せると、残りは4KiB。スタックをこのサイズに抑えるのに苦労した