GCCがデフォルトで構造体のメンバーを並べ替えない理由は知っていますが、構造体の順序に依存するコードを作成することはめったにないので、構造体に自動的に並べ替えられるようにフラグを立てる方法はありますか?
4 に答える
以前の GCC バージョンには、+モードで構造の並べ替えを許可する-fipa-struct-reorg
オプションがあります。-fwhole-program
-combine
-fipa-struct-reorg
構造再編成の最適化を実行します。これは、空間的局所性をより適切に利用するために C のような構造レイアウトを変更します。この変換は、構造体の配列を含むプログラムに影響します。プロファイルベース ( で有効化
-fprofile-generate
) または静的 (組み込みのヒューリスティックを使用) の 2 つのコンパイル モードで使用できます。-fipa-type-escape
この変換の安全性を提供する必要があります。これはプログラム全体モードでのみ機能するため、有効にする必要が-fwhole-program
あります。-combine
この変換によって考慮'cold'
される構造は影響を受けません ( を参照--param struct-reorg-cold-struct-ratio=value
)。
リリース ノートの以下の理由により、GCC 4.8.x 以降は削除されました。
struct reorg と matrix reorg の最適化 (コマンドライン オプション
-fipa-struct-reorg
と-fipa-matrix-reorg
) は削除されました。それらは常に正しく機能するわけではなく、リンク時最適化 (LTO) で機能するわけでもありませんでした。したがって、単一の翻訳単位で構成されるプログラムにしか適用できませんでした。
struct-reorg-branch
ただし、GCC SVNまたはgithub ミラーアウトはまだ開発中であるため、自己責任で試すことができます。
clang-tools-extraの clang- reorder-fieldsツールを使用してフィールドを並べ替えることもできます
こちらもご覧ください
GCC にはそのようなオプションはありません。そして、確かに、それは賢明な方法で紹介することはできません. パディングの最適化については、このディスカッションをご覧ください。
私が知っている唯一の例外は、ホット/コールド構造フィールドの分割です。これは、場合によっては実行できます (それでも、GCC がプロファイル ガイド モードでも実行できるかどうかはわかりませんが、ICC ができることはわかっています)。この機能はユーザー制御下になく、データフローに対するそのような変換の保守性が証明可能なコールグラフで実行されます。
プログラム全体をコンパイルするときに、構造体の要素を再編成/分割することは可能だと思います (lto モード、-flto フラグを使用)。その場合、プログラムの全体像がわかり、エスケープしないシンボルについては、キャッシュの動作を改善するためにそれらを並べ替えることができるはずです。
gcc トランクでは、これは活発に開発中です。これは GNU cauldron 2015 で発表されました。gcc トランクまたは struct-reorg-branch を試してみてください。