「スーパーコンピューターを20万円で創る」を2480円で創る #1

この記事は[2022年天文情報学AdventCalendar](https://qiita.com/advent-calendar/2022/astroinformatics)12/19の記事です。とりあえずカレンダーを作ってみた者です。そして内容はネタ記事です。何というかすみません。

皆さんは「スーパーコンピュータ」と聞くと何を思い浮かべるでしょうか。今であれば富岳でしょうし、ちょっと前なら京、地球シミュレータ、とまぁ現在も比較的日本が頑張っているコンピューティングの一分野ではないかと思います。そもそもスーパーコンピュータとは何ぞや、という話もある訳ですが（そのあたりは[Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%BC%E3%83%91%E3%83%BC%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF)を参照していただくとして）、基本的には複雑なシミュレーションを高速に行う為に使われるコンピュータ、というところかと思います。
とにかく大量の演算をこなす事が特徴のスーパーコンピュータですから当然のように相当な予算が投入されてナンボの分野ではあるのですが、かつてシミュレーション天文学の専用計算機として僅か20万円で創られたスーパーコンピュータが80年代の日本に存在していました。その名もGRAPE-1。1989年に東大で開発された、３体以上の天体の相互に働く重力を計算する為のコンピュータです。
３体以上、というキーワードでピンと来た方もいらっしゃるかも知れません。NHK「笑わない数学」にも登場した、「２体の天体の相互作用は解析的に解けるが３体以上は解けない」というポアンカレが証明したアレです。ただ解析的には解けなくても相互作用の経過をシミュレートする事は専用のコンピュータを作れば可能だよね？と80年代の天文学者は考えました。そして実際に彼らが部品代20万円で作ってしまったのがGRAPE-1です。

GRAPEおよびその後継プロジェクトは天文学の分野で様々な画期的な成果を挙げますが、少なくともGRAPE-1は「20万円で創られたスーパーコンピューター」という事実の方が世間に対してインパクトをもたらしました。前述のようにスパコンが高いのは現在でも当たり前ですが、当時も金額的に数十億円以上の代物で、それと同等の性能を(ごく限られた計算についてのみ)持つコンピュータが20万円で出来たのですから、話題になったのも当然でしょう。

もちろん、20万円なのには理由があります。GRAPE-1は汎用的なコンピュータではなく「重力計算のみ」を行うパイプライン型計算機で、ユニバーサル基板上に汎用的なICを97個並べてワイヤラッピング(端子間を細い単芯ワイヤーで結線する手法。ハンダでの固定なしに結線でき解くのも容易なので、現在でも試作レベルでは使われる事はあるのではないでしょうか。作業的には100本くらいまでなら楽しいがGRAPE-1は3000本)で配線して作られていました。そこにはCPUもOSもありません。複雑な計算はGRAPE-1に接続したホストコンピュータに任せ、単純な計算のみを「大量に」「少ないクロックで」実行するパイプラインそのものがGRAPE-1の構造です。その計算速度は実に160Mflopsに達しました。今でこそ「ふーん」という数値ですが、1989年当時としてはスーパーコンピュータと呼称して差し支えない計算速度でした。
なおGRAPEシリーズの概要についてはこれまた[Wikipedia](https://ja.wikipedia.org/wiki/GRAPE)をご参照ください。GRAPE-1の開発経緯については伊藤智義先生著の集英社新書「[スーパーコンピューターを20万円で創る](https://shinsho.shueisha.co.jp/kikan/0395-g/)」に詳しく書かれています。[小飼弾氏による書評](https://dankogai.livedoor.blog/archives/50878135.html)も熱いですね。余談ですが、この本の著者でありGRAPE-1のハードウェア開発担当者である伊藤先生はインターネット老人会級の人達には懐かしいであろう漫画「栄光なき天才たち」の原作者（一部）である他、コンピュータ黎明期の人々を描いた漫画「BRAINS」の原作者でもあります。私は特にこの後者が大好きで、その中の台詞、

> 数学者が壮大な構想を描きがちなのに対して、工学者はより現実的であろうとする

は工学系の人間としての生きる指針となっております。伊藤先生ありがとうございます。ただ天文学界隈は構想と現実の両方に手が出せる化け物が多いのでGRAPEというプロジェクトが80年代に成立したのだと思いますが。それはさておき。

さてGRAPE-1のブロックダイヤグラムを見てみましょう。
![diagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952610/1fa77a5f-4e59-1072-4cc6-227763b68067.png)
左端のxj, yj, zjはホストからの入力、右端のF各種はホストへの出力です。計算が行われる前に左側のRAM(x, y, z)にはすべての星（粒子）のベクトルが保存され、ホストからの入力と粒子の位置差とその-1.5乗が計算されΣがとられつつ経過をホストに送信する流れです。各ブロックは大雑把に言えば以下から成り立ちます。

* シミュレーション対象となるすべての星（粒子）の３次元位置(x, y, z)をストアするRAM（固定小数点、16bit）
* ホストから送信されてくる任意の星の位置(xj, yj, zj)とRAM上の各星の位置を減算しては次段に渡すALU
* ALUの出力を8bitの対数に変換するテーブル、それをアドレスとして二乗や-1.5乗に変換するテーブル、それらから求めた結果を固定小数点実数に戻すテーブル、等を格納するROM
* ROM群からの出力をひたすら加算しつつ結果Fをホストに戻すALU

やりたい事は以下の数式で表されます。
![frac.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952610/49dd0680-f8fd-f44e-4478-e99426ef83e7.png)
rは３次元ベクトル、eは簡単にはゼロ除算を防止する定数、mはGRAPE-1では1に決め打ちするのでここでは無視します。で、肝は任意の星とRAM上の全星の一つ一つの位置の差を各々-1.5乗するところなのですが、GRAPE-1ではそれをテーブル参照でやっています。要はハイコストな計算を全てテーブル参照でやっているのです。初めてこのブロック図を見たとき思わず「全部ROMやんけ…」と呟いたものです。

そう、そこなのです。「256Kb程度のROM参照を何個か経由すれば必要な計算ができる」という仕様そのものがGRAPE-1の凄みで、求めたい値の精度は8bitの対数とそれでアドレッシングできるROMに収まる値で出せるというアイデアが「20万円」を実現できたその根幹になります。

なお、ハイコストな計算をテーブル参照で行うという流儀自体はCPUの進化と共にあまり使われなくなっていきます。アーケードゲームの開発をやっている大学の先輩方(アセンブラで3D格闘ゲームを書いてしまう人達)が「おっさん開発者がテーブル使え煩いねん、使わん方が速いのに」とぼやいていたゼロ年代初頭が思い出されます。メニーコアやGPUでの並列化計算が普通になった現在では、解きたい問題のほとんどは汎用コンピュータの上で適切にコードを書いてそこそこの時間内で計算できる時代になりました。ただし、それでも片付けられない計算コストのかかる問題の為に今もスーパーコンピュータが存在します。

さて。
そんなGRAPE-1のブロック図と配線図（杉本大一郎先生の著作「手作りスーパーコンピュータへの挑戦」に掲載されています。絶版）を眺めていて思いました。
これ[Tang Nano 9K](https://wiki.sipeed.com/hardware/en/tang/Tang-Nano-9K/Nano-9K.html)で出来んじゃね？

筆者にはたまに秋葉原の電子パーツ屋を回遊しないと死んでしまう習性があり(嘘)、無駄に基板を買ってはガラクタ箱に積んでしまう、いわゆる「積み基板」という悪癖があります。最近も「一つ積んでは俺の為」と秋月電子で購入したSiPEED社のFPGA基板「Tang Nano 9K」の存在をこの時思い出したのです。
その売価は2480円。FPGAの学習基板と言えば１万円超えが普通であった(現在もメジャーなメーカーではそれは普通ですが)頃から比べると学習障壁が相当低くなったのは有難い事です。

Tang Nano 9Kに搭載されているFPGA、GoWin社GW1NR-9のスペックを見てみましょう。RISC-Vの搭載を意識した設計とかでまぁまぁ色々と乗っかっています。

* Logic Unit: 8640
* Flip-Flop: 6480
* ShadowSRAM: 17280bit
* Block SRAM: 468Kbit(18Kbit x 26ブロック)
* pSRAM: 64Mbit
* 18x18bit乗算器: 20

そしてGRAPE-1的な何かをTang Nano 9Kで実現する事を検討してみましょう。恐らくロジック数が足りないという事はないと思います。星の位置情報を保存するRAMとしてはBlockSRAMを使いましょう。GRAPE-1のRAM合計(256Kb３個)と比較するとBRAM108Kbは明らかに足りませんが、星の数の上限を数K個に抑えれば良いのです。とりあえず動くモノを作るのがこういう時は大切です。
そもそもですよ、GRAPE-1を2022年に再現しようとする思い付き自体が全く意味の無い事であり、私の興味を満たせればそれで良い訳であります。なお私は現在電波望遠鏡の解析ソフトウェアの開発に携わっていますが、FPGAについても天文学についても素人です。電子工学の素人である天文学者達が創り上げたGRAPE-1を、天文学と組込系の素人である筆者がやろうとする事にそこそこの面白さと発見が(私の中だけで)生まれるのではないかと思います。

話を回路検討に戻して、固定小数点実数の減算及びΣ加算器については特に考える事はないでしょう。ホストPCとの通信も「とりあえず動かす」の精神でUSB-UARTによるシリアル通信を使い、そこがボトルネックになればSPIへの切り替えを検討します。問題は対数変換と位置微分の-1.5乗をどう実現するかですが、実数→対数変換以外はどういう手を考えてもクロック数でテーブル参照より優位な手段が今のところ思い付かないので、今はPSRAMに全部詰め込む方向で考えてみます。GoWinが提供しているIPではPSRAMの読み出しクロック数が非常に多いものの、少ないクロック数で読み出せるモジュールを作成していらっしゃる方がいますのでそれを念頭に置きます。PSRAMの初期化については、MicroSDに初期化用データを置いておいて起動時に読み出す、といったところでしょうか。この参照テーブルデータをMicroSDの差し替えで切り替えられればいろいろな応用が効きそうな気がします。PSRAMがどうやら使えないようであればEPROMを外付けするとかおかしな行為に走りましょう。大丈夫！うちは平均的な家庭なのでROMライタやEPROMイレーザくらいは掘れば出てきます。
最終的に使い物にならなくても積み基板の供養にはなりますし、SystemVerilogの勉強にもなるのでOKでしょう。穴は…無いな…(誰かに怒られない限り…)。なおTangPrimer20Kが入手できればそちらに切り替えるかも知れません。その際は…3000円？


さてここまで書いてみてこの記事が１、２回程度で収まる内容ではない事に気が付きました。ここらで切らせて頂いて、次回は開発環境構築について書く予定です。