Facebook は、大規模なアプリケーションを高速化できることを期待して、バイナリ最適化およびレイアウト ツール (BOLT という頭字語に最適化) をオープンソース化しました。
Facebook が実行しているような大規模なアプリケーション用にコンパイルされたコードは、現代の CPU の命令キャッシュに詰め込むには大きすぎる傾向があると、ソーシャル広告帝国のソフトウェア エンジニアである Maxim Panchenko 氏はブログ投稿で説明しています。
その結果、チップはメモリから CPU に命令を移動するのに、かなりの処理時間 (場合によっては 30 パーセント) を費やします。
「一般的に命令枯渇と呼ばれるこの問題に対処するため、バイナリ最適化・レイアウトツールであるBOLTを開発・導入しました」とパンチェンコ氏は語る。「BOLTはメモリ内の命令配置を最適化し、CPU実行時間を2~15%短縮します。」
このLinuxコマンドラインツールは、ClangやGCCなど、様々なコンパイラを使用して作成されたアプリケーションで動作します。これは、Googleが数年前に開発したフィードバック指向最適化ツール「AutoFDO」を補完するように設計されています。
ビルドの合間にQuakeを少しだけ詰め込む?もう無理:FacebookがJavaコンパイルツールを強化
続きを読む
パンチェンコ氏によると、CPU に十分な供給を維持し、分岐予測ミスや負担の大きいバイナリによって発生する可能性のある命令不足を防ぐために、コンパイラのプロファイル ガイド最適化、つまり PGO を採用できる可能性があるという。
このようなプロファイル データを使用すると、アプリケーションを再コンパイルして、CPU キャッシュ アーキテクチャをより有効に活用し、インライン化などの手法をいつ使用するかをより適切に判断できるようになります。
PGOにはいくつかの制限があり、AutoFDOはそれらの問題に対処しようと試みています。しかし、パンチェンコ氏によると、AutoFDOは、FacebookがHackとPHPコード用に開発したHipHop仮想マシン(HHVM)で使用されているC++例外メカニズムと相性が悪いとのことです。
(HHVM は中間バイトコードにコンパイルされ、その後、ジャストインタイム (JIT) コンパイラによってオンザフライで x64 マシン コードに変換されます。この戦略により、静的にコンパイルされたバイナリでは不可能な最適化が可能になります。)
パンチェンコ氏によれば、BOLT により HHVM のパフォーマンスが 8 パーセント向上し、その他のサービスも 2 ~ 15 パーセント向上したという。
「CPU フロントエンドにバインドされた大規模なアプリケーションを実行している場合、つまり、大量の命令キャッシュと TLB ミスが発生する場合、BOLT はこれらのボトルネックの解決に役立ちます」と彼は言います。®