FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

マイクロアーキテクチャ・シミュレータのトレースログに必要な情報の解析についての論文を読む (4)

前回の続き:

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com


3.2. 分岐命令

ChampSimは分岐ターゲットバッファ(BTB)を含む比較的詳細なプロセッサ・フロントエンドをモデル化している. ChampSimは異なるタイプの分岐を区別し,分岐命令が読み書きをするレジスタに基づく. 例えば条件分岐は,命令ポインタレジスタを読み書きし,フラグ・レジスタを読み込むが,スタック・ポインタ・レジスタは読み書きしない。

CVP-1 のトレースでは,3 種類の分岐(条件分岐・無条件直接分岐・無条件間接分岐)しか区別できない、 一方,ChampSimは6種類の分岐を区別することができる. そのため,cvp2champsimのコンバータは,CVP-1のトレースからさらに分岐の種類を絞り込み,命令のクラスとレジスタx30(リンク・レジスタ)からの読み書きなどをチェックする.

レジスタx30に書き込む場合はCALL命令,書き込まない場合はJUMP命令となる. これらは,直接命令と間接命令にさらに分類される.

しかし,この変換はいくつかのCALLとRETURNを誤って分類してしまう.

3.2.1. コールスタックの改善: コールスタックを修正する。

オリジナルのcvp2champsimの分岐命令の分類は,分岐命令がレジスタx30を使用していることおよびCVP-1トレース命令内にエンコードされた分岐命令のタイプに基づいている. この場合,レジスタx30を読み書きする分岐を正しく分類することができない. 実際にはCALLであるにもかかわらず,RETURNとして分類されることがある. ほとんどのトレースでは問題ないが,srv_3やsrv_64のようなトレースでは,リターンのターゲット予測率に影響を与える.

そこで,cvp2champsimコンバータを改良し,レジスタx30からの読み出しを行い度のレジスタにも書き込まない無条件分岐のみがReturnとして識別される.

3.2.2. branch-regsの改善: 古い命令との分岐の元の依存関係を維持する。

オリジナルのcvp2champsimは,CVP-1のトレースから命令ポインタ,スタックポインタ,フラグレジスタを適切に設定し,ChampSimが正しく分岐命令の種類を識別できるようにする. しかし,この処理ではCVP-1に存在するオリジナルのソースレジスタは保存されず,これはCVP-1内の汎用のソースレジスタを持つ条件分岐命令(tb(n)z, cb(n)z),間接CALL,間接JUMPに影響する. そして,これらの分岐命令と,そのソースレジスタを生成するProducer命令との依存関係に影響する. これは,待ち時間の長いロード命令に依存する分岐命令の場合,性能に大きな影響を与えてしまう.

分岐予測ミスは,長い待ち時間のロード命令が解決された後にしか修正されずに,分岐予測ミスのペナルティが露呈する. さらに,非結合フロントエンドのプリフェッチ効果が激減し,非結合フロントエンドでBTBミスが頻発すると,性能への悪影響を及ぼす.

そこで,改良されたcvp2champsim コンバータは,CVP-1トレースに存在するレジスタ依存関係をすべて保持し,ソースレジスタを追加する.

具体的には,間接ジャンプとCALLについては,CVP-1のソースレジスタを変換後のソースレジスタとして追加する. 条件分岐については,CVP-1にソースレジスタが存在する場合,変換後の命令にソースレジスタを追加し,フラグレジスタを追加しないようにする. そうでない場合,オリジナルのコンバータの動作に基づく.

ChampSimは,命令ポインタを読み書きし,スタックポインタを書き込まず,フラグを読む命令は条件分岐と対応する. これを,フラグかほかのソースレジスタを読むというように変更する必要がある.

さらに,ChampSimは分岐が間接ジャンプかどうかをチェックするが,この条件は命令ポインタを書き込み,スタックポインタを読み込まず,フラグを読み込み,それ以外を読み込んだ場合である. これは条件分岐の条件と一致してしまうため,間接分岐かどうかを判断するためには,命令ポインタの読み込みが存在するかどうかをチェックする. x86の間接分岐は常に絶対分岐であるため,命令ポインタを読み込まないはずだからである.

3.2.3. flag-regの改良: 欠落フラグの追加:ALU命令およびFP命令のデスティネーションとしてのフラグレジスタの追加 デスティネーション・レジスタを持たない。

AArch64とx86の両方でフラグレジスタは,算術演算と論理演算のステータスに関する情報を含む特別なレジスタである. このフラグ・レジスタによって,分岐すべきかどうかを判断する.

しかし,CVP-1のトレースには命令のソースレジスタと書き込みレジスタとして汎用レジスタしか含まれていないため,分岐命令に関する多くの依存関係が欠落している.

ChampSimは条件分岐は常にフラグレジスタから読みだすと仮定している. オリジナルのcvp2champsimは,条件分岐のソースレジスタとしてChampSimのフラグレジスタを使用している. しかし,フラグレジスタへ書き込む命令が無いためCVP-1のトレースで条件分岐の依存関係が欠落する. そこで,算術演算,論理演算について,書き込みレジスタを持たないすべてのALU命令の書き込みレジスタとしてフラグレジスタを追加する.

これはかなり悲観的な実装であり,SysCall命令がフラグとしてマークされることがあるが,これは比較的まれであり,パイプラインフラッシュを起こすはずであるため大きな影響を会えることはない.