CPU実験体験記(24er-5班コア係)

 

CPU実験とは

CPU実験とは、理学部情報科学科3年Aセメスターに行われる実験であり、約4人の班に分かれて「CPU」を1から作るという催しです。目標は以下です。

  • minCamlという独自(?)言語で記述されたプログラムとデータファイルを受け取り、プログラムが出力すべきものを生成する。これが有限時間でできることを、「完動している」と表現する。
  • 完動した後は、実行時間を短くすることが想定された目標である。

 

配布されたFPGAボードを使わなければいけないこと以外には、基本的に何の制約もありません。そして、ガイドもありません。初回授業時には、班分けが発表された後は何の指示も出されず、教室が困惑した空気になっていたのを覚えています。

4人には係が割り当てられていて、概ね期待された役割があります。

係の分かれ方は時代によって異なる場合があるので、明確にしておきます。24erの年は以下のようになっていました。

  • コア係 ... コアを作る(HDL)
  • FPUメモリ係 ... FPU及びキャッシュを作る(HDL)
  • シミュレータ係 ... シミュレータを作る(C系)
  • コンパイラ係 ... コンパイラを作る(OCaml, Rust, その他の関数型っぽい言語)

私はコア係でした。

ボード

配布されるFPGAボードも時代によって変わっています。過去には7コアのCPUを制作してキャッシュも無しで一桁秒代の記録を出していた班もありましたが、22erの年からFPGAボードがグレードダウンされ、許容される回路規模は小さくなり、"キャッシュ"の作成が事実上必須になりました。

自班ハードウェアの方針

色々と独自のアイディアを考えて空想を練っていたのですが、実際に動くものを作り、その過程で様々な制約との応酬を感じることもCPU実験の意義であると思ったので、最終的には既に確立された手法に沿って実装することになりました。

使ったもの

  • 高性能コンピュータ技術の基礎 | Hisa Ando | 工学 | Kindleストア | Amazon 最終的に、コア係の私とFPUメモリ係さんはこの本を参考にしながらハードウェアを実装しました。
  • ハリス本 インオーダーパイプラインプロセッサについて詳しく書かれていて、普通はこれを元にまず動くコアを作ります。私はインオーダーが気に入らず初めからOoOを書いたのでしっかり読み込みませんでしたが、コード辺を参考にしたりしました。
  • verilator 信号が対応していない、ビット数が違うなどの、verilogのコードの怪しい箇所を指摘してくれます。私はお世話になりましたが、FPUメモリ係さんはこういったことが自力でほぼ完璧にできるタイプの人間らしく、使っていませんでした。

使わなかったもの

  • ロジックアナライザ "闇"とだけ聞いていたので使いませんでしたが、最後デバッグがかなり炎上していたので検討すべきだったかも?
  • LLM 実験の意義を損なわない使い方ができる自信がなかったので、とりあえず使わないことにしました。使っても良いと思います。

自班ハードウェアの成果物

動いたもの

Out of Order の4スレッドコアを作成し、これが動きました。FPUメモリ係さんはOoOに適したキャッシュであるノンブロッキングキャッシュを作成しました。コンパイラ係さんはプログラムの並列性を検知(大変!)するコンパイラを書きました。

動かなかったもの

上記のコアを二つ接続したデュアルコアプロセッサを実装しました。FPUメモリ係さんは二つのコアのキャッシュを調停する仕組みを実装しました。

 

歴代のCPU実験における自班の珍しい点

ボードの縮小およびキャッシュの登場から3年目の代だったので、いくつかの実績をアンロックすることができました。

  • キャッシュが登場してから恐らく二班目のOoOを実装した班(一班目は23erの1位?)であり、恐らく初めてOoOに適したキャッシュであるノンブロッキングキャッシュを実装した。
  • キャッシュが登場してから恐らく初めて並列実行向けコンパイラおよびマルチコアを実装した班であり、恐らく初めてマルチコアにおけるキャッシュ調停を実装した。
  • マルチスレッドコアを実装した。(回路資源が豊富な旧ボードの場合、並列実行向けコンパイラを書いたら先にマルチコアにした方が効率的であるためか、取り組んだ班が歴代にあまり見つからなかった。)

 

結果

この年からnegative slackがあるまま合成することが禁止(negative slackを攻めるのが強かったため)され、周波数を上げるのが少しだけ難しくなりました。

自班の "256x256" に対する実行時間は 62.8605 秒で、7班中の2位でした。3位は80秒台、4位は100秒台だったと記憶しています。1位は新ボードでの歴代記録を大幅に更新していました(結果は一応伏せておきます)。

 

デュアルコアプロセッサが動いていれば、単純に考えれば二倍の速度になっていた(計測に使うプログラムは並列性が非常に高いことが知られています)ので、方針としては悪くなかったと思うのですが、実装しきれませんでした。

とはいえ、(CPU実験としての)新規性のあるハードウェアを作ることができ、実際にひどくない速度が出せたことには満足しています。

謝辞

TODO

𝑩𝑰𝑮 𝑳𝑶𝑽𝑬______

 

最終レポート

おわりに

連続系アルゴリズム演習を放置してマルチコアのデバッグをしていたら単位を落としてしまいました。どうすれば良いでしょうか?