CPU実験の振り返り(シミュレータ係,前編)

私の所属する学科の名物実験であるCPU実験も大詰めに近づいてきたので,このあたりで途中経過を振り返ってみたいと思います.
CPU実験についての説明は先輩方が丁寧に説明したくださっている記事があるのでそちらをご覧ください.「CPU実験」と検索すると沢山ヒットします.
また,私の代でこの授業に大幅な変更がありました.詳しくはこちらをご覧ください.


9月後半 軽い予習

このあたりでどの係にするかの希望を出します.先輩のブログや説明資料から考えて,私はシミュレータ係を希望し,そのまま通りました.コンパイラ係の希望が少し多かったので,一部の人がコア,FPU係に移動していました.

係も決まり,特にすることもなかったので軽く予習をしておくことにしました.CPU実験のシミュレータは他の係がデバッグに用いるため,なるべく高速に動作することが求められます.そのため,CやC++のような高速な言語で開発するほうが好ましいです.また,班員がコードを確認したり,改造を加えたりすることもあるので,班員も扱える言語のほうがよいです.Cは必修だったので全員使えますが,あまりにもライブラリが乏しいため,C++を使うことにしました.私はJavaをよく使っていたのでこれの履修には特に苦労しませんでした.


10月前半 顔合わせ,初期ISA決定,Fibシミュレータ作成など

10月になって班の割り振りが決定され,ここから進捗発表会が始まります.
最初の1週間でISAとしてRISC-Vのサブセットを使うことを決定しました.大体の班が同様な決定をしていましたが,配布されるコンパイラがデフォルトでPowerPCのアセンブリを出力できることからそれをISAとして使った班もありました.

ここからまずはフィボナッチ数を計算できるコアの作成を目指します.
シミュレータ係としてはいかに早くシミュレータを作成して班員が使えるようにするかが重要だと思ったので,ISAの決定の数日後にはアセンブリの書式の決定とそのインタプリタの作成を終えました.この後必要そうな機能を追加していきます.例えば,

  • ブレークポイント機能
  • 命令の巻き戻し機能
  • 実行命令数などの統計情報表示

などが挙げられます.統計情報はデバッグにはあまり使いませんが,コンパイラやISAの改良を行う際に使われました.

アセンブラについては,コア係が作ってくれたものを互いに機能拡張するという形で開発しました.


10月後半 GUIの作成, FPU, メモリの組み込み

このあと,GUIの作成をした班があったので,対抗して(ほぼ自己満のために)GUIの作成にもとりかかりました.JavaでGUIを作ったことは何度かあったので,メインの処理は今まで作ったCLIのソフトにさせ,それとプロセス間通信をさせる形でJavaのGUIを作成しました.一応コア係には好評だったのでよかったですが,他の機能拡張を優先すべきだったかもしれません.

また,このころFPUのVerilogでの実装が少しずつ上がっていたので,それをC++に落とし込む作業をしました.本来のハードウェア開発ではシミュレータが作成→それとまったく同じ挙動をするようにハードウェアを開発の順番なのですが,仕事の分担の関係上,FPUに関しては逆転してしまうのは仕方ない気がします.久しぶりのVerilogのコードに戸惑い,検証のコードにバグを仕込むというやらかしを行い,FPU係に迷惑をかけてしまいました(すみません).

でも,これだけは言わせてください.C++のシフトの仕様は罠です[1]

あとメモリの組み込みもこの頃行いました.

班の進捗としてはこの頃フィボナッチ数を計算できるコアはできていた気がします.


11月 機能拡張,高速化,1stシミュレータの完成?

以降,FPUが作ってくれたコードをC++に落とし込みながら機能拡張を続けました.この頃行ったものの例としては,

  • エントリポイントへの対応
  • ディスアセンブラの作成
  • ワードデータを以下の表記で相互変換できるツールの作成
    • 符号有無と2・10・16進法の変換
    • メモリの実装と同じエンディアンでエンコードしたときの4バイト
  • 高速化
    • gprofでどこが時間かかっているかを調べられる

アセンブラを作ると同時にディスアセンブラを作っておけばアセンブラのデバッグをかなり効率化できたので,これについてはもっと早く作っておくべきだったなと思っています.

以上とMMIOによる通信とキャッシュのシミュレータを追加して,1stコアのシミュレータを終えました.例年であればここで単位を確定できるのですが,今年からは速度予測が必須になるので,コアが完成させて速度予測に必要となるパラメータを収集できるまで単位はお預けです.

班の進捗としては,月の終わりにコンパイラ係がレイトレのプログラムをコンパイルでき,シミュレータ上で画像生成をすることができました(この際にシミュのバグをコンパイラ係に指摘してもらいました…申し訳ない).


執筆現在1月なので,12月の振り返りも書けるのですが,バランスを考えて全部終わったときに以降は書きたいと思います.
  1. 論理シフト,算術シフトの区別がない.ビット幅以上のシフトが未定義. ↩︎