• JITコンパイル後の動作
JITコンパイラ [55, 90] はJavaメソッドの実行頻度の履歴を実行時に取得し、頻繁に実行 されるJavaメソッドをコンパイルして機械語に変換する。JITコンパイル時に、頻度別 ヒープ指定情報の問い合わせを行なうが、その際に機械語として頻度指定のコードを埋 め込む。そのため、JITコンパイル後に頻度別ヒープ指定情報の問い合わせは行なわず、
余分な処理時間は必要としない。
6.7.4 頻度別割当により期待される効果
ここまで説明してきた処理により、ホットオブジェクトは連続したヒープ領域に割り当てられる。
このことによる効果は2つある。
(1)初期参照ミスの減少
初期参照ミス(compulsory miss、cold start miss)とは、キャッシュラインを最初にアクセ スする時に起こるミスである[91]。頻度別割当により、同時に使用されるオブジェクト が同じキャッシュライン内に入る可能性が高くなり、初期参照ミスの減少が期待できる。
(2)競合性ミスおよび容量性ミスの減少
競合性ミス(conflict miss、collision miss)とは、同じインデクスをもつ異なるキャッシュラ インにアクセスすることで起こるミスであり、容量性ミス(capacity miss)とは、キャッ シュしたいライン数がキャッシュ容量を上回ることで起こるミスである[91]。頻度別割当 により、ホットオブジェクトを含むキャッシュラインの入れ替えが減り、競合性ミスおよ び容量性ミスの減少が期待できる。
以降、ベンチマークによる評価により、これらの効果を実証する。
6.8. 動的データ配置技術のマイクロベンチマークによる評価 105
表 5: マイクロベンチマークの実行環境
ワークステーション IBM IntelliStation M-Pro、2 GBメモリ搭載、Intel Xeon 3 GHz
× 1プロセッサ、hyperthreading機能使用
オペレーティングシステム Microsoft Windows XP Professional Version 2002 Service Pack 1
イベント計測ソフトウェア Intel VTune Performance Analyzer Version 7.0
表 6: Xeonプロセッサのデータキャッシュ構成
キャッシュ種別 サイズ/数 方式 ラインサイズ
L1データキャッシュ 8KByte 4ウェイセットアソ シアティブ
64Byte L2ユニファイドキ
ャッシュ
512KByte 8ウェイセットアソ
シアティブ
128Byte
DTLB 64エントリ 4ウェイ完全アソシ アティブ
—
オブジェクトを割り当てるメソッドを呼び出し、ホットオブジェクト及びコールドオブジェ クトをヒープ領域上に交互に割り当てる。オブジェクトを割り当てる時間はベンチマー クの実行時間には含まれない。
(2)オブジェクトへのアクセス
オブジェクトをアクセスするメソッドを呼び出し、実行時間を計測する。各作業スレッドが、
ホットオブジェクトとコールドオブジェクトの読み出しを行なう。各作業スレッド間で ホットオブジェクト及びコールドオブジェクトは共有されない。作業スレッドは指定回 数ホットオブジェクトとコールドオブジェクトのアクセスを繰り返す。各作業スレッド 内のホットオブジェクト及びコールドオブジェクトのアクセスには時間的局所性がある。
(3)集計
全ての作業スレッドが終了したら、メインスレッドが作業スレッドの実行時間を集計する。
6.8.2 マイクロベンチマークの実行環境
表5にマイクロベンチマークの実行環境を示す。
本評価で使用したIntel Xeonプロセッサにおけるデータキャッシュ構成を表6に示す[92]。
Xeonのデータアクセス時間は、L1キャッシュヒット時を1とすると、L1ミスヒット時は約9、L2 ミスヒット時には約200かかることが報告されている[93]。
1024 1024+
15 3 6 15 3 6+
2048
2048 + 25 60
25 60+
3 07 2 3 07 2+
3 5 8 4 3 5 8 4+
4096 4096+
number of objects per one thread 0%
2 % 4 % 6 % 8 % 1 0%
1 2 %
miss ratio
L 1 C ache L oad M i sses L 2 C ache L oad M i sses D T L B L oad M i sses
図52: キャッシュミス率の減少.
6.8.3 マイクロベンチマークによる評価
頻度別割当を用いた場合のベンチマークの性能向上及びキャッシュミス率の減少を測定した。
キャッシュミス率と性能向上の関係を調べるため、作業スレッドの数を8に固定し、スレッドあた りのオブジェクトの数を1024から4096まで変化させた。
オブジェクトサイズは128ByteでありキャッシュラインにL2キャッシュのキャッシュラインに収 まるぎりぎりのサイズである。
なお、前述のように、現在の頻度別割当VMにおいてはガーベジコレクション時には頻度別の扱 いは考慮していない。従って、評価時にはガーベジコレクションが発生しないようにヒープの新世 代領域を充分大きく設定した。
図52にマイクロベンチマークでのキャッシュミス率の測定結果を示す。図52中、x軸の数値は オブジェクト数を示し、y軸はキャッシュミス率を示す。オブジェクト数の後の“+”記号は頻度別 割当VMを使用した場合の値であり、“+”記号が無いものはノーマルのVMにおける値である。
全てのオブジェクト数において、頻度別割当により、L1キャッシュミス率が約10%から約3〜4%へ と、5〜6%減少している。これは、頻度別割当によって同じL1キャッシュライン内のアクセスの局 所性が創り出された効果である。このような局所性が創出されたのは、ホットオブジェクトを生成 する順番と、ホットオブジェクトをアクセスする順番が同じであるためである。頻度別ヒープを指 定しても、依然3〜4%程度のL1キャッシュミス率が見られるのは、アクセスされるホットオブジェ クト全体がL1キャッシュ(8KB)には納まらないためである。
一方、頻度別ヒープを指定しない場合のL2キャッシュミス率は1024〜1536オブジェクトではほ
ぼ0%であるが、2048オブジェクトから徐々に上昇し、3072〜4096オブジェクトではほぼ8%に達
する。頻度別割当によってL2キャッシュミス率は1%以下に減少する。これは、1スレッドがアク セスするホットオブジェクト全体がL2キャッシュ(512KB)に収まるためである。
DTLBミス率は、約1%とL1キャッシュミス率やL2キャッシュミス率に比べて小さく、今回の実 験の範囲内では変化が見られなかった。
6.8. 動的データ配置技術のマイクロベンチマークによる評価 107
0 2 4 6 8 10
4096 3584
3072 2560
2048 1536
1024
speedup ratio [times]
number of objects for one thread
図53: 性能向上率(8スレッドの場合)
図53は、ノーマルのJavaVMでの性能に対して、頻度別割当を行なった場合の高速化率を示す。
1024〜1536オブジェクトでは約20%の高速化が見られる。2048オブジェクトでは約2倍、2560
オブジェクトでは約3倍の高速化が見られ、3072〜4096オブジェクトでは約9〜10倍の高速化が観 測された。
図52のキャッシュミス率との対応から、5〜6%のL1キャッシュミス率の減少によって約20%の 高速化が得られ、8%のL2キャッシュミス率の減少によって約9〜10倍の高速化が得られることが わかる。L2キャッシュミス率の減少によって非常に大きな高速化率が得られた理由は2つ考えられ る。第一には、L1キャッシュとL2キャッシュの速度比に比べて、L2キャッシュと外部メモリの速 度比が非常に大きいことから、L2キャッシュミスのペナルティが相対的に大きいことである。第二 には、頻度別割当によって作業スレッドがアクセスするデータが全てL2キャッシュに収まったこと である。
ただし、本ベンチマークの負荷は人工的なものである。オブジェクトのアクセス以外の計算を殆 ど行わない。また、ホットオブジェクトをアクセスする最内ループでは、各ホットオブジェクトは 一度しかアクセスされない。従って、頻度別ヒープを指定しない場合、極端なケースでは、ホット オブジェクトをアクセスする度にキャッシュミスが発生する。
現実的なプログラムでは、一箇所のオブジェクト割り当てで生成されるオブジェクトの局所性が、
全体のキャッシュミス率をここまで大きく変化させることは少ないであろう。しかし、L2キャッシュ ミス率の減少は、非常に僅かであっても無視できない性能向上につながる可能性がある。