2009-04-04

PGOは64ビットでも有効なのか?

ご存じの通り (なのか?)、Firefoxでは、PGO (Profile-Guided Optimization) を有効にした状態で正式版はリリースされている。PGOというのは、最初のコンパイル時にプロファイルを作成できるようにコンパイルして、その後、実際の動作状態のデータをとって、その後再度コード生成をすることで、コードにおけるさらなる最適化を進めるものだ。なので、複数のオブジェクトファイルやライブラリに渡っていたものでも、インライン化などを通じてコードの高速化に寄与する。

これは、x86だと、FASTCALL以外は、引数の受け渡しにスタックを利用するので、x86だと高速化に寄与できるし、Itaniumの場合は、汎用レジスタの数が膨大なので高速化できるだろう。ただ、x64 (AMD64, EM64T) の場合は、どうだろうか?。汎用レジスタの数は増えているから、当然最適化しやすいが。

実際、ここにMicrosoftの資料がある。

http://msdn.microsoft.com/ja-jp/library/aa289170%28VS.71%29.aspx

このデータをみると興味深いのだけど、Itaniumは非常に高速化に寄与するみたいだ。コンパイラで最適化を図ってくれ!というアーキテクチャなので、当然といえば当然か。

最近Visual Studio 2008 Professionalを手に入れたので、SunSpiderでFirefoxのテスト。これがデータ (x64なので、JITは有効ではない)。

Firefox trunk w/o PGOFirefox trunk w/ PGO
5510.6ms5174.8ms6% faster

ちょっとは早くなるけど、ベンチマーク上はそれほどでもないんだよね。。。

1 件のコメント:

さんのコメント...

> …その後再度コード生成をすることで、コードにおけるさらなる最適化を進めるものだ。なので、複数のオブジェクトファイルやライブラリに渡っていたものでも、インライン化などを通じてコードの高速化に寄与する。

前半は /LTCG:PGI → /LTCG:PGO 等の場合の話で、後半は :PGI や :PGO を使わなくても /LTCG であればできる話だと思います。
それを「なので」でつなぐのは、違うのではないでしょうか。