CPU実験感想(シミュレータ・前編)
書き終わる前に4Sに突入してしまい、夏休みにお出しするハメになったCPU実験感想。 ほとんどの部分は3A後の春休みに書いてます。
CPU 実験が何なのかはググってください。 前編ではやったことを時系列順につらつら書いていこうと思います。後編のリンクは一番下にあります。
前提
色々あって2017年から休学。長いこと病んでおり、2024年Aセメから本格復帰することに。しかし一時寝たきりになっていたこともあり体力はミジンコ並みに低下。知り合いは同学年にほぼおらず、7年前の3Sの知識は完全に飛んでしまっている。やばいね。
実験開始前
体力・健康面から講義を脱落する可能性を心配して、担当教員の方に事前に連絡を取る。すると「シミュレータ係がおすすめです。シミュだけは最悪なくても班員は成果物を完成させられるので」という返信(要約)が来た。
ほんまか? と思いつつそのままシミュ係で希望を提出。同じ班に割り振られた方々との話し合いでシミュ係に。
初回
割り振られた班で話し合い。
命令セット
何もわからないので 1st は RISC-V に完全準拠と決定。2週目の講義で各班がそれぞれのアーキテクチャを発表していたが、色んなアーキをちゃんと比較して追加命令を決めている班もあり、偉いなあという気持ちに。
線表
先生からの指示があったので作成。 しかし、
- そもそも完動とは何なのかがぼんやりとしかわかっていない
- どんな経過(途中のタスク)を経て完動まで辿り着くかもはっきりしない
- それぞれのタスクがどれくらい大変か、どの程度時間がかかるか全く分からない
ので、特に指針にはならなかった。 この時点では12月中旬に完動? と設定してたのかな。実際は年明け(1/6ごろ)になった。
その他、班のこと
Notion を使うことにした。 Slack を立て、適当に emoji を入れた。
シミュレータ関係
「シミュレータは Rust だと嬉しい」という班員の希望があり、先輩にも質問のうえで Rust で書くことにした。 自分は Rust を全く書いたことがなかったのでかなり不安だったし、序盤の進捗は遅れ気味になってしっかり目に病んだ。が、後から振り返ると確かに良い点が多かったと思う(→後編)。
スケジュールを「シミュレータとアセンブラを1か月後に提供」と定めて発表。
アセンブラの担当
シミュレータ係が担当することが多いとのことだったので、引き受けた。後述するが、結局つよつよ FPU 係に代わってもらうことになる。
個人としての指針
「班員の人がやる気あるなら合わせる、なくてもやっぱり合わせる」と決めていたので、「どれくらいモチベがありますか?」と最初に訊ねた。すると「強くある」的な回答が1人からあったので、「じゃあ自分もがんばるか」という感じに決定。 一方で体力ゴミすぎ問題・今年落とすと在学期限上退学問題もあり、「とりあえず単位要件は早めに満たしたいな~」とも思っていた。(シミュの単位要件をよくわかっていなかった人)
~11月上旬 フィボナッチシミュ作成/プレッシャーで盛大に病む/アセンブラ代わってもらう編
ところで何をすればいいか全くわからない。もちろん「シミュレータを書けばいい」「シミュレータ係の仕事は班員の要望に応えること」という解像度ではわかっていたが、何をどこまで作ればいいのか不明で不安になる。アセンブラとシミュレータのどっちを優先すべきなのかもやはりよくわからない。結局並行して進める。
とりあえず 22er の先輩のシミュレータ&アセンブラを見て、それを写経する。ところが Rust がわからないのであまり中身が理解できない。仕方ないので公式チュートリアルを見ながら Rust をまずは理解しようとする。
2週目の発表で、周りより進んでいない、と比較して落ち込む。他のシミュ係は実装を進めていそうなのに、自分は Rust を学んでいてその段階に進めていないので、大変焦る。自分が新しい言語に触れる際に文法の体系全体をしっかり掴もうとするタイプだとか、多くの班はアセンブラを後回しにしていたが自分は同時に作っていた、なども時間がかかっていた一因だったかも。
そしてこの時期は「とにかくシミュレータ係は早く動くものを作らないといけないよ。そうしないと他の係が何もできないからね」というアドバイスを担当教員その他から繰り返し聞くことになる。それがまたプレッシャーでひたすら焦りが強まる。 写経は進めるが、「こんな完全な丸写しで大丈夫なんだろうか、剽窃にあたらないか」とまたかなり心配になってしまう。さらに「落としたら卒業不可、退学」という点にも精神的重圧を感じる。
……こんな感じで2~3週目にしてしっかり病んでいたが、既にCPU実験を終えていたサークルの人が相談相手になってくれていたのが大きかった。「全然進んでいなくて班員に大変申し訳ないがどうしたらいいだろうか」と訊ねると、「自分だったら早く言ってもらいたい、巻き取れるかもしれないので」とのことだったので、その通りにしました。すると、つよつよFPU・メモリ係(この時点でメモリの単位要件をクリアしているっぽい←?)がアセンブラを担当してくれることになりました。後から振り返ってもここでちゃんと相談できて、かつ代わってもらえたことが大きかった。
結局fibが動くシミュレータが完成したのは5週目(11月頭)だった。これは一番遅かったように思う。
~12月上旬 何すればいいかもどれくらい進んでるかもいまいちわからない編
急にやることがなくなったというか、いま何をすべきなのかよくわからなくなる。ただ精神的ストレスだった進捗発表会が駒場祭等で2週ほど空くことになり、助かったという気持ちに。
- シミュレート中に入力アセンブリの行番号情報を表示してほしいという要望に応える
- FPU シミュレータのうち簡単なものを書く
- 入出力等の仕様を話し合って決まったことを実装
~年末 待ちフェーズに入ったことはわかったが何もしなくていいのか不安になる編
- 自分のコード読みにくいなあと思ったのでリファクタを試みる
- fib 用の命令しか実装されていなかったので全命令を実装
要望も出てこなくなる。コンパイラ係は Rust で全てを実装しなおしており、レイトレのアセンブリが吐かれるまで時間がかかりそうとのこと。とりあえず残りの命令を実装したり、入力の .sld という形式を読み込めるようにする。何かやった方がいいのか? いや休んでいいのか……? と思いながら過ごす。 この時点でけっこう疲れており、年末年始は1週間くらい PC に触らなかったものの、完全に疲労解消とはならなかった。何もしなくていいのか? と不安がっていたせいもあると思う。しっかり休みたいなら完全に忘れるくらいの方がいいのだろう。
~年明け 急に完動する編
3が日くらいにコンパイラ係からレイトレアセンブリが吐かれるようになったと連絡が来る。デバッグを始めるが思った以上に何に着目すればいいかわからないというのと、シミュレータが使いづらくて大変。
シミュのバグがいくつか見つかって申し訳なくなる(コンパイラ係が見つけてくれた、ありがとう)。数日後、シミュ上でいちおう画像が出る。その翌日?くらいにコア上で画像が出る(早くない? と思ったことを覚えている)。
~1月末 高速化&試験で動きが止まる編
とりあえずシミュが遅かったため profiling してある程度高速化する。完動したことでとりあえずほっとしたため、コンパイラ実験の課題に一旦集中することに。他の係の最適化の手助けのための機能も実装する。
この辺から疲れすぎていてあまり覚えていない。立川シネマシティで響け!ユーフォニアムの週替わり分割上映を観ているときだけ唯一休めたように感じる。
1月下旬になると試験や期末課題で全員の動きが止まる。2nd は試験後にやることに決まる。
2月1日~ 2nd & 追い込み編
2nd ISA をコアが中心となって決めてくれた。ところでもう 1st シミュが動いてるから単位確定だと思っていたのだが、シミュは提出時のものをシミュレートできていないと単位が出ないらしい。とりあえず2nd で追加された色んな命令に対応させなければならない。シミュがボトルネックっぽいフェーズ感があったので急いで実装する。
その後は最適化支援というかこれが欲しいと言われたものを作る。本当はパイプラインコアに対応しなければならなかったが、自分が諸々を理解できていなさすぎてほとんどコアが引き受けてくれた(ごめんそしてありがとう)。
疲れすぎていてあまり記憶がないが全員がんばっていたことは覚えている。
2月14日 発表会
僅差で1位だった。すごいね
できあがったシミュレータ
デバッガとして
デバッガとしては非常に貧弱なものになった。レジスタの遷移を先頭から順に出力するだけで、ステップ実行・ブレークポイントは実装できず。終盤に(start, end)を引数として渡すとその間の遷移のみ出力という機能を実装する。自分もデバッグ中に「ステップ実行欲しいなあ」と思ったりしていた(おいおい)。 特にコンパイラは大変だったと思う。ごめんなさい。コアは cocotb との出力フォーマットを合わせることで、diffを取るだけで食い違い箇所を特定できるようにしていたようだ。
速度
命令レベルシミュレートでは 3200万命令 / s くらい。 cycle-accurate なシミュレートでは 1000万命令 / s くらいになった。
感想等
後編に書きました↓