8.6 VM profiler

VM プロファイラーは、 VM 命令シーケンスの実行カウントと出現カウントを取得するように設計されており、 これらのカウントはスーパー命令(superinstructions)としてシーケンスを選択するために使用できます。 VM プロファイラーは、 おそらくインタプリタ・システム(interpretive system)のプロファイリング・ツールとしては役に立ちません。 つまり、VM プロファイラーは開発者にとっては役立ちますが、 インタプリタ・システム(interpretive system)のユーザーにとっては役に立ちません。

プロファイラーの出力は次のとおりです: 各基本ブロック(少なくとも 1 回実行される)について、その基本ブロックとそのすべてのサブシーケンスの動的実行回数を出力します。 例:

       9227465  lit storelocal 
       9227465  storelocal branch 
       9227465  lit storelocal branch 

これは、 ‘lit storelocal branch’ で構成される基本ブロックは 9227465 回実行されるということを示しています。

この出力をさまざまな方法で組み合わせることができます。 たとえば、 vmgen-ex/stat.awk は、 動的実行(dynamic execution)や、静的発生(static occurence)や、 プログラムごとの発生を参照して、 指定のシーケンスの発生を合計します。 例:

      2      16        36910041 loadlocal lit 

これは、 シーケンス ‘loadlocal lit’ が 2 つのプログラムの 16 か所で発生し、 36910041 回実行されたことを示します。 これで、 スーパー命令(superinstructions)を任意の方法で選択できるようになりました(注意: コンパイルの時間制約と空間的制約により、 スーパー命令の数は通常 100 ~ 1000 に制限されることに注意してください)。 これを完了すると、 vmgen/seq2rule.awk によって、 上記形式行が Vmgen 入力ファイルにインクルードできるルールに変換されます。 このスクリプトではすべてのプレフィックスが定義されていることは保証されないため、 プレフィックスは他の方法で定義する必要があることに注意してください。 したがって、 プロファイルをスーパー命令(superinstructions)に変換するための全体的なスクリプトは以下のようになります:

awk -f stat.awk fib.prof test.prof|
awk '$3>=10000'|                #select sequences
fgrep -v -f peephole-blacklist| #eliminate wrong instructions
awk -f seq2rule.awk|            #turn into superinstructions
sort -k 3 >mini-super.vmg       #sort sequences

ここでは、 動的カウント(dynamic count)がシーケンスの選択に使用されます(ただし、 暫定的な結果では、 静的カウントの方が良い結果が得られることを示しています)。 3 行目は、 スタックに直接アクセスするため、 スーパー命令内で発生してはいけない命令を含むシーケンスを削除します。 動的なカウント選択により、 より長いシーケンスのすべてのサブシーケンス(プレフィックスを含む)が確実に発生します(サブシーケンスは少なくとも長いシーケンスと同じカウントを持つため)。 最後の行でのソートにより、 プレフィックスの後ろで長いスーパー命令が確実に発生するようになります。

ただし、 これを使用する前に、 あなたにはプロファイラーが必要です。 Vmgen は file-profile.i を生成することでその作成をサポートします。 ほぼそのまま使用できるラッパー・ファイル vmgen-ex/profile.c も必要です。

プロファイラーは、すべての VM 制御フロー変更のターゲットを(実行中は SUPER_END を通じて、 フロント・エンドでは BB_BOUNDARY を通じて)記録し、(SUPER_END を通じて)ターゲットにされた変更の頻度をカウントすることによって機能します。 プログラムの実行後、 各 VM 基本ブロックが正しいカウントになるように数値が修正され(分岐を実行せずにブロックに入ってもカウントは増加しないという点を修正します)、 すべての基本ブロックのサブ・シーケンスが出力されます。 これらすべてを取得するには、 SUPER_END (および BB_BOUNDARY) を適切に定義し、 file にプロファイルを出力するときに vm_print_profile(FILE *file) を呼び出すだけです。

file-profile.i は逆アセンブラー・ファイルに似ており、vmgen-ex/profile.c で定義された変数と関数に加えて、 VM 逆アセンブラー用すでに定義されている VM_IS_INST を使用します(see VM disassembler)。