"Virtual Machines" 第4章
"Dynamic Binary Optimization"
4.0 - 4.3
新山 祐介

第4章の概要

注意: ここでいう「最適化」とは、 ネイティブに変換されたバイナリの最適化である。

たとえば...

Block A  ...  R3 = ...  R1 = R2 + R3  if (R3==0)      goto L1 Block B  R6 = R1 + R6  ... Block C L1: R1 = 0  ... この分岐が 99%
問. ムダな部分はどこ?

そうすると...

Block A  ...  R3 = ...  R1 = R2 + R3  if (R3==0)      goto L1 Block B  R6 = R1 + R6  ... Block C L1: R1 = 0  ... Block A  ...  R3 = ...  if (R3==0)      goto L1 Compensation  R1 = R2 + R3 Block B  R6 = R1 + R6  ... Block C L1: R1 = 0  ...
→ 99% の確率で 1命令トクする。これが最適化

最適化までの流れ

  1. まずインタプリタで実行、あるいはネイティブに変換して実行。
  2. プロファイル情報を収集。
  3. 最適化する。
  4. 2. へ戻る。

4.1. 最適化が努力に見合うわけ

分岐の偏り・1

分岐の偏り・2

分岐の偏り・3

問. 間接分岐とは何か、説明せよ。

演算結果の偏り

4.1. まとめ

4.2. プロファイリングの各種方法

コンパイラの場合...

VM の場合...

VMプロファイラの種類

ノード・プロファイル

エッジ・プロファイル

問. 上の図で、ブロック D は何回実行されるか。

どうやって実行を記録するか

  1. Instrumentation: 特定の箇所に「カウンタを仕掛ける」
    • ソフトウェアの一部を書き換えて実行する。遅いが正確。
  2. Sampling: とにかく一定時間 / 命令数ごとに測定
    • ハードウェアを使えば速いが、正確さに欠ける。

インタプリタにおける測定

ネイティブ変換後の測定

プロファイリングの問題

4.2. まとめ

4.3. 最適化する

フェッチの効率を上げる

命令キャッシュ
E: goto uncond;
F: ...
F: ...
F: ...

フェッチの効率を上げる

命令キャッシュ
E: goto uncond;
F: ムダ
F: ムダ
F: ムダ

方法1. レイアウトの変更

問. 分岐条件が変わっているのはどこか?

方法2. インライン化


(部分インライン化)
問. インライン化の問題点をあげよ。

"Trace" を使う方法

問. 上のアルゴリズムに従って、trace を作成せよ。

"Trace" を使う方法

"Superblock" を使う方法

Superblock の構築方法

Step 1. 最初のブロックを見つける

問. Start threshold = 100 のとき、該当するブロックはどれ?

Step 2. 続きのブロックを見つける

Step 3. どこかで止める

練習問題

問. Cont. threshold = 50 のとき、Continuation Set を求めよ。
問. フローに従って、Superblock を構築せよ。

Superblock の完成形

Tree Groups

Teh End~~