CPU実験2015進捗報告会のログです。
Last active
February 23, 2016 04:50
-
-
Save nekketsuuu/7fc7aeed156ce0f27628 to your computer and use it in GitHub Desktop.
- MIPSのサブセット + シリアル関連 + assertion命令
- ローダーをきちんと作る(ヘッダー領域として確保)
- Block RAMと同じ領域をSRAMの頭にBy-passed segmentとして置いて、コード領域アドレスをアクセスするとBRAMを読みにいくようにした。
- 10月中に1st完動予定
質疑
- プログラムローダーを実装する人は審判サーバーとの相性が悪い。 ローダーを使わなくてハードコードするようなコードも一応用意しておくのをオススメする。 デバッグのときはそのまま使って、審判サーバーのときはハードコードする予定
- assertion命令とは?
- 通常使うassertと同じで、成り立ってなかったら落としてI/Oする命令を予定
- 1 clock何命令くらいにする予定?
- 将来的にはパイプラインを考えていて、その際には殆ど1 clock 1命令になる予定、シリアル周りだけ最大3 clockくらい?
- 今の所最大6 clockくらい
- MIPSのサブセット + send + halt
- Pipelined (5 + 1段)
- 再帰fibは動いた
- 1stの目標: なるべく速く動かす
- 2ndやりたいこと: DRAM動かす
質疑
- DRAMが「レイテンシ5とはいえ使える」とは?
- DRAM側のレイテンシが5とはいえCPUのクロック2.5クロック位なのでSRAMと同じくらいという意味
- 夏学期はどのくらいまでできた?
- 短いブロックなら書き込めたが、全体に書き込むと所々化ける
- オートリフレッシュやオートプリチャージは無かったっけ?
- 残念なことにそれだとアレ
- 余興等で大きなメモリを使いたいということであれば言ってくれれば
- forwardingはもうしてるんですね
- はい。ただsendで1 clockバブル入れています
- シリアル通信の受けの命令が無い? レギュレーション的に必要なので入れておいてください。
- FPUの値を元に分岐する命令が無いような
- FPUの値は基本的にGPRに入れる予定だったので
- 浮動小数点の比較命令は入れていないことに気づいたので入れます
- fsqrt入れないの? 結構使うので。finvと同じような実装になるのでfinvができてから考えてみてください。
- 11/1あたりに完動したいと思っている
- アセンブラができた。マルチサイクルなコアはできた。再帰fib手書きが動いた。
- オリジナルアーキテクチャ
- 32bit 64個レジスタ。0レジスタはある。
- 命令調は32bit
- 命令メモリとデータメモリは同じアドレス上に存在。 実装上は専用の命令メモリを用意する予定。
- ノイマン型かハーバード型かはまだ決まっていない
- movhi 上位16bitをmov
- movhiz 上位16bitをmovして下位を0
- FPUはfadd, fsub, fmul, finv, fcmp, fabs
- シフトは片方だけだとやたら煩雑になったので両方用意しておくことにした。
質疑
- 整数レジスタと浮動小数点レジスタは混同されている? → はい
- コンパイラとして番号で使い分けする?
- 今の所考えていないが、整数で使った後にすぐ浮動小数点として使うこともありうる
- まだどのような問題が起きうるのか分からない
- コンパイラのレジスタ割り付けをうまいこと調整する予定
- Ikazuchi
- MIPS subset + rsb
- rsb : $tの下位8bitをシリアル出力
- fmulができた(C実装、VHDL実装どちらも)
- アセンブラができた
- 10月末までには動かす
質疑
- レジスタ32個中2個OSカーネル用のがあるがOS実装の予定は?
- ないです
- コア命令はこれで足りますか
- 受信命令やfcmpが足りないくらい
- 線表に対しては順調ですか?
- あまり順調ではない。
- faddの再実装とは?
- リファクタリング
- 重要だと思います。僕もfaddが1bitだけ間違っていて発表直前まで困った
- 10班
- Powerless PC
- Power PCサブセット予定
- 条件分岐命令、比較命令などはよりシンプルにする
- 機能が多いのでどんどん削る
- 静的分岐予測やオートインクリメントとかは削る
- branchにはリンクレジスタを書き換えるやつ、書き換えないやつ、条件分岐のやつがある
- まだちょっと未定の所もある
- 11月第4週くらいに完動予定
質疑
- どこらへんがPower PCっぽくなる予定?
- コンディションレジスタ
- 10月中にレイトレを動かす
- 汎用レジスタ256個
- 一時変数を退避しないでいいようにするため
- fadd, fmul, fdiv, fsin, fatan, fsqrt
- 実行バイナリのフォーマットやメモリマップは調整中
質疑
- cmpするとどこに入る?
- 0か1かがレジスタに入ります
- 256個くらいあればspillとか起きない気がする
- Block RAMとかで実装する予定ですか?
- とりあえず普通にレジスタとして実装する予定
- レイテンシどうだったっけ、分散RAMに比べてレイテンシが1大きくなるような
- Block RAMは間に1つフリップフロップが挟まっているので
- もしかしたら途中に1つラッチを入れないといけないかも
- エターナルフォースブリザード
- 10月中にfibを動かす
- 11月中に完動を目指す
- MIPS sub
質疑
- FPUとI/Oがまだないかな
- setlt?
- set less thanです。
- shiftありますか。 movを使って下位16bitには入れられるけど上位16bitに簡単に入れられる命令があった方がよいと思います
- mulとかfhalfとか無いんですね
- 班の中で適宜コミュニケーションを取ると良い
- 班名: 白菜(ハクサイ)
- ハーバードアーキテクチャ
- パイプライン化、遅延分岐
- .textをBRAM、.dataをSRAMに載せる
- GPRは32個、FRをGPRと別に作るかは未定
- ALUが少し実装できた
- fibが動いた
- finv, f2i, fsqrtがVHDL実装できた
- fmul, finvのリファクタリング中
- シミュレータは1命令動くものができた。もうすぐfibが動きそう
質疑
- faddはHW実験で作ったやつを使う予定?
- はい。
- パイプライン化されていますか?
- fadd以外も含めてまだです。今後取り組みます。
- 浮動小数点加算器は丸めをどうしていますか
- round-even
- fmul, finv, fsqrtはどのくらいの誤差での設計をしていますか。完全に誤差がない実装ですか、それともたとえばテーブル引きなどで誤差がありますか。
- 誤差はないはず。めちゃくちゃ遅いが正確に動くはず。x86と同じはず。
- 段数はどのくらいになりました?
- まだテストしていないのでよく分かっていないです。
- コアのジャンプが怪しいとは?
- reg_write_enableがときどき1になっちゃう。今の所問題は起きていないがそのうち問題になるかもしれないので直したい。
- ISAがきちんとは決まっていなかった。
- strictにMIPS32サブセットにすることに
- ただしクローンを作るわけではない。
- パイプラインも遅延分岐もとりあえず延期。
- ISAがきちんと決まったのでアセンブラができた
- コンパイラのたたき台ができた。SPARC版とPowerPC版を参考にした。
- fibのための命令群を実装
- FPUがfaddを片付けつつある
質疑
- faddは多分round-evenだと齟齬が出てくるのではないか? もしかしたらtruncateだと駄目かも。最終的な画像とお手本画像の下位1bitがある閾値以上離れていると駄目になるはず。だから、各計算に対してx86に対して最大で何ulpくらい誤差がでるのか計算しておいた方がよい
- コアのデコーダは書きましたか?
- まだとりかかっていないです
- 以外とMIPSってオペコードが色んな所に分散しているので気をつけてください。
- hitodeさん「僕のコア、00001がaddで00002がfsubだったので非常に面倒くさかった」
- faddを接続した
- 簡単なキャッシュがついた
- 次はout of orderをする予定
- fibが最低限動くコンパイラはできた
- 動作確認用にprint_intだけ実装したライブラリはdけいた
- faddをパイプライン化した。
- fmul大体できた
- FPUを除いたシミュレータができた。これから動作確認をする
質疑
- 今はパイプライン化していますか?
- 今はしていないです。faddとかは何クロックかかかってしまうのでいきなりout of orderしようと思いました。
- トマスローですか?
- トマスローです
- スーパースカラをやる予定はありますか?
- 将来的にはハードウェア資源が許せば複数命令同時発行とかもやる予定です
- コンパイラの「fibが最低限動く」というのは実際にコアに食わせたりはしましたか?
- 「最低限」→fibに必要な機械語
- 「fib」→それっぽいアセンブリがでた
- このfibはループ版ですか?
- 両方作って両方食わせたらそれなりのアセンブリがでました
- レイトレのコンパイルはできそうですか?
- まだわからないです
- シミュレータも割合できていてコンパイラ係さんのデバッグが楽そうですね
- コア: PC, 命令メモリ(BRAM), GPRの実装ができた
- コンパイラ: Asm.progの中間出力ができた
- シミュレータ: fibが動いた。デバッグ機能として実行中のレジスタの値確認やステップ実行ができるようになった
- FPU: faddを書き始めた。C実装は終わった
- 線表よりちょっと遅れているくらい。今週中にはコアでfibを動かしたい。11月末までにはレイトレを動かしたい。
質疑
- シミュレータはあと浮動小数点数周りを組み込めば基本的には動くものができそうですね
- シミュレータは命令を1つずつ実行するものですか
- gdbみたいなやつを作りました
- あとブレークポイントを作りたい
- いいですね。あとはコア係さんと協力して、コア係さんがデバッグしやすいものを作ってください。特定の命令が来たらストップする機能とかあると良いです。たとえばシリアル出力命令の直前で止まるとか。
- FPU係が2人いますが分担はどうしていますか?
- どちらもfaddがかけていないので独立にfaddを書いて、その後協力してfmul等を書く予定
- コンパイラ係さんの「Asm.progの中身」とは
- min-caml内で使われている中間表現です
- シミュレータの進行速度がコアにコンパイラに比べてこれくらいの速度なのが健康な班かな、という感想です。とにかくシミュレータが完成しないことにはデバッグが難しい係がある。3分クッキング的に「あ、ここにコアがありますよ!」な班は別だけど
- デコーダ、ALUできた
- min-caml動かすのができた
- fadd C実装できた
- アセンブラができた
- 質問
- finv, fsqrtの実装について
- ROMを使うと効率が良いが、もっとメモリ使用量を減らすべきか(減らせるか)、もっと速い方法はあるか?
- 今週はシミュレータ上でレイトレが動いて、再帰fibが実機で動いて、FPUが速くなるはず
質疑
- 質問について:
- メモリ使用量を減らすに越したことはない。それで正確性が担保できるなら大丈夫。でも別に減らさなくても大丈夫だと思う。逆に多かったらどうなるか?→余ったBROMはコアのキャッシュに消費すると良いです。なのでBROMを取りすぎるとコアが困ります。
- 動作周波数的には、これより速い方法があるかは知らないが、ROMを使った方法ならそこでボトルネックになることはなくなるだろう。
- コンパイラ的には、ほとんどレイトレがコンパイルできるような状態ですか?
- いえ、まったく。難しいです。
- 難しいとは、どういう壁にぶつかっていますか。
- まだあんまりコンパイラに触っていないだけです。
- コアはどんな感じですか
- 今の所out of orderで動かす予定なので、そのための部品を用意して、あとデコーダとかを用意した段階。まだ実機で何か動かせる状態ではない。
- トマスローですか
- トマスローです
- コア
- パイプライン再実装中
- FPU以外は大体実装完了
- 浮動小数点数レジスタとfneg, fabs, fld, fstを実装、テスト中
- メモリアクセスにバグ?
- コンパイラ
- コンパイラ実験の課題をこなした
- バッグエンドを書いているが時々ISAが足りていないことに気づくのでコアと調整している
- シミュレータ
- 1命令実装できた
- アセンブリを1行ずつ処理するものをとりあえず作って、もし時間があればcycleごとに処理するものを作る予定
- FPU
- fadd VHDL実装のテスト中。でき次第高速化。
- fmulはVHDL実装中。finvはまだ。
- 風邪に気をつけよう
質疑
- clock accurateなシミュレータがあるとコアのデバッグに便利だが、作るのはコアを1つ作るくらい面倒。しかしout of order実装しはじめるとこういうのがないと上手く進まないかも。
- コアのパイプライン再実装とは?
- クロックを上げていったときに、store/loadがうまく動かなかった。そこでクロックの位相をずらすなどしてホールド時間セットアップ時間の条件を満たすようにしている。
- SRAMのホールド・セットアップは.ucfを設定すれば位相をずらさなくてもうまくいくはず
- そんなことしなくても、入出力にクロック同期のラッチをかませるだけで大体はうまくいくはず
- ハードウェア実験のときにうまくいっていたのは多分たまたま
- 初恋
- コンパイラがアセンブリを吐いた
- アセンブラができた
- コアの中で完結する命令を実装した
- loop fibは動いた
- fmulの大枠を作った
- 仕様変更
- syscall命令を追加
- 当面はシミュレータ上だけで使う
- 割り込みベクタを指定して色々する
- printfデバッグに便利そう
- git勉強会をした
- gitとslackを連携した
- pushすると通知が飛ぶ
- 助走をつけて進捗で殴りあう
質疑
- コアの所にある「算術コア命令」ってALUのことですか
- MIPSの超時間のかかるmulとかFPUとかのことを指しています。addとかは「普通のコア命令」に入れています。まだI/Oとローダーとメモリアクセス周りを作っていないので、そこをこれから。
- ローダーってどんな感じのプロトコルですか
- 4wordヘッダを送って、はじめの1wordにはmagic numberが入っていて、そこから1wordずつデータ部分のサイズ、プログラム部分のサイズ、テキスト部分のサイズを送る。
- 整数乗算もきちんと実装するんですね
- 実装する予定です。MIPSに入っていたから実装していただけで、どうせFPUは3clockくらいかかってしまうのでmulもそこに足並みを揃える形ですね。
- なるべくshift + addにしたほうが効率がいいので、そのようにはする予定です。
-
LANケーブルを作ります
-
切る!はがす!コネクタをさす!圧着する!テストする!以上ッ!
-
ストレートケーブル
-
「毎年の恒例行事だよ〜」と言われたが大嘘だった
- アドレス指定は絶対アドレスにする
- コンパイラ: 再帰fibがはけた
- シミュレータ: コンパイラのはいたバイトコードを読み込んで実行できるようになった
- 逆アセンブラができた
- 現在実行中の命令をニーモニックに変換して表示できるようになった
- ブレークポイントができた
- 体調に気をつけよう
質疑
- ALUやメモリ周りはどのくらい完成していますか?
- 全然です
- FPUはどこができている?
- 多分まだfaddを書いている途中
- シミュレータにはfloating周りは入っている?
- まだ入っていないです。C実装が完成次第やる予定
- Travis CIの連携(Commitと同時にtestが走る)
- コンパイラ: 条件分岐、スタックまわりのバグ修正。fib, ack, gcdが正しくコンパイルできた。
- シミュレータ上でループfibが動いた
- fmulを書いた
- finvを書き始めた
- PythonとCでシミュレータが書けた。fib, ack, gcdが動いた。Pythonだと遅かったのでCで書きなおした。
質疑
- Travis CIってどんなテストを走らせるんですか?
- MinCamlがコンパイルされた後、Pythonのnoseというテストツールが走るようになっている。
- いくつかのテストを走らせるようにしていて、結果をassertしている
- Pythonシミュレータ、pypyでやっても遅かった?
- 試してないです。
- Cのfib 30が2秒くらい、Pythonのfib 20が同じくらいだった。
- コアはFPU以外動いている?
- 実機とシミュレータで動作が違うことに悩んでいて、IO部分のIの部分ができていないようなので、そこを今直しています。
- バッファに1回ためるようにしていますか?
- FIFOにためています。
- コア
- マルチサイクルコア。fmulをつないだ。
- Out of Orderコア。トマスローを実装中。デコーダ、データパス、アービタはできた。cmp, fabs, fcmp以外のALU系命令、メモリアクセス命令、出力命令、haltはできた。
- クロックを上げられるか実験していて、100MHzにすると何もかもがおかしくなった。77.7MHzでもI/Oがおかしくなった。
- コンパイラ
- コンパイルしたfibが実機やシミュレータで動いた。
- クロージャ呼び出しを正しくコンパイルできないバグを修正した。
- 即値最適化を実装した
- FPU
- fmulを実装した。
- finvも一応動いた。
- fabs, fsubとか書いた
- finvを線形近似を使って書き直す予定
- シミュレータ
- ほぼ完成。全命令が無事に動いた。再帰fibが動いた。
- finvだけx86と仕様が違うのでそこだけ書き直す予定
質疑
- 将来的に分岐予測をつける予定はありますか?
- はい。
- 今の所リオーダーバッファとかはつけていなくて、必要になればつける予定?
- はい。分岐予測ないならリオーダーバッファなくてもいけそうだったので。
- 100MHzだとおかしくなるとありますが、ucfは書き換えましたか
- 書き換えていないです。
- メモリが絡まなくてもおかしくなっていて、ucfがどうとかいう問題ではないように思いました。
- ひょっとしたら基盤が壊れているかも? 普通FPGAの中が壊れていてクロックを上げると駄目になるということは無いように思うが、一応。
- fsqrtは予定ない?
- 今の所は。
- 命令セットを更新
- 線表を少し変えた
- コア: 増えた命令を実装中。
- コンパイラ: アセンブリを吐く所ができた。これからライブラリを揃えていく予定。
- シミュレータ: read8以外の命令おwひとまず全て実装。再帰fibが動くことを確認。step実行、breakpointっぽいものを実装
- FPU: faddがとりあえず完成。fmulがシミュレータで動いた。デバッグ中。finvはこれからシミュレータで試す予定。
質疑
- FPUのバグは大きいバグですか?
- faddのバグは昨日取れて、fmulのバグは時々全然違う値が出てくるバグで、おそらくケタ上がりの所でバグっている。Cの方は動いている。
- シミュレータの機能は今どのくらいありますか?
- ステップ実行、ブレークポイントぐらいです
- 命令の実行回数カウントとかはまだつけていない?
- まだです
- アセンブラを完成させた
- FPU以外のシミュレータが完成
- fadd実装中
- コアはI/O, ALUまわりをとりあえず終えた。メモリ周りをこれからやる予定
- コアが遅れている
質疑
- 最終的に実装するFPU命令は?
- fadd, fmul, finvです
- シミュレータはFPUどうしていますか
- まだ実装していないです
- じゃあ今動いているのはfibくらい
- はい
- シミュレータ、実機両方で再帰fibが動いた
- FPUはデバッグ中
- コンパイラはとりあえずアセンブリっぽいものをはけるようになった
- コア: 8bit I/Oを今後実装する予定
質疑
- faddにクロック入っていますか?
- 単なる組み合わせ回路です
- コアの方で数クロック待ってから取り出す形
- コンパイラのバックエンドができた
- ライブラリもほぼ書けた
- 1週間でコンパイラは作れるが班員からうらまれる
- fmul, fdivが多分できた
- コアがinternal errorと格闘中→解決
質疑
- 優秀ですね
- 何かシミュレータ上で動かしましたか?
- ハンドアセンブルのfibはとりあえず動いた
- fibとレイトレースの間に何かテストプログラムは考えていますか
- 何か詰まれば適宜考える予定です
- コンパイラ
- pythonアセンブラ/シミュレータへのFPU命令の対応
- Lambda Liftingのデバッグ中
- CSEのバグをとった
- コア
- I/Oのバグがとれた
- 手製ループfibが動いた
- ヘッダの仕様を修正した
- シミュレータ
- fmulのシミュレータができた
- FPU
- finvの1st用データテーブルができた。C実装も9割方できた
- 今週土曜日完動?
質疑
- I/Oのバグってなんだったんですか
- ucfにRXがなかった
- SRAMやシリアルのインターフェースはもう自信アリということですか
- SRAMはまだ結合テストしていない
- メモリコントローラとは
- data領域とかが同じメモリ領域にあるので、上手く割り振る役割をします
- シミュレータ係がfmulのシミュレーションコードを書いているのですか
- はい、FPU係の進捗が悪かったので
- 先週シミュレータをCで書きなおしたと言っていましたがpythonも残しているのですか?
- 両方とも残しています
- Cは突貫で作り上げたので……。pythonの方はある程度の信頼性があるのですがCの方はまだ甘いかなと。
- あとpythonの方を残しておけばLLなのでパーズはやりやすいかな、と。
- コア
- ALU, SRAMができた
- datapassと制御ユニットをしている
- FPUはほとんど終わって、デバッグをしている
- コンパイラはすべての命令をアセンブラで吐くようになった。これからライブラリ。
- シミュレータはブレークポイントとカウンターレジスター付けた。ISAに無いがコンパイラにはあるので、後でなんとかする予定。
質疑
- カウンターレジスタとは?
- ループの回数を数えるレジスタ
- FPUは今まで二人でfaddを作っていたと思うのですが、この後どのように役割分担する予定ですか
- おそらく二人一緒に同じものを作ることになると思います。
- faddがalmost doneになっているのはまだちょっとバグが残っているのですか?
- はい。たまにシミュレータの実装と値が合わないことがあります。
- コアは連続send以外は動いて、ほとんどできた。
- コンパイラはmul4, div2をつけた。ライブラリをしている
- シミュレータは命令数カウントやbreakpoint ignoreを実装した
- FPUはパイプライン化したfaddを作ったが今は使っていない(普通のものが1クロックで終わるため)
- fmulの桁ずれが直ったっぽい。
- finvはテーブルの精度が悪く、まだずれがある。
質疑
- sendというのは
- send8 (8bit)
- 意外とループバックをコアに入れると動かないことがあるので試してみてください
- finvのずれとは具体的にどんなずれですか。下数bitがピロピロしたりするのがつらい。
- 線表を載せてもらえると嬉しいです
- 班名: 進捗どうですか?
- out of orderコア
- 分岐命令をいれた
- fadd, fmul, fsubに対応した
- コンパイラのfibが動いた
- ソフトウェア実装finvも動いた
- out of orderコア2を構想中
- リオーダーバッファROBが分岐予測のために必要なのでつけたコアを構想中
- xstがクソ
- 長さの違うsignalを代入してもエラーにならない
- レジスタ番号に依存してfaddの動作がおかしくなる(ボードの不具合?)
- FPUまわりをいじるとまったく関係ないはずのfibの動作が変わる(ボードの不具合?)
- 他の班のFPGAボードで動くのに自分の班のFPGAボードでは動かないことが。壊れている?
- FPUはfinvをC実装したが誤差が7εもあるのでなんとかする
- コンパイラはライブラリをざっくり作って、アセンブラを改良した。レイトレのソースコード一式をコンパイラに投げたら何らかの結果が出力された(テストはしていない)
質疑
- ROB何段にするか決めていますか?
- まだ
- わたしは16個で動きました(hitodeさん)
- FPGA壊れているというのは、SRAMのテストはしましたか
- ソフトウェア実装finvではSRAMを作っていない
- タイミングエラーもでていない
- 何たらslackがぎりぎりでした ← あれはぎりぎりでも通れば次にいくというやり方だったはずなのでOK
- ucfの11.52nsを11nsにしても、合成はできたのですが駄目でした。
- 77.77MHzで発振するのは確認しましたか。もしかしたら発振に失敗しているかも。
- 確認していません
- ただfinvソフトウェア実装は66.6MHzで動いています。
- もし他の班のFPGAボード全てで動いたということであれば連絡ください
- finvの誤差というのは何との誤差ですか
- x86です
- 誤差7はちょっと多いですね
- 最大7ですか
- 最大です
- じゃあ実装が間違っているというわけではなさそう。テーブルの作り方ですね。うまくやれば1とか2に収まるらしいですよ。大体3くらいを目安に。
- シミュレータ係のfinvはx86のやつを使ってコンパイラ係のテストをするという方針ですか?
- はい
- C実装ができ次第変える予定です
- シミュレータは先週に引き続きアセンブラやシミュレータを仕様変更に対応するために改造。コンパイラのデバッグの手伝いをしている
- コンパイラはライブラリ完成。デバッグをしている。
- コアはinternal errorを倒し、LUT不足を倒す。
- XSTはクソ
- procedureの引数の型にpackage_name.type_nameの形式があるとinternal error
- はじめaliasで対応したらcheck syntaxは通ったがsynthesizeでエラー
- しかたないので手動インライン展開した
- LUTが足りない
- 論理合成してみたらLUT使用率128%
- メモリあたりが怪しい?と思いレジスタ数を減らした(256 -> 32)ところかなり改善
- レジスタはBlockRAMにはのらなさそう(ポート数の問題)なので仕様変更
- 残っている作業
- FPU: パイプライン化とfatan, fcos, fsin
- シミュレータ: 機能追加、コンパイラのデバッグ
- コンパイラ: デバッグ
- コア: シリアル通信、SRAM、FPU
質疑
- fcosとかってハードで実装するのですか?
- 今の所その予定です
- どんな感じの実装ですか?
- 今FPU係がいないのでわかりません
- 三角関数系統をやると、命令数的には1000万減るかなあ、位です。
- 多分、シミュレータであらかじめ減る命令数を調べてから、有効そうならハードウェア実装する、というのが良いと思います
- そうしないと、コアに負担がかかるというのが1つ。多分テーブル引きにすると思うがそこが時間を食う。
- あと経験的にシミュレータ画像とコア画像を突き合わせると、細かいずれがばーっと出てくる。そのdiffを0にするためには1つずつFPUを抜いていく作業になるので、コア係は早めに便利ツールを手にしておいた方がいい。
- BlockRAMに載せることはできます。多分1 clockで2 writeあることを気にしているのだと思いますが、書き込むときコピーで2箇所に書き込めばよい。ちょっとアクセスに、チェーンが大きくなってしまうので……。レジスタ数と相談してください。
- 多分レジスタ数は256よりかは減らすと思います。
- コア
- I/O 受信命令、シフト命令の実装、テストおわり
- ALUの残りの命令(sub, ori)、FPUコントローラの実装
- FPUはfaddを作りなおしている
- コンパイラ係はfibをコンパイルしてみると目で追っていたら何かおかしいことに気づいたのでデバッグした
質疑
- コア係さん命令の実装の割合としてはどんな感じですか
- 多分全部実装しました
- コアの全体としてはどんな感じで動くものができているのですか。単独でFPGA上でfibが動いたりしますか
- fibは先週うごいています
- 大体動いているけどストールちゃんとやっていなくて、nopをアセンブラで入れないといけない位です。
- コンパイラ係さんとはその調整を?
- 一応アセンブラがうまくバブルを入れてくれるようにするつもりです
- FPUさんは66MHzで動かないという問題を直そうとしているのですか?
- それはよくわからないのでとりあえず捨ておいて、それ以外の小さいバグを直す予定です
- シミュレータ係さんの進捗割合としては何%くらいですか
- ちょっと予想しづらいです
- 実装状況としては何を終えていなくて、何が終わりましたか
- add命令くらいしか実装していないです
- でもadd命令が実装できるくらいの下地はあるんですね
- コンパイラは何が問題だったんですか
- コンパイラ係がいないので分からないです
- コア係さんは、分岐を複雑にしたやつとループバックあたりに注意してください
- ループバックは66MHzではもう動いていて、速度を上げるとちょっとバグる位です
- パイプラインですよね、フォワーディングは
- 今からいれようと思っています
- フォワーディングを組むと、色んな命令列を作ってデバッグしないといけないので頑張って下さい
- さっきおっしゃってたバブルを入れなきゃいけない場合とは
- 書き込み2連続とか、メモリまわりとかの特殊なやつです
- 分岐でバブルは?
- 分岐は遅延分岐なので特に要らないはずです
- フォワーディング入れるとパイプライン化の恩恵を多分に得られて速くなるので頑張って下さい
- コア
- BRAMの使い方を調べ、ローダをつくった
- ISAとメモリまわりを無事に片付けた
- 全体ができあがってきて、fibを動かす準備ができた
- コンパイラ
- コンパイラ自体は大体できた
- ライブラリをかきはじめた
- シミュレータ
- faddのC実装が完成した(???)
- これから命令をもっと追加していく
- FPU
- faddの実装を終えて、fmulを実装中
質疑
- シミュレータ係さんのシミュレータの実装状況は
- FPUとI/O以外は全部実装してある
- コンパイラが作った再帰fibは動いたらしい
- デバッグ用に機能を追加したい
- finvは付けないんでしたっけ?
- 実装予定です。
- fsqrtは?
- まだつけない予定です
- finvはテーブル引きですか
- その予定です
- シミュレータ完動した
- FPUのバグの修正
- 失敗例
- floor
- シミュレータ内FPUの微妙な誤差
- 問題: 命令種が少ないため……
- 命令数が多い
- 実行命令数が多い
- 解決策
- ライブラリの改善、コンパイラの最適化
- 命令の追加(定数和、定数シフトなど?)
- 爆速シミュレーション
- CPU用のアセンブリをx86用のアセンブリにJIT的に変換してシミュレーションすることで爆速シミュレーション
- 実行命令数カウントくらいはできる
- 来週の予定
- 命令実行数の削減方法を考える
- サイクルアキュレートシミュレータを作り始める
質疑
- FPUの誤差とは
- FPUまわりのシミュレーションがちゃんとできていないので今はx86の演算を使っているが、後々FPUのC実装がちゃんとできたことが確認でき次第、そっちに切り替えようと思います
- シミュレータ完動おめでとうございます
- どの点を見て定数和や定数シフトが
- 即値を扱えるのがload immだけ。ソースを見ると明らかに簡単なaddやshiftで無駄遣いしているように見えた
- まだ割合は出せていないが、パッと見て改善できそうだと感じた、と。
- はい
- シミュレータはCですか?
- はい
- 何分くらいかかりますか?
- 5分くらいです
- 実行命令数は
- 全く最適化しない状態で最初200億くらいで、インライン展開をかけてさっき20億くらいでした。
- サイクルアキュレートシミュレータはどこまで正確にコピーするかで難易度が変わるが、どこまで正確にするつもりか?
- 作っているのはFPU係。クロックごとに動作を確かめられるようなものを作りたいと思っている。
- 1step, 1stepレジスタに格納されている値が分かるというものですか
- レジスタもそうだし、コモンデータバスやROBまで出力できるようにしたい
- 確かにROBまでシミュレートしておくと、ROBの最適段数などが簡単に実験できる
- アーキテクチャによってシミュレータを大幅に書き換えないといけないと思うが、今のターゲットは?
- 今は1stのコアのVHDLファイルを参考にして作っています。
- ある程度コアができてきたら、コアより先にシミュレータがあると嬉しいので、さっさとOoOのものを作ってみると良いかも知れません。
- インライン展開の深さは
- 100と、追加で30程度の別インライン展開をしています
- フォワーディングを実装
- faddを書き直し
- シミュレータはひとまず各命令について実装
- コンパイラはライブラリ書き途中
質疑
- FPU係の「改良」とは?(@線表)
- リファクタリング
- データバスの改良とか
- コンパイラのライブラリ残りは?
- 三角関数はたぶんできている。大体は書き終わっているのかなあと思っています。
- コアで今動くのが確認できているアプリケーションは
- とりあえずfibだけです
- コアの実装のためにISAが整理された
- コンパイラのライブラリのために命令が増えた
- add, neg, bctr, bctrl, mtctr, fcm, sl, sr, mfgft, mfftg
- PowerPCのカウンタレジスタ関係があると便利そうなので付けた
- FPRとGPRのデータ受け渡し命令
- コア: ISAの変更に対応、データパス、制御ユニットができた。これからテスト・デバッグ
- コンパイラ: ライブラリを組んだ。レイトレのコンパイル成功。これからデバッグ。
- シミュレータ: ISAの変更に対応。ブレークポイント機能を改善(一覧表示、削除)
- FPU: faddがシミュレータで動いた。これから実機テスト
質疑
- カウンタレジスタはハードウェア的にはなにか特別なことがありますか?
- いいえ。ただ、GPRの外にあります。
- x86の命令みたいに勝手に回してくれるわけではない
- 違います。レジスタに持ってきて操作したりできます。
- 全体の進捗的には、次はマンデルブロ集合を出す、という所ですか
- 全然間に合ってないです。まだfibが動いていません。
- 班名が公式に「進捗どうですか」に
- 完動した
- 37.8億命令、2分弱
- ジャッジサーバーはまだ動かしていない
- OoOコア: 訳のわからないバグがとれた
- process文で未初期化の変数を使うバスが存在した
- 意図しないラッチの発生→タイミング解析を妨害するっぽい?
- finvを組み込んだ
- 2つ目のOoOコア: 書き始めた。ISA書き直したい
- コンパイラ
- ライブラリのバグを直した。
- デバッグ用にコンパイラのwrapperのオプションを増やした(finvをソフトウェア)。
- 闇の最適化へ。
- FPU
- finvができた。最大誤差3ulp。2クロック
- faddの軽量化
- 次はfsqrtを作る
- シミュレータ
- cmp, cmpiにバグがあったので取った
- finvを組み込んだ
- out命令でchar型で出力するか16進数intにするか選べるようになった
質疑
- 問題になったprocessはクロックの立ち上がりで動くものではない?
- 組み合わせ回路です
- 6班のインライン展開が気になっていて、100もしたらプログラムメモリに載らないかもしれない
- 新しいISAとは?
- コンディションレジスタが面倒くさいのでGPRに統合したい
- 配列は定数番地にアクセスしたくなるので、メモリアクセスのアドレスのオペランドとして即値をとれるようにしたい
- メモリまわりでr1+r2+immとなりオペランドをたくさん取る命令があり、レジスタのポート数を増やして邪魔なので撤去したい
- 動いてるのOoOコアなんですね
- マルチサイクルの方も動いたのですがOoOより2倍以上遅かったのでやる気をなくした
- マルチサイクルの方はフォワーディングしてないです
- OoOの方もリザベーションステーションが少ないという問題がある
- リザベーションステーションいくつですか?
- ALU, FPUの中でそれぞれ2個ずつ。結構ストールしてそう。
- リソース的に余裕は?
- キャッシュを入れなければまだ30%くらいなので余力がありそうです
- faddを複数入れたりしても面白そう
- faddがパイプライン設計で結構つっこめそうです
- シミュレータとは一致したの?
- 完全に一致しました。
- 今後の方針は、高速化か余興かどちら?
- 速くしたいです。
- fibがまだ動いていない
- コアは大体できた
- コンパイラ: ライブラリ大体出来た。ただしやりながら必要なことがでてきたので全体で相談しながら修正中
- シミュレータは多分ほぼ大丈夫。コンパイラができ次第バグが見つかると思うのでデバッグしたい。
- FPUはfadd, fmulの実装が終わった。これからデバッグ。
質疑
- スライドごとに背景の色を変えると平木先生の笑いを取ることができます
- finvはどうですか
- まだ手をつけていないです
- コアはどんな感じですか。
- 各命令自体のデバッグが大体済んでいるくらい。ハンドアセンブルしたものが動いているくらい。
- メモリアクセスやIOアクセスがあるような命令列ですか?
- はい。
- 各係はそれぞれ準備ができ始めていて、今どこで詰まっている感じですか
- コアの実装は終わっているが、コア係があまり時間が取れなくてなかなかデバッグできない
- FPUは実装はこれからガンガン進んでいる感じ
- 都合が合わなかったという感じですか
- はい
- 基盤に不具合があったということですが、アレ以来何もないですか?
- 同じような現象が他の班でも起きたので、電源の方が悪いのかも
- 症状はどんなのでしたっけ。
- CPUの発熱が異常に
- 普通に動く
- 4班でも電源によってFPGAが熱くなる事案が。
- 他の電源でもそうなりましたか。
- 電源を切って1時間くらいおいて他の電源を使うと動くようになりました。
- どのくらい暑くなりますか。触れないくらいですか。
- 触ってアチッってくらいでした。
- 在庫がないので早めに皆さん完動してもらって、完動して余興がやりたい人には新しいボードを
- 余興をやりたい人はどのくらいいますか
- liva: 新しく班を立ち上げてやりたいです。ネットワーク周り。
- コア
- IOをwordアクセスに
- 全命令を実装した(はず)
- 手書きで基本テストをいくつか走らした
- 再帰fibを動かして、メモリ周りでまだちゃんとは動いてなさそう
- コンパイラ
- リンカにそこそこ協力な再配置機能を実装(複数の.text, .dataセクションから)
- ライブラリを実装
- レイトレをコンパイル
- レイトレを動かしたい(主にクロージャー周りのメモリアクセスで落ちる)
- シミュレータ
- CシミュレータのFPU命令が組み込まれた
- logistic(ロジスティック写像を15回くらい回すやつ)が停止した。値がちょっと違うっぽい。
- 大分前にpypyを使ってみてはどうかというアドバイスをもらったので使ってみたが10秒くらいしか変わらなかった
- FPU
- finvの精度を直すためにテーブルを引き直した
- fcmp, finvのvhdl実装が終わった
- 全数調査はできていないがとりあえず一般的なケースで意図した動作をした
- 余裕ができればfdivやfsqrtの実装を検討したい
質疑
- ごりごり順調にデバッグが進んでいる印象ですね
- コアのテストはきちんと
- 各命令の実装について軽くさらうようなテストをさらっと書いて、それらが動いています。特にFPU周りはちゃんと動いています。
- コアでfibは動いた?
- 再帰fibがまだ動かせていない(手を付けていない)。他の命令は動いたので、そろそろやる。
- コア
- だいたい動くようになった
- 複数クロックかかるfpu命令まわりでバグがあったが動いた
- コンパイラ
- ライブラリができた。大体動くようになった。
- マンデルブロがシミュレータで動いた
- シミュレータ
- 細かい機能拡張とバグ修正をした
- recv8, send8がファイルでできるように
- FPU
- fmul, finv, fsqrtが一応出来た
- 実機でランダムテストした
- ガウス・ルジャンドルのアルゴリズムで円周率を出すプログラムが実機で動いた
質疑
- fib動いたんでしたっけ
- コンパイラfibは実機でも動いた
- コア: vsim上での再帰fibにむけて実装中
- コンパイラ
- ライブラリが組み込まれた。
- ヒープポインタとスタックポインタの初期値のバグを取った。
- subのバグをとった。
- cos, sin, atanをHorner法で書き換えた。
- シミュレータ
- FPU命令をx86ネイティブの命令でサポート
- 一部のライブラリ関数が正しく動作
- 初期化データの読み込み
- 機能の追加
- ステップごとにレジスタ値を表示
- ステップごとに逆アセンブルされたコードを表示
- コンパイラ係からのpull reqを処理
- FPU: faddが実機動作した。fmul作成中。
- 予定より1週間程度遅れている
質疑
- Horner法を使うと良いことがあるんですか?
- 多分誤差が減ります
- ライブラリは全部実装できているんですか?
- 実装はできているんですがテストがまだ全部はできていません。
- じゃあコンパイラはあとはバグ取りだけでレイトレがコンパイルできそう
- はい
- コアはあと何が足りないんですか
- 分岐まわりでバグがある
- 分岐命令の次の命令が余計に実行されてしまっている
- FPU2人いますよね。分担とかってしていますか
- あまり分担していないです
- 今はfmulを二人で作っているという感じ
- そんな感じです
- 最終的にできて、より良い方を採用する?
- できた方を採用するという感じです
- マンデルブロがシミュレータで動くが、実機で動かない
- FPU: f2iの修正をした(仕様に勘違いがあった)
- シミュレータはひとまず完成
- コンパイラ係はライブラリを書いた
- j命令を復活させる予定
- シミュレータにbreakpointなどの機能を追加したい
- ライブラリのデバッグをする予定
質疑
- マンデルブロはどんな感じだったのですか?
- 400x400ピクセルの'0'が出力されました
- シミュレータというのはvsim/isimではなくて、作ったシミュレータ?
- そうです
- バグの原因は検討ついていますか?
- よくわかっていないです
- 最初はfinvが遅いのがバグを生んでいるのではないかと話していたが、finv使っている所は少なく、そうじゃないっぽい?
- 完動しました(66MHz 115200 133sec 39.3億命令 IPC0.44)
- コア
- forwarding不足?によるバグがあった
- baud rate 9600 -> 115200で260sec -> 133secになった(senderで詰まるのが減った)
- ラッチは滅ぼさなければいけない
- 本当にクリティカルパスが見えなくなる
- 以前faddが1 clockで動くといったが嘘で、faddにラッチが生えていてタイミング制約がミスっていた
- コンパイラ
- バグをつぶしたら動いた
- cos/sinの誤差がとれていないっぽい?
- x = nπの周りでだけすごい大きな誤差が出る
- シミュレータ
- FPUのC実装を取り込んだ
- x87との取替え機能をつけた
- シミュレータと実機のdiff 0になった
- FPU
- cosの誤差を測定するプログラムを書いた
- cos/sinの誤差の原因特定?
- 2nd architecture
- 命令セット検討中
- Tomasulo + super scaler
- コンパイラはmin-caml
- cycle accurate simulatorをコア係かシミュレータ係が作る?
質疑
- 完動おめでとうございます
- シミュレータと一致した?
- しました
- コア
- fpu分岐まわりの仕様確認(シミュレータ係と食い違っていた)
- 再帰fibが実機で動いた
- マンデルブロ: データの個数はあっているが出てくる数字が全部0
- シミュレーション環境の改善をした(デバッグ出力のon/offを切り替えたりとか)
- コンパイラ
- バグをn個取った
- レイトレで黒い画像がでた
- テストケースを増やした
- シミュレータ
- in/out実装
- fpuのC実装を組み込んだ
- FPU
- 実機と結合した。大体動いた
質疑
- コアってFPUとかの簡単なテストは大体通っている?
- はい。1+1とか1+2とかしかしていないですが。連続で使った時にどうなるか、などは試していないです。
- データの個数は合っているので、むちゃくちゃな所にプログラムが飛んでいっているとかいうことはないみたいですね。
- 比較単体を動かすようなアセンブリのテストは通っていますか
- はい
- 今ってminicomを使っていますか
- cutecomです
- そっか……。じゃあ勝手に0を捨ててるとかもなさそうですね。
- はい。fibやackはちゃんと動いているので、今はFPU周りかなと思って調べています。
- それかライブラリですかね
- シミュレータだと(FPUの微妙な誤差を覗いて)マンデルブロが動いているので、コアとFPUの問題だと思っています。
- コンパイラ、真っ黒な画像ですか
- さっきちょっとだけ進捗があって、真っ黒ではなくなりました。でもよくわからない感じで、ピクセルが70%くらいでたあとセグフォで死にました。
- ちなみにどこを直したのですか
- レジスタの使用規約を自分でころころ変えていまして、戻り値レジスタを整数用と浮動小数点用で番号が違うのを同じ番号に揃えた際、min-rtでしか使ってないようなライブラリ関数の実装の方も番号を変えるのを忘れていた。
- コア
- OoOコア(2)が一部できた。ALU命令とfaddが動く
- コンパイラ
- Null
- FPU
- fsqrtだいたい作った。
- C実装できた(最大誤差2ε)
- 2クロックだと実機で動かなかったので3クロックで動かそうとしている
- シミュレータ
- Nil
質疑
- コンパイラの方は今いらっしゃいますか
- はい。
- ついさっき命令数を減らすcommitがありました
- fsqrt最大誤差2ですか。結構性能が良いものができたのですね。何かテーブルを作る際に工夫した点とかありますか。
- 傾きが割と、一番上のbitが常に1なのでそこを省いたりとか、ぐらいですかね。普通にやったら結構良い精度でした。
- 感覚的には2クロックはテーブルの所でつらいと思うので3クロックで良いと思います
- 実機で動かなかったのはタイミングが間に合わなかったのですか
- はい
- タイミング制約の警告が出たのですか?
- 4nsec足りないと言われました
- 完動しているみたいですし、この先は高速化を目指していただければと思います
- FPU: cycle-accurateシミュ(tomasulo用)の実装中
- シミュレータ: rev2にむけて動的命令数の統計をとる実装中
- コンパイラ: インライン展開周りの6倍)fmulの乗算最適化をごりごり実装
- コア: xstと格闘中(再帰fibが動くようになった)
- FPU周りのこと
- 回路周波数を速くしたら(7/6倍)クリパがひっかかった
- 乗算器の設計が下手だったからだった
- rev2に向けてSIMD的な新しい命令を考えたい
質疑
- SIMD的な命令とは
- メモリからたくさんの値を取ってきて全部を足す、をconcurrentに動かす、とか。
- 素敵ですね。それはシミュレート結果からの要請があったのでしょうか。
- まだです
- あったら良さそうだなあと思って考えています
- SIMD的なのってコンパイラでうまく使えそうですか
- どういう風に実装するのが一番楽そうですか
- 一番楽なのはmin-rt.mlを変えちゃう方法で、これは厳密にはルールに則っていない
- 非公式結果でよければそれでも良いです
- あのコードは並列性を生み出すのが難しいとのもっぱらの噂です。何かしら使用できる形にしても面白いと思います。
- xstと何を格闘したのですか
- 今は大体格闘おわった
- 実機とmodelsimの結果が明らかに合わないことがあった
- modelsimのpost translateでやると実機と同じデータが得られた
- xstがおかしなコードを生んでいたようだ
- それを何とかしていました
- signalの名前を変えるとかですか
- 列挙型みたいなのが壊れているみたいだったので、仕方なくstd_logic_vectorになおしてやると動きました。
- コア
- ISAにある各命令のデバッグが完了
- プロトタイプ完成
- fibはまだ実機で動いていない
- コンパイラ
- ライブラリをかいた
- min-rt.mlのコンパイルが通った
- まだバグが1つある(ネストした関数呼び出しがバグっている)のでまだシミュレーションはしていない
- シミュレータ
- 元々だいぶ完成している
- ありがたい機能を追加してくれている
- 動くものができるまではデバッグに参加してもらっている
- FPU
- fmulをVHDL実装中
質疑
- どこらへんがバグってそうですか
- 吐いたアセンブリのコードを見ると虚無からデータをロードしようとしている
- コアのシステムコールっていうのは具体的にはどういうものでしたっけ
- read_charとかそういうのです。ループバックのやつ。
- in/outのところをシステムコールの形で実装している、と。
- そういうことです
- 将来的にはOSを作る構想なんですか?
- そうです
- 割り込みとかには対応しないんですか
- しないんじゃないですか
- できたらいいなあ
- 1週間かけて2nd ISAを詰めて、研究した
- 12月末までの線表を引いた。今日までが種々の技術調査。大体12/14位に完動するはず。そこから最適化で、1月は期末試験。
- 2ndの命令セットは1stをもとにいくつかの命令を追加・削除した
- シフト命令は即値のみ
- ブランチ命令の充実(eq, neq, lt, leq)
- fsubをつけた
- 浮動小数点ゼロレジスタをつけた
- コア
- 1stのクロックを上げた。88MHz。レイトレ103sec
- スーパー素からCPUをFPGAに実装した卒論を読んだ
- コンパイラ
- 種々の最適化技法を調べた
- 2ndのコンパイラを書き始めた(min-caml base)
- シミュレータ
- 2nd ISAを読んだ
- FPU
- fsqrtの実装を少し変えて133MHz 3clkに間に合うようにした
- fast InvSqrtを試してみた(けど現状使えなさそう)
質疑
- Out of Orderで分岐予測するとROBが要るので注意
- fast InvSqrtというのは
- https://en.wikipedia.org/wiki/Fast_inverse_square_root
- 1 iterだけだと20000ulpくらい誤差。3 iterくらいでレギュレーションを満たす
- sqrtをソフトウェア実装している人だと旨いかも?
- 実機完動ならず
- 今週の進捗駄目です
- 尺が余ったので与太話をします
- 命令数14億事件
- 勘違いでした
- x86力が足りず、事故を起こしました
- クロージャーむかつくよね
- 全てのクロージャーを生まれる前に殺せ
- 頭の良くない実装ではレジスタが100個必要になりました
- 今は全て撲滅しました
- インライン展開が爆発した
- mulをライブラリ実装(min-caml言語で実装)している
- mulをインライン展開したい
- x * 10 = x << 3 + x << 1
- これは問題ない
- x / 10 = ???
- インライン展開すると、divが2^30展開される
- divのインライン展開は諦める
- mulとdivの関数サイズはほぼ同じなので、関数サイズでインライン展開するかどうかを決めない方が良さそうだ
- min-caml付属のmin-rtは爆速
- 60倍くらい速度が違う
- 未来のオーバーテクノロジーを使っている??
- 結論: 手抜きしている
- 手抜きしているのに何故あのような綺麗な画像をはけるのか
- 我々は色合いを少し変化させるためだけに何十億もの命令を使っている
- 多分間接光の計算に時間を費やしている
- ヒープが爆発した
- mulとdiv内で自由変数を使う実装に変えたらヒープが足りなくなった
- print_intでmul, divをたくさん使う
- 今は逆にヒープが余っている(クロージャを撲滅させたため)
- CPS変換やるかなあ
- 内のCPU係がこの前寿司を食べていた
- 来週実機完動!!
質疑
- 投機的寿司にロスは無いです
- 手抜きって具体的にはどのようなものだったのですか?
- たしか間接光周りの計算をほとんどしていなかったはずです
- ウチのクソみたいなアーキテクチャでも(動的)1億命令くらいで動きました
- 間接光撃ち切っちゃってるんですか?
- もう計算しない、という形だったかと思います
- 車の前の方の光り方が違う、とか、地面の光り方が違う、とか。
- その昔、進捗を求められたコンパイラ係が嘘最適化というのをやっていたのですが、そこらへんを誤魔化していたんですかねえ
- その他の係の人は息をしていますか
- しています
- FPU係はcycle accuratedなシミュレータを作っていて、
- シミュレータ係は2ndの命令セット策定のためにどんな命令があればいいか調べていて、
- コア係はデバッグしています。
- 実機では再帰fibが動いてmandelbrotが動いていない。sinが動いていない?きっとFPUがおかしい。
- コア係
- FPUのクロック数を変更(3 -> 7clk)
- そしたら変なことが起こった
- f2iなど1clkでできそうなFPU命令をALUで使うようにした
- FPU係
- f2i, i2fの実装
- シミュレータ係
- breakpointの実装
- コンパイラ係
- la, li, llwに対応
- llw: label load word (.dataの値の代入)
- 比較命令のバグ修正
- 全体
- mandelbrotが正しく動くまたは正しく動かない
- FPUとシミュレータは多分完成している
- コンパイラはmandelbrotはコンパイルできるがraytracerがコンパイルできていない
- ライブラリはsin, cos, atanが正しく動く。read, printは未実装
質疑
- faddのクロックが厳しい?
- faddだけでテストしたら3clkだと実機でfadd 1.0 (-0.5) = -1.5になる
- タイミングエラー?
- まだ確認していないけど多分そうだと思います
- 他は大体動いていて、mandelbrotにコーナーケース的な線が生えている感じです
- isim上では正しく動いているように見えるので多分間に合っていなかったのだと思います
- あともうちょっとの感じですか
- コンパイラであと足りないのはライブラリだけですか
- 今の所ライブラリが足りないのだけだと思っています
- mandelbrotって浮動小数点演算命令そんなに使っていましたっけ
- faddとfmulは使って、それ以外は使わない
- コア的にはどんな感じでしょう
- あとI/Oのバッファが足りないかも。min-rtがコンパイルできるようになったら確かめる。
- コア係
- メモリ用のユニットを書き始めた
- レコードの定義くらい書いた
- さっき大体書き終えた
- コンパイラ
- ちょっぴり命令数が減った(40億命令くらいから23.1億命令)
- export let, export let rec
- 各括弧構文(組み込み命令の実行)
- FPU
- f2i, i2f作った
- 色々高速化した
- テーブル使うやつは非同期ROM使ったら1clk減った
- 今度は周波数上げても動くものを作る予定
- シミュレータ
- 各命令の回数カウント、表示追加を追加
質疑
- コンパイラさんがした最適化とは
- リンクレジスタに相当するものがあって、関数呼び出す度に退避するようにしていたのですが、そこを直した
- min-rtにfabsとかがあるのを、ウチの命令セットにはfabsがあるのに関数呼び出しのオーバーヘッドが大きいので角括弧命令を導入したら5億命令くらい減った
- 非同期ROMってブロックROMじゃなくて非同期で読み書きできるようなものを実装したのですか
- クロックのrising_edgeを待たなくても読み込めるようにした
- 分散RAMの組み込みだけ、みたいな感じで
- コア係の「レコードの定義」ってどういうのですか
- 型定義です
- メモリー用のユニットとは
- メモリー用のリザベーションステーションを作っていました
- これから高速化に向かうのですか
- はい
- 次のアーキテクチャも考えています(一応まだ1st扱い)
- 完動していましたよね
- はい
- 2ndのアーキテクチャも案はできているので、そろそろ移ろうかなという感じ
- 2ndはどんな感じになりそうなのですか
- コンディションレジスタを消したとかそんな感じ
- 若干デコードのしやすそうな命令セットにした
- その過程でわけのわからない命令もできてきそう
- 浮動小数点比較の即値と比較するやつとか。17bitくらいしか即値を取れないのでそんなに意味が無いが
- ただしレコードの並びが良くなる
- コア
- fib5を計算した所無事5が出力された
- 分岐を直しデータパスをすっきりさせたら、st, ldでメモリアクセスの完了を待つようにしていた(?)のがバグっていたので直した
- コンパイラ
- ライブラリとクロージャあたりのバグを修正した所、スケルトンな画像が出てきた
- シミュレータ
- バグとり
- メモリダンプ機能、breakpoint
- FPU
- fmul(3clk, パイプライン)がシミュレータで通った
質疑
- ちゃんとレイトレースできないことの原因がコンパイラにあるかシミュレータにあるかは切り分けられていますか
- 多分シミュレータです
- ちゃんと分かっていそうならよかったです。
- FPUは予定としてはどこまで実装するんでしたっけ
- finv, fsqrtまでです
- 多分fmulはもうできたかと思うので、残りfinv, fsqrt
- コアはもう大体インターフェースの部分はできていて、後はできたFPUの部分を組み込んでいけば多分動きそうという感じですか
- コアはまだ浮動小数点周りは受け入れの準備もしていないので、FPUができてもすぐにくっつけられる段階には無いです
- コア
- 初期化ロードに対応した
- システムコールを実装(今からデバッグ)
- 多分そろそろ再帰fibが動くはず。これからやる。
- コンパイラはシステムコールの実装を行った。
- シミュレータはデバッグした
- FPUはfadd, fmul, fnegの実装が完了した(C, VHDL共に)
- min-rtがシミュレータで動き、ちゃんと画像が出た。これからraytracer/min-rt.mlをやる。
- 余談
- フラグを立てた時にはいる、一度しか通らないステートでなぜか無限ループに入っていた
- 代入演算子が比較演算子になっていた
- エラーも警告も出ないのでつらかった
質疑
- fibが動いたんでしたっけ
- 実機ではこれからです
- それっぽいものは動きそう?
- 大分動きそうだとは思っている
- fibができたらFPUを組み込む
- はい。あとFPUを使わない種々のテストをしてみたい
- 完動しませんでした!
- コンパイラ係
- レイトレ画像を出力
- 三角関数等の誤差を検証
- 審判サーバー向け対応
- 何故か120億命令、inline 100でも60億命令
- lw, addiが多い?
- プログラム中でやたらとよばれている場所を探してみている
- 斑点の謎
- FPUはとりあえずx87を使っているので大丈夫な気がする。ライブラリの三角関数がおかしいのかも?
- コア : 審判サーバーで動かない。多分そんなに大きなバグではない
- FPU
- fcmpとfmulのバグを取った
- fmulにoverflowとunderflowを実装
- finvがおかしい? よく原因が分からない。
- 次回「祝福」 〜そこに寿司はあるか〜
- 4班のスライドが教育的かつ面白かったので是非見てみてください(15er wikiにあります)
- 後輩が誤解しないように追記(by nekketsuuu)
- sinがnπ付近で絶対誤差が大きくなっているのは実はレギュレーションの範囲内です。レギュレーションをよく読んで下さい。
質疑
- 寿司は有っても金は無い
- たらふく食えない寿司に意味は無い
- 即値代入命令はありますか?
- addiを流用しています
- addiの命令調問題はどうしていますか?
- addiは16bitしか無いのでshiftとorでやっています。
- インライン展開を深めていくと即値代入が多くなってくるので、即値代入の命令を作った方が良いという定説がある
- ただ、今インライン展開していない状態で120億命令もあるので……
- 120億ってそんなに多すぎることは無いと思います。
- (conimg/test.sldの斑点の話)上に浮いている球の部分には三角関数が大幅に使われるはずなので、三角関数がおかしいのかも?
- 狭義完動
- 高速化へ
- コア : 分岐やメモリアクセスの改善を構想中
- コンパイラ : 追加すべき命令を検討中
- FPU : cycle accurate simulatorの実装(素朴な実装だと結構遅いらしい)
- コアの構想について
- すでにOoOなので書き直しはしない
- CDB増やすかも
- 動作周波数の向上は後回し
- 自分でしっかり理解してバグを生まないようにするため、そして他の人が読めるように自分のコアのドキュメントを書く。
- メモリアクセスについて
- ノンブロッキングキャッシュ(victim cacheにするかも?)の自走
- 今の実装ではメモリアクセスはin-orderで、特にstoreは1つ前の命令が終わるのを待ってる
- 分岐について
- 分岐予測(gshare)とbranch target bufferの実装
- 分岐予測ミスのペナルティの削減
- 現在の実装では分岐予測なし(常にnot taken)
質疑
- 実行命令数何億くらいでしたか?
- 完動したときはあまり最適化かけておらず60〜70億くらいあった。今は多分20億位まで減らせそう(?)みたい。
- CDB深くするということはdouble issueとかするんですか
- issueもできたらいいですが、大変そう
- 現状何clock per instructionくらいですか
- 時間はちゃんと測っていなくて……
- まだ審判サーバーに対応していない
- 今ってOoOの恩恵はウケられていそうですか?
- レイトレしたときに(体感でしか無いが)やたら時間がかかったという印象は無かった
- 時間をとって今後の改善点を見つけるのに使っていただければと思います
- 投機実行はできるようになっている?
- はい。必ずnot takenですが。
- シミュレータはFPUの方が作っているんですか?
- cycle accurateの方はFPU係が作っていますが、ちゃんとした方のシミュレータ(?)はシミュレータ係が作っています。
- cycle accurateってOoOの動きも全部?
- はい
- 相当面倒くさいと思います。
- はい。頑張ってくれるそうです。
- 実装の参考になるもの: 概念を説明している本はあるけど、細かい実装を説明している本は無いような。
- キャッシュ関係がやりたいんですか。それともOoOやスーパースカラとかそこらへんですか
- どちらも高速化ですが……
- そうですね。どっちもつけるとなると2つのコヒーレンシとか考えないといけなくなる
- そういう意味ならそれを書いた書籍はちらほらあります
- コンパイラ: inv.sをデバッグ
- コア: システムコールのデバッグ
- 今週は全体的に進捗が微妙でした
質疑
- 何かつらいことはありませんか
- 一応FPU係的にはつっかかっている所はなくて、時間の問題かなという感じです
- 先週の段階だと、シミュレータ動作で出たり出なかったりという感じだったかと思いますが、そこからは特に何も進捗が無いという感じですか?
- シミュレータの方ではきちんと毎回出るようになりました。
- じゃあ実機動作のみ?
- 載せる所にもいっていない
- 再帰fibも動いていない
- たしかローダー方式でしたよね。ローダーのデバッグもある
- コアは今どのあたりで遅れが出ていますか?
- print_charのシステムコールを実行しようとすると、1回しか呼んでいないのに何故か2回出力されたり0回出力されたりする。
- これから色々テストする
- じゃあコアっぽいものは大体できていて、細かい所で悩んでいる?
- はい
- 再帰fibもシステムコールのprint_charを使っているので動いていない、という状態
- 周波数は内部で全部統一されている?
- 全部66.6MHzのはずです
- ステートマシン系のバグですかね
- がんばってください
- カタンって1回のプレイが長いですからね(^^)
- シミュレータでそれっぽい画像をはけた
- 命令数25億くらい? ちょっと少ない。
- カウントに使った変数の方をlong long intにしたところ安心の68億になった
- インライン展開のサイズを20にしたら40億くらいに。
- 実行に使った命令の分布図を見ると、一番多いのはload。これが14億くらい。かなり時間がかかるのでなんとかしたい
- コンパイラ
- デバッグのためにレジスタのビット列を吐くprint_bitを実装
- コアの32bit単位のアドレス指定に合わせる改造を実行中
- シミュレータ
- 命令数カウント
- 32ビット単位アドレス指定
- x86のfloat演算にまつわるバグフィックス(型がおかしかった。1.2 + 0.5が1.68になってた)
- データファイルを自動ロード
- アウトプットファイルの名前指定
- FPU : fdivを書き始めた
- コア
- 再帰fibが動いた
- 原因の1つ: 前に直そうと思っていたバグを忘れて放置していた
- コンパイラでも似たようなことがあったので、しっかり管理しよう
質疑
- (命令の分布図)ほとんど実行されていない命令があるように見える
- sendとかrecvとか。実行されているのですが、このスケールで見ると0に見える
- コアでfibが動いたということで、いよいよFPUを組み込んでやれば試しにレイトレも走らせられるぐらいの所にはきているんですかね
- なにせ実験環境が整うまでが長い。とうとう辿り着いた。ここからですね!
- 命令数カウントの分布図は是非みなさん完動したら貼り付けて下さい。
- 次期ISAがだいたい決まった
- コア
- 2nd向けのコアがだいたい動く気分になった。再帰fibは動いた
- 分岐命令は実行ユニットに入らなくても可能になり次第行うようにした
- 分岐予測を実装したい
- コンパイラ : 2nd向けのコンパイラが大体動く気分になった
- FPU : fadd3ステージにして早くした。133MHzで動いた。
- シミュレータ : 2nd用のものを書いた
質疑
- 2nd ISAで意識したことはありますか
- 即値をもう少し取れるようにした
- 幅ですか?
- 色んな命令で取れるようにしました。
- 即値からレジスタの値を引く、とか
- 他にはありますか
- デコードのしやすさを考えた
- コンディションレジスタを消した
- 分岐予測的には今は投機実行なのですか
- 今は実行していないです
- ROBはもうあるんですよね
- はい
- じゃあすぐできそうですか
- そうでもないです
- OoOってレジスタ書き込み予約テーブルがあるじゃないですか。それを戻す必要があって、それが難しそうだなと思っています。
- 多分難しくないと思います。分岐予測が失敗したときにクリアすればよいのでは。
- この命令はこのレジスタを見て下さい、というテーブルは書き換わっているので書き戻さないといけない
- 多分ミスったときは割と時間かけて戻した方がよいと思います
- どうせ分岐予測は全体の95%くらいは当たるようになると思うので
- mandelbrotが動かせるようになった
- コア
- ライブラリ完成
- アセンブリのどの行が何回実行されているか見れるようにした
- インライン展開の数によって何故か出力が大きく変わる。成功したり失敗している
- コンパイラ
- raytracerがコンパイルできるようになった
- FPU : fmulを直した
- シミュレータ : やることがない
質疑
- インライン展開をしないと、バグがでる。スタック周りかな?
- スタックを積み過ぎている?
- それは無いと思います
- クロージャ呼び出しがバグっている?
- コアはどこまでできているんでしたっけ
- 大体できている
- ライブラリのデバッグをしていたら時々おかしいときがあるので、まだちょっとバグっている
- 多分コアの方がおかしい
- 画像をはいているのは全部シミュレータなんですよね
- はい
- アセンブリの何回実行されているか見られるように、というのは
- アセンブラとシミュレータを両方少し改造して、両方の出力を突き合わせると見ることができるようにしました。
- アセンブリの他にログを吐いて、それを使って一応見れるようなものを作った
- github issuesでissue管理するようにした(1stのときはTrelloにしていた)
- コア: 書き始めた
- コンパイラ: make debugがエラーなく通る
- シミュレータ: 2nd ISAに対応
- FPU: faddの133MHz, 2clkを書いている(無理なら3clkにする), fmulのパイプライン化をしている
質疑
- faddを133MHz, 3clkでも充分よくできていると思います
- 2clkができたら下さい
- レギュレーションの裏をついているので、実用性があるのかは分かりません
- Trelloの何が悪かったのですか
- バグフィックスのチケットが投げにくい
- 期日設定しにくい。期日を過ぎても炎上しない
- 狭義完動した。今夜は寿司。
- 2ndに向けて
- ISAを大幅に簡素化&最適化する
- パイプライン化する
- SIMD
- メモリキャッシュ搭載
- I/O、メモリコントローラの最適化
- 命令統計をとる
- github issuesを使う(今まではslackに流していた)
- submoduleの問題でlocalのは動いてるのにgithub上のは動いていないとかいうのがあったのでやめる
質疑
- SIMDはコンパイラの方でがんばって、SIMDにできそうな所を探すんですか
- はい
- I/O、メモリコントローラの最適化とは
- 送られてくるのが1byte単位なので毎回4byteにしていたのだが、そんな機能要らなかった
- あと、その関係で実装がぐちゃぐちゃになっていたので
- メモリコントローラもぐちゃぐちゃになってしまっていたので
- 寿司はどこに食べに行くのですか?
- 僕は全く聞いていなくて……
- 現状: 1st architecture 動的命令数32億、約6分 in-orderかつパイプライン無し
- お寿司おいしかった
- 2ndの設計
- コア
- パイプライン化
- キャッシュ
- 分岐予測
- 命令セット
- 複合命令(試験段階)
- optという2bitフィールドを用意
- addやsubの結果をabsしたりnegしたり
- まだ統計とったりはしていないのでどうなるかは分からない
- 浮動小数点演算のハードウェア実装
- 直交性の高いフォーマット
- decodeの容易性
- ビットを1つ変えるだけでGPR命令かFPR命令かが変わるとか
- コアのI/O wrapperが1日で完成(1stでは諸事情により20日かかった)
- 2nd ISA向けのアセンブラが完成した
- シミュレータもほぼほぼできた
- FPUのパイプライン化に着手。finvはできた。
- 統計取りたい
- bigram, trigram
- 基本ブロックの長さ
質疑
- やっぱりISAはきれいに作りたくなりますよね
- はい。MIPSだとsrc/dstの方向の認識が係間で異なっていたりもしていて大変でした。
- なんかパタヘネのとおりに作るとデコードが汚くなりますよね
- 審判サーバーで動かないのは0x0aがもらえないとかですか
- いえ、0x0aは遅れているのですが、その後のデータをもらいきれていないみたいです。cutecomで同じ状況をつくるとうまくいくので、cutecomと審判サーバーの微妙なタイミングの違いがあるのではないかと思っている。封印されし1st I/O wrapperを使った結果なので、2ndではうまくいくのでは、と期待している
- optみたいな複合命令じゃなくて、別の命令として用意
- 絶対値をとったり符号反転をしたいことが結構あるんじゃないかと思っていて、そういうのに1clkかけるのは無駄なので、レジスタにしまう所でちょちょっといじってしまいたいかな、と。
- fabsが10^7回くらい呼ばれているので、そこがうまく減らせないかなあと考えています。回数が微妙なオーダーではありますが……。
- オペコードのbit数は
- 6です
- 結構余っているのでは?
- 直交性を高めようとするとカツカツです
- 直交性ってなんですか
- ほとんど同じ機能だけどちょっと違うやつはビットをちょっと変えるだけで実行できる、みたいな意味で使っています
- 2ndを作る上で、性能を上げる意味で改良した所はありますか
- 直交性はセレクタが簡単になるという意味もあります
- ldにキャッシュをつけます
- 1stではfadd, fmul, finvでしかHardware実装されていなかったので、fsqrtやf2i, i2fなどをHardware実装するつもりです。
- コンパイラ
- min-caml/min-rt/min-rt.mlが動いた。dstレジスタがおかしかった。
- raytracer/min-rt.mlがクロージャレジスタまわりをいじったらシミュレータ上で動いた
- シミュレータがちょっと高機能化した
質疑
- closure registerまわりをいじったらって、どのようなあたりをいじったのですか
- saveしてないとかそういうのです
- コアの方はどんな感じですか
- とりあえず今はraytracerもmin-rtも動いていません
- min-rt/min-rt.mlは木曜日には動いていて、diffが1pxだけありました
- 木曜日と今日の全体的なdiffはコンパイラだけなので、多分コアがよくないんだと思います
- コア
- 浮動小数点数系の命令を実装
- FPU係のfaddとfmulをくっつけた。これからテスト
- 今の所先週まで動いていた再帰fibが同様に動く。
- コンパイラ : ビット幅に対応
- シミュレータ : コアの変更に対応
- FPU : fdivを作っている
質疑
- fsqrtとかは実装しますか
- fsqrtはとりあえず作らずにコンパイラでやる予定です
- fdivの開発にどのくらいかかりそうですか
- うーん、どうでしょう
- 1週間くらいですかね
- 12月中の完動に必要なのはあとはハードウェア周りだけという感じですか
- そのはずです。コンパイラはもうシミュレータ完動しています。
- シミュレータ完動しているということはコアでそれを使ってデバッグができる。
- 最終的に細かいバグがたくさんでてきたら、modelsimとかでそこにひゅひゅっと移って見ることができる。そうするとI/OシミュレータとかSRAMシミュレータとかあると色々見易いかなと思います。それを使っていろいろガタガタやって、レジスタの値を突き合わせてやるとデバッグできるかな、と。
- FPUが二人いると思うのですが、うまいこと役割分担はできていますか
- できていないと思います
- いまほぼ片方の人が動いています
- もう一人の人は生存はしています
- fdivはテーブルとか作ると思うので、うまいこと仕事を投げると良いと思います
- 浮動小数点数系は最下位ビットがずれるとかそういうつまらないバグがたくさんでると思うので、今の段階から一緒に作っておくとデバッグがしやすいかもです。
- 2ndがとりあえず完動した気がする
- FPUを高速なものにした
- でも2sくらいしか速くならなかった
- 命令実行数は21億くらいだが、68sくらいかかる
- コアが遅い
- どうせ分岐命令で大量にストールしている気がする
- 投機実行の目処がたったので実装中
- コンパイラ : 2ndアーキテクチャに対応した(最適化がかなりかかっている)
- シミュレータ : 2ndシミュレータにブレークポイントとかカウント機能とかがついた
- FPU
- fsqrtのテーブルを新しくした
- fmulの高周波数版を作った
質疑
- キャッシュはあるんでしたっけ
- 最初はついていて、それが分散RAMで実装されていて、合成時によくない感じなのでとりあえずオフにしたのですが、今の所もうすこしキャッシュのサイズを小さくしてオンにできる機能は作りました
- キャッシュかなと思っているのですが……。小さいものでサイズどのくらいですか。
- 32エントリです(分散RAMのため)。つけても5sくらいしか速くならなかったです。
- ただの整数命令のときにパイプラインのときに比べて逆にレイテンシが大きくなってしまっているとかは
- 実行ユニットは特に支障がなければ次のクロックでCDBに投げるので多分大丈夫だと思います。
- in-orderより悪いことはないと思っている
- しかし1班のin-orderよりIPCが悪い
- シミュレータではストール回数が数えられないんですよね
- その関係で、ストール回数を返すデバッグ用の命令を加えようと思っています
- コア&シミュレータ
- 仕様変更や命令追加などに対応
- 実機で再帰fib, ackが動いた
- FPU : finvのC実装が書けた
- コンパイラ : raytracer/min-rt.mlが動いた。大体80億くらい。
- 即値代入を、上位ビット代入と下位ビット代入に分けているのだが、今必ずどっちもするようになっていて無駄がある
質疑
- FPUはもう組み込まれているんでしたっけ
- まだです
- コンパイラ係さんはもう仕事終わった
- そうですね
- ライブラリの実装は
- してないです
- fsqrtは
- していないです
- そこはとりあえずコンパイラ係の方がいいかもしれませんね
- シミュレータ : 細かいバグとり
- FPU : i2fを書いている
- おまけ : 1stのときの命令統計
質疑
- 予定としてはどのくらいに2nd動かしたいですか
- 12月中にとりあえず動かせるようにはなりたい
- 主な進捗: 2ndのISAを決めた
- 1stは定数代入が多すぎた(60億ほどある命令数のおよそ3分の1がlimm命令[定数代入]) -> add, sub, jump, load, stwの定数バージョン
- 1stはジャンプ命令が冗長(cmpで比較結果を保存してジャンプ命令でジャンプ) -> 2ndではcmpc命令で統一。cmpcの第4引数に応じて比較結果を保存、jrncでジャンプ
- fsub, fabsを追加する
質疑
- 2ndはin-order?
- 元からOoOです
- cycle-accurate シミュレータはどのくらいまで実装できましたか?
- fibが動きそうでまだ動いていない、みたいな感じです
- コア係さんの進捗にあるキャッシュってなんですか
- サイズ: 2^10くらい
- 2^11, 12, 13くらいからおいしくなってくるかも
- 一応ブロックRAMで作る予定なので、増やすのはできます
- 段々増やしてもそんなに効果なくなってきて、丁度いい部分があると思うので探してみて下さい。
- ところでcycle-accurate シミュレータってプログラム的にはどのように作っているのですか
- Cで頑張っています。オブジェクト志向的なのはないです
- 速いのができたらすごい欲しいのでください
- コンパイラ: rev2の仕様決定、最適化
- コア: キャッシュの実装完了
- 以下おまけ
- これからの「シミュレータ」の話をしよう
- 最近シミュレータの高速化が熱いらしい
- 6班の技術を紹介。Lightning Simulator(Lsim)と命名
- 普通のシミュレータは自作CPUバイナリをインタプリタ実行する。「インタプリタ」は遅い。じゃあ自作CPUバイナリをコンパイルしよう。
- 自作CPUバイナリをx86アセンブリにコンパイルする。その結果インチキJITシミュレータが完成。
- なぜ"インチキ"JITか?
- 普通のJITシミュレータは自作CPUバイナリを引数に指定して、シミュレータを立ち上げると、シミュレータがバイナリをx86アセンブリに変換し、EIPを返還後のエントリポイントに動かす。
- しかしこれは面倒。x86バイナリを吐かなきゃいけないし、バイナリに実行権限を与える必要があり、OS依存コードが発生する。
- 各ページには実行可能かどうかのフラグビット[XDビット]がある(悪意のあるコードへの防御機構)。
- こういうのがあると実行権限を与えるたびにOSのAPIを叩かなきゃいけない
- MacのAPIはマジだるい
- x86バイナリを吐くのではなくアセンブリをはき、最初から実行ファイルにすればよい。
- 具体的にしていること: 自作CPU向けアセンブリをx86アセンブリに変換し、clang(gcc)でコンパイルして、実行する。
- インチキJITシミュレータの実装効率化
- 既存のアセンブラソースを改造して実装
- FPU命令、デバッグ命令などはCで書かれたライブラリ関数を呼ぶ
- アセンブリがuglyなので適宜マクロを作る
- インチキJItシミュレータの罠
- 環境依存なコードはどうしても出てくる(clangで、C言語で書かれたところのラベルにアンダースコアがつくかどうか、とか)
- アセンブリ上でのC言語のメモリの使い方をミスるとバグる
- 限られた時間ないで最大限の最適化を行うには「実装→デバッグ→テスト」のサイクルを高速化することが不可欠
- Lsim上での60奥命令実行は約10秒。命令数カウントを省略すれば約3秒
- 現在(14億)の実行は約2秒
- そうしてくると、min-camlのコンパイル時間がボトルネックになる → この話はまだ今度
質疑
- 14億はすごいと思います。インライン展開はしていたと思いますが、他に何かしましたか
- 中間表現はそんなに変えていないです。if文まわりを少し変えたくらいかな。
- 即値命令系を入れるか入れないかは大きかった
- 今のmin-camlコンパイル時間ってどのくらいですか
- 今は、一番最適化を強めた状態で多分2分くらいで、そうでないと30秒くらい
- というのが、デフォのmin-camlって最適化全然かけてないのでコンパイル時間が短い
- 特にインライン展開をしているとバイナリサイズがどんどん増えてきて大変
- ウチのコンパイラ係も一番最終的には1バイナリファイル吐くのに30分かかったので、高速化がんばってください
- コアさん、キャッシュを実装とのことですがどうでしたか
- まだ大きさをなかなか変えていませんが、一応速くなりました
- どのくらいの大きさですか
- まだ1024エントリくらいです
- もう少し大きくしてもよいかなと思います
- 完動。nopを数えないと、38.5億命令。
- 実は下記の理由でnopを大量に入れていて、合計で145.5億命令。実機で380秒程度。
- lwの後に必ずnopが6個入っている
- フォワーディングがバグっている。タイミングが間に合っていないように見えるので直すのは大変そう。
- 今から2nd ISAを決める。コアはOoOにする予定。FPUはパイプライン化する予定。
質疑
- 今はパイプライン化しているのですか
- nop入れて待たないと動かなかった。
- nopを1つ減らすだけでも相当変わると思う
- レイトレ以外の小さいプログラムだとnop入れなくても動くのが、レイトレだとヘッダすら出てこない。
- ヘッダすら出てこないなら、ModelSimでよく見てみると、分岐がミスってるとかそういうのかもしれない。それか全然違う所で誤動作をしているかもしれない。
- 何も出ないということはジャンプとかそういう所かな
- 審判サーバーは使った?
- まだ
- nop 6個というのは、絶対に必要な数なのですか
- 後ろの命令がlwしたのをすぐ使うなら6個必要で、そうでないなら不要。とりあえず動かしたかったので全部6個入れた。
- コア
- FPUを組み込んだ
- factの浮動小数点バージョンがだいたい正しく動作した
- IOのsenderを書いた
- コンパイラ: バグとり
- FPU
- fmulのバグとり
- fdivがいい感じに動いた。これからバグとり
- 手が空いている人で2nd考えたいなあ
質疑
- 2nd考えるんだったら、コアはあまり立ち会わずにコンパイラがちょちょっと決めるのでも良いと思う。よっぽどハードウェアに関係する命令を追加しないのであれば。
- fdivがいい感じに動いたというのは、C実装はできたんですか?
- C実装はしていないです
- じゃあVHDLで動かしていて、コーナーケース以外は動いていそうなんですか
- 小さいランダムケースで誤差がそんなに無さそうだった
- シミュレータ係さんがやること無いよと困っている。それこそ2ndですかね。どんな命令を追加したら絶対速くなるだろ、というのは、シミュレータの書き方にもよりますが、nopとかストールを模倣するような形があればシミュレーションして調べることができる。
- コア: CPU実験をやるための余裕を作るための課題を進捗。コアは、読み込みで詰まっている。
- シミュレータ: 統計情報を命令数のみに絞った高速動作版を作成。2倍くらい速くなった。
- コンパイラ: CIとTDDに慣れようとしています
- FPU: finv, fsqrtのC実装ができた。f2i, i2fをやろうとしている
- コア
- メモリコントローラができた
- ローダができた
- メモリ仕様規約をちょっとだけ改定
- パイプラインを設計
- twoprocで書くと全然ラッチが生えない!やった!すごい!
- ローダの出力だけtwoprocをさぼる→そこだけラッチが生える
- メモリ仕様規約改定
- 0x00000- : コア予約領域
- 0x00400- : 自由
- コア予約領域に特殊関数を置いておく予定。総clk数を吐いたりだとかそういうの。
- コンパイラ: コンパイラフルスクラッチ中
- シミュレータ: デバッガー部分の新ISA向け実装完了
- FPU: パイプライン化完了。f2i, i2fをこれから実装する予定。
- 年内に完動したい
質疑
- ラッチでどういうところで出てきたんですか
- ローダーの、入力を読んで、FIFOの「データがあるよ」フラグが立ったらロードして云々するところの、そこらへんだったと思います
- 本当はどの状態においても組み合わせ回路の中で云々しないといけないのが、ある特定のデータに依存して云々するようになってしまっていたのでラッチが生えた
- process文の中でifでパターンを網羅しているのだが一時的に変数ができてラッチが生えるが、最終的にトリムされて消える。これがreportとかに出てきてデバッグしにくいんですがどうすればいいですか
- concurrentにしてwhenにすればいいんじゃないですか()
- variableを用意しておいて、それを最初に初期化しておいて、最後にそれに代入するとかじゃ駄目かな
- ループの最初にやるのが面倒だったら、twoprocのrとかregtypeに出力するためのやつを入れればいいんじゃないかな
- コア
- 2.4倍くらい高速化した。
- 27秒
- 投機的実行を実装した。予測ミス時のペナルティがほぼ0。すべての自明な分岐命令を「分岐しない」とした 68s -> 64s
- 出力用バッファを実装 49s
- memory load命令を完了を待たずに連続して実行できるようにした 40s
- キャッシュを用意 35s
- クロックを77MHzに上げた 35s
- GShareを実装 31s
- 88MHzに派手にあげてみたらタイミング制約は無視しているが27.5sで動いた
- FPU
- faddにバグがあったので直した
- fmulを高速化した。0.5nsくらい速くなった
- finvとfsqrtのx86との誤差を統計とった
- コンパイラ
- 命令数が減った 21.2億 -> 21.0億
- 最適化を5個くらい試したけど微増 or 微減だった。6個目の最適化で0.2億減った。
- 命令数グラフを作った。ldが5.9億と多い。
- シミュレータ: 細かいバグがたくさんあったので修正した
質疑
- スーパスカラ、デコーダとかも結構めんどくさくなるから
- できれば3命令くらい同時発行したいと思っているのですが
- メモリ命令3個同時に来たら同時発行するの大変
- そこらへんはおそらくいちばんメインでめんどくさい
- あとタグの割り当て
- そこらへんを頑張りつつ頑張ってクロックを100Mくらいまであげてくれるとすごいんじゃないかな
- FPU: ftoi, itof, floorの2clk実装ができた
質疑
- コンパイラ係はどんな感じの最適化をしているのですか
- コンパイラ実験をしています
- シミュレータの高速化手法を検討するとは
- シミュレータ係に仕事がない
- コア
- vsimでソフトウェアループバックができた
- 条件分岐がちゃんと動くようになった
- 1clk未満で終わるALUは全部組み込まれた
- そろそろ結合テストを始めたい
- コンパイラ
- C++でコンパイラをフルスクラッチしている
- min-caml向けflex/bisonを書いた
- LLVM IR生成器のうち算術命令、if式の生成部分を実装、修正
- let式が動いた
- FPU: ftoiのVHDL実装ができた(はず)
- シミュレータ
- メモリセグメンテーションを少し理解
- シミュレーターがある程度動くものにはなった
質疑
- コンパイラのJITというのはFPGAで作ったコアの上でJITが動くんですか
- 今LLVM吐いていてフロントエンドができてきています。最終的に自作アーキテクチャ向けのバックエンドを書くことになるが、フロントエンドから作ることになります。
- フロントエンドでは、LLVM IRで関数ポインタの値を取得できるので、それを使うとx86上で動くものが作れる。デバッグ向けに使える。
- この班は2ndで結構ISA変えたんでしたっけ?
- 割と
- そうなるとシミュレータも大規模な書き換えが必要になってくる
- まあほぼ作業みたいな感じでした
- 道筋はできているみたいなのでこのまま進捗を進めていって下さい
- 完動後あまり進捗がない(忙しかった)
- 試しにsin, cos, atanをmincamlで書いてみた
- インライン展開で命令数が減らせそう
- lwが減ったのでnopが結構減った
- 138億命令から94億命令になった
- 2nd ISA考え中
質疑
- これ実行時間だとどのくらい減りましたか
- 測っていないです
- これって確かストールしなければいけない所に全部nopを挟んでいるんですよね。ということは動的命令実行数がほとんど実行時間に比例するんですかね
- 割と残り時間が少なくなってきましたが、2ndはどのくらいの計画で作っていく予定ですか
- とりあえずはやくしたいというのしかまだ考えていない
- あと2回進捗報告回があるので、1月最後までにfibくらいは動くといいという感じですかね
- コンパイラ: rev2用のレジスタアロケーションの開発
- コア: 分岐予測の開発
質疑
- 分岐予測はGshareですか?
- はい
- cyclesimって今どのくらいできていますか
- 今もしかしたらタイミングが実機とちょっとずれてるかなあと思っていて、実機をisim上で動かしながら比較しています。isimが壊れているのかよく分からない。その結果レジスタの値にdiffが生まれているので何とかしないといけない
- どんな感じの実装にしているんですか
- Cで書いています
- 基本的にコアと同じように書いていて、VHDLの命令はCのライブラリとして作っていたりしています。
- それで何行くらいになりました?
- ほぼコアと同じくらいの行数で、3000〜4000行くらいだった気がします
- FPU: ftoi, itof, floorを2clkで実装した
- シミュレータ: 高速化した。1stのシミュレータで、39億命令2分半くらいだったのが30秒になった。デバッグ出力を無くしたつもりがなくせてなかったのを無くしたりした
- コンパイラ: コンパイラ実験をしている
- コア: 2ndのaddi, send, haltが動いた気がした
質疑
- haltというのは本当にhaltですか
- はい
- sendというのは
- シリアルの命令です
- 2ndの命令セットはコア的にはなにかすることがあるんですか
- ブランチ周りを追加したのとFPU命令を追加したくらいなのでそんな大きな変化はないです
- ftoi, itofをハードウェア実装に変えるとどのくらい速くなりそうか統計とりましたか
- 取っています。1秒くらい減れば嬉しいなあ
- コア
- レシーバーを書いてloopbackが動いた
- finvに対応した
- 真っ黒のマンデルブロが吐けた
- コンパイラ: 仕様変更に対応
- シミュレータ: fdiv -> finv&fmulの対応をした
- FPU: finvが動いたが誤差がまだレギュレーションを満たしていない
質疑
- 真っ黒のマンデルブロは、0の数は正しい数出ているのですか
- 出ています
- じゃあFPUとかその周りの問題っぽいですね
- ulp超えになってしまったやつは、そんなに大きく外れたものは無かったですか
- 10ulpくらいまででした
- じゃあテーブルの出来が少し悪いとかそういうのですかね
- そうですね、パラメータをちょっと調整すればなんとかなるかなと
- パラメータの調整なんですか
- はい
- パラメータで調整しているんなら、うまく自動実行させるようにしておいて計算させておけば2週間後には最強のテーブルが出来上がりますとかそういうのもできそう。
- ループバックが動いたということはおそらくIO部分はバグっていなさそうですね
- はい
- あ、でも先週FPU-fact.が動いているんですよね
- はい。なのでfaddとfmulはいけてると思っています
- 比較とかかな
- コア
- スーパースカラを実装した
- その仮定で大量のバグが会ったのでなおした
- 特にキャッシュ周りのメモリコントローラ
- スーパースカラを有効にするまで顕在化しなかった
- jmp, in, out以外の異種2命令を同時発行
- 関節分岐の分岐先予測用にコールスタックを実装
- ALUを倍増、メモリユニットのリザベーションステーションを拡張
- 35秒 -> 30秒 (66MHz)
- IPCが1を超えた(1.05くらい)
- 既にNumber of Slice LUTsが91%もある
- コンパイラ
- 命令数が21億->19.7億
質疑
- 今CDBは何系統ありますか?
- 2本です
- 3にするとROBに書き込むポート数が増えたりslice LUTsが増えたりするのであまりしたくない
- ROBの溢れとかはありますか
- あまり見ていないです
- 周波数このままでもコンパイラの最適化で10秒台いきそうですね
- ICPがなかなか向上できそうにないというのはどこらへんを見て思いましたか
- シミュレータで10msほど見てみました
- 結構リザベーションステーションが詰まっていて、そもそも1命令も発行できないときがあったりしていることが分かった
- fmulとか
- コンパイラの命令数が減ったのは何をしたんですか
- レジスタの割り当てを少し改善しました
- コア
- システムコールのバグが除去できた
- FPR周りのISAを実相開始
- FPU: trunc(truncate)とcvt(convert)の実装を開始した
- コンパイラ: 2ndコンパイラのフルスクラッチを始めた。不要定義削除までできた。
質疑
- コンパイラ係さんのフルスクラッチというのは何で書いているのですか
- Haskellです
- Cじゃ駄目なんですか
- 駄目だそうです
- Cでparser書き始めると無人島に一人で取り残された気分になるのでおすすめですよ
- FPUはもうそろそろ完成ですか
- 細かく確認はしていませんが、とりあえず目先のmandelbrotくらいは試せる命令が揃っています
- コア側にFPUを入れるインターフェースみたいな部分はできているのですか
- そこはギリギリまで放置しておいて、それ以外の部分が完全に動くように設計しているので、まだできてません
- コンパイラ
- 型推論の実装完了
- min-camlのLLVMフロントエンド実装完了(クロージャ除く)
- コア
- パイプライン化およびフォワーディングに対応
- アセンブラがはいたコードが実機で動いた
- loop fibが動いた。再帰fibはまだ
- メモリアクセス・IO周りを実装した
- シミュレータ: デバッガ入力のパーズ部分をLuaで書いて組み込んだ。今後の機能拡張が楽になった
- FPU: itofのVHDL実装が終わった。
質疑
- これLLVMの中間表現まで落とし込んだ所ですか
- はい。一応実行して正しいかな、という所まではいきました。
- LLVMまで落としこむにはコンパイラでどのレベルまでやらなければいけないのですか
- K正規化もα変換もLLVM IRがSSAなので勝手にそうなってます。
- 実質やることは字句解析、構文解析、型推論までです。
- もっというと、今回はC++で実装したのですが、チュートリアルにはOCamlがあるのでmin-camlを直接弄ってLLVMを吐くようにできるのではと考えています。
- Luaで機能拡張が簡単になるとは?
- シミュレータはCなので、わざわざCで書かなくてもLuaで十分というくらいの意味だと思います
- コアのタスクに「メモリ周りの仕様変更」とあるが、どんな感じですか?
- 浮動小数点数のロードの周りの仕様を変更して、即値アドレスからロードできるようにした。
- 今まではレジスタ間接とかしかなかった。
- コア: fadd, fmulを組み込んだ。FPU待ち状態。
- コンパイラ: fib等の単純なコードのアセンブリが吐けるようになった。部分適用が入ってくるコードでバグる。
- シミュレータ: Haskell実装アセンブリシミュレータでのラベルの回収、データ領域の回収ができた
- FPU: fmul, trunc.w.s, cvt.s.wのパイプライン化中。finv, fsqrtは後回しになっていて、デバッグ中。
質疑
- さすがにfinvがないと厳しいと思う。
- まずはfinvをやって、fsqrtについてはコンパイラ係にライブラリを書いてもらうのが良いかもしれない。
- おそらく動かしてみないと分からない大量のバグがあると思う
- まずは動かそう
- 今あるfinvやfsqrtは実機で動かそうとするとどのくらいの周波数になるのですか?
- シミュレーションの段階で結構時間がかかってしまっていて、実機で試していない
- 全数チェックでもしているのですか?
- はい。
- 直線近似のところをまだ正しく作れていないので、今の所faddやfmulに投げている
- あ、finvやfsqrtの中でfaddやfmulのコンポーネントを使っているのですか?
- はい
- シミュレータ上で動いていて、実機上では面白画像が出る
- 線が飛んでしまう所があるのと、床がおかしいのが目下の謎。
- fadd, fmul, finv以外は全部ソフトウェア実装しているので、どこがバグっているのだろう
- シミュレータ: 浮動小数点数演算のデバッグ出力ができるようにした
- FPU: finvの精度を2ulp以内にした
質疑
- コア係さんどんな感じでデバッグを進めていらっしゃいますか
- シミュレータ係さんのおかげでFPUがどんな計算をしているか出してくれるようになったので、それを見て、コアがおかしいということになったら動こうと思っています。
- FPUやソフトウェア実装のfinv/fsqrtは全数調査したのですか?
- finvは全数チェックしました
- faddかfmul、あるいは比較命令かもしれませんね
- -0と0……いや関係ないかな
- FPUのテスト的にはどのくらいのものを今までしましたか
- faddとfmulが、非正規化数がきたら0にするなどの処理が不十分なので、その可能性を考えている。
- 2ndコンパイラが大体できた。床がちょっとおかしい
- 2ndシミュレータとアセンブラができた
質疑
- バグの原因、xorがバグっているとか?
- 試験があるので進捗ほぼ無し
- 2ndどうするかもあまり決まっていない
質疑
- 2ndはどういう感じで伸ばすとか予定はありますか
- 全然考えていないです
- たとえばどんな感じに伸ばすとか考えていますか
- 正直ちょっとコア係にまかせていて(コア係が出席していない)
- FPU: サイクルアキュレートシミュレータでfib 7が動く
- コンパイラ: 新しいレジスタアロケーションアルゴリズムの高速化
質疑
- 年末年始はどこか行かれていたのですか
- どこかに行ったわけでもなければ地下にいたわけでもないようです
- 真レジスタアロケーションアルゴリズムとは
- 干渉グラフベースで実装したかっただけです。
- 2ndの命令セットだとmin-camlのレジスタアロケーションで扱いにくいなと感じたので新しいものを作りました。
- どういう点でmin-camlだとまずかったのですか?
- 命令内での依存関係を扱いにくかったんです
- x86の命令セットみたいに。入力と出力が同じレジスタに割り振られていた場合など。
- コア
- スーパーすからをちょっと強化した。
- 77MHzで24.9秒
- シミュレータが5倍速くなった
- if文の連鎖をswitchにした
- -O3にした
- 50秒ほどだったのが11秒になった
質疑
- スマートエクスプローラ(8連ガチャ)とか使ってみましたか
- 使おうとはしました
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment