2022年度 CPU実験 シミュレータ係目線
はじめに
こんにちは。るしあです。ここでは東京大学理学部情報科学科3年Aセメスターに行われるCPU実験を、シミュレータ係目線でご紹介したいと思います。なので主にシミュ係の仕事について話します。
CPU実験とは
まずCPU実験とはなんなのかというと、3~4人の班に分かれて、CPUの回路を実装し、配布されたプログラムをそのCPU上で実行させ、最終的に実行結果である画像をきれいに出してあげる、という実験です。画像というのはよく見るあの派手な車のやつですね。あと配布されるプログラムというのは”レイトレーシング”をするプログラムです。あんまりイメージつかないかもしれませんが大丈夫です。自分は実験が始まって数週間経ってからやっと自分たちが何をしているのかを理解しました()。
班内では役割分担され、コア係、FPU・メモリ係、コンパイラ係、シミュレータ係の4つの役職があります(2022年度の場合)。
この中で自分はシミュレータ係を担当しました。
シミュレータ係のおしごと
概観
シミュレータ係は、CPUの動きを再現するシミュレータを作る、というのが仕事です。3Sの「計算機構成論」で学ぶ通り、CPUは命令列を持ってきて、デコードして、計算して、レジスタやメモリに書き込んで...みたいな処理をすると思うのですが、こういうのをC言語など(自分はC++を使いました)で再現するということです。
他にも雑多な機能を加えるのですが、主に行ったものとしては以下の4つがあります。
年度によってやることがいろいろ違うかもしれませんが、単位要件にちゃんと書いてあるのでそれをチェックすれば大丈夫です。
アセンブラ
配布されたプログラムを、コンパイラ係が作ったコンパイラでアセンブリ言語に変換したあと、アセンブラでさらにそれを機械語にしてコアに渡さないといけません。アセンブラ係という役職はないのですが、慣例としてシミュレータ係が務める場合が多いです。実際、アセンブリを読み込んでいろいろ処理をするところが、シミュレータ作りと通じるものもあるので妥当な気もします。
キャッシュ
メモリアクセスするときのキャッシュの動きを再現して、ヒット率やミス率などを集計したります。作り方のおすすめとしては、まずキャッシュなしのシミュレータがある程度(完全じゃなくていい)動くことを確認してから、キャッシュを組み込んで実行させましょう。シミュレータ本体とキャッシュを同時にデバッグしちゃうと訳がわからなくなりますので(;'∀')
自分の場合は、シミュレータにオプションを設定してあげて、「キャッシュ使うモード」と「キャッシュ使わないモード」を作りました。
FPUのエミュレート
自分の代の単位要件に、「コアの出力結果とシミュレータの出力結果を一致させよ」(意訳)というのがあり、FPU・メモリ係が作ったFPUをコアが使っていくことを考えれば、計算結果を同じにするためには、シミュレータはFPUも再現しないといけないのです。
これは、FPU・メモリ係がハードウェア記述言語で書いたFPUのコードをC言語で同じように書けばいいというイメージです。
実行時間予測
実行時間予測というのは、コアがプログラムを処理するのにかかる時間を予測してあげることです。自分の場合は大まかに言うと、「実行時間 = 総クロック数 ÷ クロック周波数」で計算しました。この実行時間予測に許される誤差が3%で、前年度の5%に比べて小さくなっていてビビりました...
さいごに
自分は3Aが始まるまでシミュレータ係の仕事についてあまりイメージが付いていませんでしたが、やっていくうちにだんだん分かってくることも多かったです。
こちらのシミュ係の先輩のブログも参考になったのでぜひ。
では~。
参考書籍など:
「動かしてわかる CPUの作り方10講(井澤裕司/技術評論社)」
「ディジタル回路設計とコンピュータアーキテクチャ[RISC-V版](S.L.ハリス、D.ハリス)」