マイクロプロセッサ実装RTA(Copilot活用部門)

この記事は EEIC Advent Calendar 2023の13日目の記事として書かれています。

はじめに

EEICの3Aセメスターの必修科目「電気電子情報実験・演習第二」(通称後期実験)では、各実験室が主催する種目から選択(+抽選)で3~6つ(各5日/10日)で選択することができ、 各研究室の研究テーマに近い内容や入門部分について学ぶことができます。

今回はわたしが選択したうちの一つ、EEICの後期実験「マイクロプロセッサの設計と実装」で、RISC-Vプロセッサ実装のRTAをした話です。 本当は別の実験で考えていた、FPGA上でユークリッド距離を高速に求める方法を探求した話を書こうと思っていたのですが、最近それに関する素晴らしい記事を発見してしまいわざわざ書く気がなくなってしまいました。これ面白いので読んでみてください。 dora.bk.tsukuba.ac.jp

本題。「マイクロプロセッサの設計と実装」では、10日間の実験で各自RISC-VマイクロプロセッサをVerilogFPGA上に実装し、CoreMarkというベンチマークを用いて性能を評価します。以下に資料が公開されています。 exp.mtl.t.u-tokyo.ac.jp

実験期間が10日間しかないため半数くらいの人は期間内ギリギリでようやくCoreMarkが動くかどうかで、動いたやったー!で実験が終わるのですが、せっかくなので色々な工夫を実装してバリバリ性能上げたいですよね。ということで、前提のCoreMark完動に到達するまでの時間でRTAをしました。

レギュレーション

  • 実験初日にタイマースタート、CoreMarkがFPGA上で完動したらタイマーストップ
  • 配布されているALU・Decoderのテスト、サンプルのヘッダファイルは最大限活用する。
  • GitHub Copilotによる補完を活用する。

結果

実験開始直後、仕様をざーっと読んで出来そうなところから実装を始めます。時間内にALUを実装し、用意されていたテストを通過。その夜Decoderの実装とテストが終了しました。 この部分ではかなりCopilotが猛威をふるいました。配布されていたヘッダーファイルに実装するべきISAを列挙してあったので、いくつかの実装を示せば残りを補完してくれます。

Copilotによる補完のイメージ
そのため、正しいことが書かれているかを一個ずつチェックして、修正していけば自然とALUが完成します。(ちなみにこの画像の補完は結構色々間違っていますね)

その後も、Copilotが正しく推論できるようになるところまで自分で記述し、Copilotが補完してくれるようになったら自分が思っている内容と一致しているか照合、という流れを繰り返し、実装を進めました。 結果、なんと実験2日目が終了した時点でプロセッサの各パーツと、それらをつなぐそれっぽいトップモジュールが完成しました。

でも全体テストをいくつか実行しても全く動かない!ここからしばらくデバッグ編に入ります。 結局CoreMarkがシミュレーション上で動くようになったのが4日目、実機で動いたのが5日目のはじめになってしまいました。大幅なロスタイム

バグの原因は主に自分で実装した部分で、設計を見直して各モジュールの組み換えを行うことで解決しました。なお最後に残っていたバグはこれでした。

命令デコードの際、即値を符号拡張し忘れていた
この部分Copilotがうまく書いてくれなかったから自分で書いたんですよね……。ISAをちゃんと読んでいないことが原因でした。全然Copilotのせいじゃなかった

まとめ

今回、Copilotを駆使してマイクロプロセッサを実装した結果、実験5日目にしてCoreMarkを完動することができました。ここ2年の中ではトップタイの速度だったようです(進捗報告リストから確認)

完走した感想ですが、Copilotとか以前にプロセッサ書き書きがかなり楽しかったです。分岐予測をちょっとずつアップデートしてちょっとずつ正解率を上げたり、少し接続を変えて周波数を上げるみたいな細かい最適化をしたりするのが楽しかったです。

Copilotはかなり強力で、ある程度流れを示してあげるだけで残りを補完してくれるので実装が爆速になります。 しかし補完の内容は結構間違っていて、またまっさらな状態を渡しても補完してくれないので、

  • 実装したいことが自分の中ではっきりしている
  • 補完した内容の正しさを判定できる
  • 埋め込んだバグを気づかなかった自分の責任だと思える

ときに限って有用なツールであると感じました。Pilotではなく、あくまでCopilotであるということを認識しておきましょう。

GitHub Copilotは学生なら無料で試すことができるので、まだ試していない人はぜひ。 education.github.com

その後

実験の時間が余ってしまったので、残りの時間はCoreMarkスコアアタックに費やしました。 パイプライン化・分岐予測器・乗除算器を実装し、当初から10倍性能を向上しました。 過去スーパースカラを実装した人が何人かいらして、その人達のスコアには届かなかったので、時間があるときにリベンジしようと思います。

最終日の発表資料を載せておくので、興味があれば御覧ください。 drive.google.com