[論文レビュー] BOLT: A Practical Binary Optimizer for Data Centers and Beyond
BOLT は、LLVM 上に構築されたポストリンクバイナリーオプティマイザーであり、コードレイアウト最適化に正確なサンプルベースのプロファイリングを活用することで、大規模なデータセンターアプリケーションのパフォーマンスを向上させる。本手法は、本番ワークロードで最大 8.0% の高速化を達成し、GCC や Clang のようなコンパイラでは最大 20.4% の高速化を実現する。これは、フィードバック駆動型最適化やリンクトイム最適化と組み合わせても同様に有効であり、ポストリンク最適化が初期段階の最適化を置き換えるものではなく、補完的であることを示している。
Performance optimization for large-scale applications has recently become more important as computation continues to move towards data centers. Data-center applications are generally very large and complex, which makes code layout an important optimization to improve their performance. This has motivated recent investigation of practical techniques to improve code layout at both compile time and link time. Although post-link optimizers had some success in the past, no recent work has explored their benefits in the context of modern data-center applications. In this paper, we present BOLT, a post-link optimizer built on top of the LLVM framework. Utilizing sample-based profiling, BOLT boosts the performance of real-world applications even for highly optimized binaries built with both feedback-driven optimizations (FDO) and link-time optimizations (LTO). We demonstrate that post-link performance improvements are complementary to conventional compiler optimizations, even when the latter are done at a whole-program level and in the presence of profile information. We evaluated BOLT on both Facebook data-center workloads and open-source compilers. For data-center applications, BOLT achieves up to 8.0% performance speedups on top of profile-guided function reordering and LTO. For the GCC and Clang compilers, our evaluation shows that BOLT speeds up their binaries by up to 20.4% on top of FDO and LTO, and up to 52.1% if the binaries are built without FDO and LTO.
研究の動機と目的
- コードの局所性が悪く、キャッシュ や分岐予測器などのハードウェア構造に負荷がかかる大規模で複雑なデータセンターアプリケーションにおけるパフォーマンスのボトル neck を解消すること。
- ポストリンクバイナリーオプティマイゼーションが、実世界のワークロードにおいて、従来のコンパイル時およびリンクトイムのフィードバック駆動型最適化(FDO)を上回るか、あるいはそれを補完できるかどうかを検討すること。
- バイナリレベルでのサンプルベースプロファイリングが、中間表現にプロファイルデータを再マッピングする必要があるコンpilerベースのアプローチよりも、コードレイアウトの精度を高められることを示すこと。
- LLVM インfraストラクチャに統合可能で、生産ワークロードにスケーラブルな、実用的でオープンソースの、再ターゲティング可能なバイナリーオプティマイザーを構築すること。
- FDO や LTO といった既存の最適化と組み合わせた場合の BOLT のパフォーマンス向上を、孤立した状態と組み合わせた状態の両方で評価すること。
提案手法
- BOLT は、完全にリンクされたバイナリに対してポストリンク最適化を実行する。実行時のプロファイルデータを本番ワークロードから収集し、そのデータをもとにコードレイアウト最適化を実施する。
- ハードウェアパフォーマンスカウンタからの低レベルのプロファイリング情報(LBR(Last Branch Record)データを含む)を活用することで、バイナリレベルで細分化された正確な実行プロファイルを取得する。
- 関数呼び出し頻度や実行のホットネスといった、プロファイル駆動のヒューリスティクスに基づいて、関数や基本ブロックを再配置することで、命令キャッシュや分岐予測器の効率を向上させる。
- LLVM イフラストラクチャ上に実装されているため、複数の命令セットアーキテクチャにわたる再ターゲティングが可能であり、既存のコンパイルパイプラインと統合できる。
- 静的バイナリ解析を実施して、機械語から制御フローやデータフロー情報を再構築することで、ソースコードや中間表現がなくても正確なレイアウト意思決定が可能になる。
- インクリメンタルなデプロイメントをサポートしており、変更の加えられていないバイナリで動作するため、運用上のオーバーヘッドを最小限に抑え、本番環境での利用が可能になる。
実験結果
リサーチクエスチョン
- RQ1中間表現にプロファイルデータを再マッピングする必要がなくなるため、バイナリレベルでのプロファイリングにより、コンpilerベースの FDO よりもコードレイアウトの精度が向上するかどうか。
- RQ2大規模なアプリケーションにおいて、ポストリンク最適化が、既存のフィードバック駆動型最適化やリンクトイム最適化と重複するのではなく、どの程度補完的であるか。
- RQ3FDO や LTO を既に使用している高度に最適化されたバイナリに、ポストリンクコードレイアウト最適化を適用した場合、どの程度のパフォーマンス向上が得られるか。
- RQ4LBR を用いた細分化されたプロファイリングが、本番バイナリにおける基本ブロックおよび関数の再配置の有効性にどのような影響を与えるか。
- RQ5LLVM 上に構築された実用的で生産環境対応のバイナリーオプティマイザーが、多様な実世界のデータセンターワークロードにおいて、測定可能なパフォーマンス向上を達成できるか。
主な発見
- FDO および LTO の後段に BOLT を適用した場合、Facebook の本番データセンターワークロードで最大 8.0% のパフォーマンス向上を達成しており、すでに最適化済みのバイナリに対しても顕著な向上が見られる。
- GCC や Clang のコンパイラでは、FDO および LTO を適用した上での BOLT の適用で最大 20.4% のパフォーマンス向上が得られ、FDO や LTO を使用しないバイナリでは最大 52.1% の向上が達成された。
- パフォーマンス向上の主な要因は、コードレイアウトの改善であり、特に LBR ベースのプロファイリングを用いた場合、基本ブロックの再配置が関数の再配置よりもより顕著な寄与をしている。
- バイナリレベルでのプロファイル精度により、中間表現にプロファイルデータを再マッピングする必要があるコンpilerベースのアプローチよりも、より良いレイアウト意思決定が可能になる。
- ポストリンク最適化は初期段階の FDO より劣るものではなく、むしろ補完的である。FDO と BOLT を併用することで、単独での使用よりも高いパフォーマンスが得られる。
- LBR の使用は、HHVM における総合的なパフォーマンス向上の約 2% を占めており、低レベルのレイアウト最適化において、細分化されたプロファイリングの価値が示されている。
より良い研究を、今すぐ始めましょう
論文の読解から最終レビューまで、研究時間を劇的に削減しましょう。
クレジットカード登録不要
このレビューはAIが作成し、人間の編集者が確認しました。