F    -om および cord によるプログラムの最適化

この付録では,cc コマンドの -om および -cord オプションを使用してプログラムを最適化する方法について説明します。 -om はポストリンク最適化を実行します。 -cord は,実行可能プログラムやシェアード・ライブラリ内のプロシージャを再編成して,キャッシュの効率を改善します。

注意

cc コマンドの -om および -cord オプションは,制御しやすく最適化の効率も良い spike ツール (10.1.3 項 を参照) に置き換えられています。 最適化とプロファイリング技術についての詳細は,それぞれ 第 10 章第 8 章 を参照してください。

この付録の内容は,次のとおりです。

F.1    -om ポストリンク最適化プログラムの使用

cc コマンドの -om オプションを使用することによって,ポストリンク最適化を実行することができます。 -om の概要を F.1.1 項 で説明します。 フィードバック・ファイルと一緒に -om を使用してプロファイル主導の最適化を行う方法については,F.1.2 項 で説明します。

F.1.1    概要

-om ポストリンク最適化プログラムは,以下のコード最適化を実行します。

-om オプションを単独で使用すると,全範囲にわたるポストリンク最適化を実行することができます。 -om の後に次のいずれかのオプションを付けて指定すると,特定のポストリンク最適化を実行できます (詳細は cc(1) を参照してください)。

-WL, -om_compress_lita
-WL, -om_dead_code
-WL, -om_feedback
-WL, -om_Gcommon,num
-WL, -om_ireorg_feedback,file
-WL, -om_no_inst_sched
-WL, -om_no_align_labels
-WL, -om_split_procedures

-om オプションは,-non_shared オプションと併用した場合,すなわち実行可能プログラムの場合に最も効率が良くなります。 たとえば次のように指定します。

% cc -non_shared -O3 -om prog.c

-om オプションは,最終的なリンクを行うときに指定しなければなりません。

F.1.2    -om によるプロファイル主導の最適化

pixie プロファイラ ( pixie(1) を参照) は,プロファイル情報を生成します。 このプロファイル情報は,cc コマンドの -om オプションと -feedback オプションで,特定の入力データ・セットによってプログラムに与えられた要求に合わせて,生成される命令シーケンスを調整するために使用されます。 この手法は,実行可能ファイルの場合に最も効果があります。 シェアード・ライブラリの場合は,F.2 節 で説明しているように cord も使用できます。 または -om オプションを省略します。

次の例は,この処理に必要な基本的な 3 つの手順,すなわち,(1) プロファイル主導の最適化に向けてプログラムを準備する,(2) 計測機構付きプログラムを作成して実行し,プロファイリング統計情報を収集する,(3) その情報をコンパイラとリンカにフィードバックして,実行可能コードの最適化に役立てる,という手順を示しています。 後の例では,これらの手順を詳細化して,開発中に行われた変更と複数のプロファイリング実行で得たデータを合わせて調節する方法を示しています。

% cc -feedback prog -o prog -non_shared -O3 *.c  [1]

% pixie -update prog [2]

% cc -feedback prog -o prog -non_shared -om -O3 *.c  [3]
 
 

  1. プログラムが最初に -feedback オプション付きでコンパイルされたときに,拡張された特別な実行可能ファイルが作成されます。 これには,コンパイラが実行可能ファイルをソース・ファイルに対応させるために使用する情報が含まれています。 また,コンパイラへのプロファイルのフィードバック情報を格納するために後で使用するセクションも含まれています。 このセクションは,最初にコンパイルしたときは pixie プロファイラ (手順 2) がフィードバック情報をまだ生成していないため,空のままです。 -feedback オプションに指定するファイル名は,実行可能ファイルと同じ名前にしてください。 この例では prog (-o オプションで指定) です。 特に指定しないかぎり,-feedback オプションでは -g1 オプションが適用され,プロファイルに最適なシンボルが付けられます。 -On オプションを試して,対象のプログラムとコンパイラで実行時性能が最高になる最適化のレベルを調べてください。 [例に戻る]

  2. pixie コマンドは,計測機構付きプログラム (prog.pixie) を作成して,それを実行します (prof オプション,-update が指定されているため)。 実行の統計情報とアドレスのマッピング・データは自動的に命令カウント・ファイル (prog.Counts) と命令アドレス・ファイル (prog.Addrs) に収集されます。 -update オプションにより,このプロファイル情報は拡張された実行可能ファイルに格納されます。 [例に戻る]

  3. -feedback オプションを指定した 2 度目のコンパイルでは,拡張された実行可能ファイル内のプロファイル情報がコンパイラと (-om オプションを通じて) ポストリンク最適化プログラムを先導します。 このカスタマイズされたフィードバックは,-O3 および -om オプションによる自動最適化よりも優れています。 コンパイラの最適化は,-ifo オプションや -assume whole_program オプションを -feedback オプションと組み合わせて使用すると,さらに効果が上がります。 ただし,10.1.1 項 で述べているように,大きいプログラムはソース・ファイルが 1 つしかない場合と同じようにコンパイルすることができないことがあります。 [例に戻る]

一般的な開発過程では,上記の手順 2 と 3 を必要な回数だけ繰り返して,ソース・コードの変更による影響が反映されるようにします。 たとえば次のようにします。

% cc -feedback prog -o prog -non_shared -O3 *.c 
% pixie -update prog
% cc -feedback prog -o prog -non_shared -O3 *.c 
[modify source code]
% cc -feedback prog -o prog -non_shared -O3 *.c 
.....
[modify source code]
% cc -feedback prog -o prog -non_shared -O3 *.c 
% pixie -update prog
% cc -feedback prog -o prog -non_shared -om -O3 *.c 

拡張された実行可能ファイル内のプロファイル情報は,コンパイル操作では失われないので,情報を更新する pixie の処理手順は,ソース・モジュールが変更されて再コンパイルされるたびに繰り返す必要はありません。 ただし,変更のたびに,変更内容に応じて,実際のコードと古いフィードバック情報の違いが大きくなるため,最適化の有効度が低下します。 最後の変更および再コンパイルの後に pixie 処理手順を行うと,最後に行ったコンパイルに合わせてフィードバック情報が正確に更新された状態になります。

拡張された実行可能ファイルは,内部にプロファイル情報があるため,通常の実行可能ファイルよりも大きくなります (通常は 3 〜 5 パーセント)。 開発が完了したら,strip コマンドを用いてプロファイル情報とシンボル・テーブル情報を削除できます。 たとえば次のようにします。

% strip prog

プロファイルの正確な情報を得るために,計測機構付きプログラムを異なる入力で複数回実行したい場合があります。 次の例では,プログラム prog の実行を 2 回計測して,そのプロファイル統計情報をマージする方法を示しています。 このプログラムの出力は,異なる入力で実行するたびに異なります。

% cc -feedback prog -o prog -non_shared -O3 *.c [1]

% pixie -pids prog [2]

% prog.pixie [3] 
(input set 1) 
% prog.pixie 
(input set 2) 

% prof -pixie -update prog prog.Counts.* [4]

% cc -feedback prog -o prog -non_shared -om -O3 *.c [5]

  1. 最初のコンパイルでは,上記の例で説明したように拡張された実行可能ファイルが生成されます。 [例に戻る]

  2. 特に指定しなければ,計測機構付きプログラム (prog.pixie) を実行するたびに,prog.Counts という名前のプロファイル・データ・ファイルが作成されます。 -pids オプションを指定すると,計測機構付きプログラムを実行するたびに,作成されるプロファイル・データ・ファイルの名前にプロセス ID が付加されます (つまり,prog.Counts.pid になります)。 したがって,後の実行で生成されるデータ・ファイルで上書きされることはありません。 [例に戻る]

  3. 計測機構付きプログラムは 2 回実行され,そのたびに一意の名前でデータ・ファイルが生成されます。 たとえば,prog.Counts.371prog.Counts.422 のようになります。 [例に戻る]

  4. prof -pixie コマンドは,2 つのデータ・ファイルをマージします。 -update オプションにより,この結合された情報で実行可能ファイル prog が更新されます。 [例に戻る]

  5. 2 回目のコンパイルでは,2 回のプログラム実行で得られたプロファイル情報を結合したものを使用してプロファイル主導の最適化を実行します。 [例に戻る]

F.2    -cord によるプロファイル主導の再編成

cc コマンドの -cord オプションは cord ユーティリティを起動します。 このユーティリティは,実行可能プログラムまたはシェアード・ライブラリ内のプロシージャを再編成して,命令キャッシュの効率を改善します。 アプリケーションを実際に実行して得られたデータを含むフィードバック・ファイルを -cord への入力として使用できますが,これは F.1.2 項 で述べたフィードバック・ファイルとは種類が異なるフィードバック・ファイル (pixie または prof -pixie コマンドで作成) です。 次の例では,フィードバック・ファイルを作成し,そのフィードバック・ファイルを入力として,-cord オプションを使用して実行可能ファイルをコンパイルする方法を示します。

% cc -O3 -o prog *.c  
% pixie -feedback prog.fb prog [1]
% cc -O3 -cord -feedback prog.fb -o prog *.c  [2]

  1. pixie コマンドは計測機構付きプログラムを作成して,それを実行します (prof のオプション -feedback が指定されているため)。 -feedback オプションは,実行の統計情報を収集したフィードバック・ファイル (prog.fb) を作成し,そのファイルは次のステップでコンパイラが使用します。 [例に戻る]

  2. cc コマンドの -feedback オプションは,フィードバック・ファイルを入力として受け入れます。 -cord オプションは cord ユーティリティを呼び出します。 [例に戻る]

フィードバックを使用してシェアード・ライブラリをコンパイルする方法も同様です。 最適化を最も必要とするライブラリ・コードを動作させる 1 つ以上のプログラムでシェアード・ライブラリのプロファイルを行います。 たとえば,次のようにコマンドを実行します。

% cc -o libexample.so -shared -g1 -O3 lib*.c [1]
% cc -o exerciser -O3 exerciser.c -L. -lexample [2]
% pixie -L. -incobj libexample.so -run exerciser [3]
% prof -pixie -feedback libexample.fb libexample.so exerciser.Counts [4]
% cc -cord -feedback libexample.fb -o libexample.so -shared -g1 -O3 lib*.c [5]
 
 

  1. -g1 オプションを使用してシェアード・ライブラリをコンパイルし,ソース行ごとのフィードバック・データが得られるようにします。 [例に戻る]

  2. ライブラリの重要な部分を動作させるプログラムを作成します。 [例に戻る]

  3. シェアード・ライブラリとプログラムに計測機構が付加され,プロファイリングするために実行されます。 [例に戻る]

  4. シェアード・ライブラリについてのみ,フィードバック・ファイルが作成されます。 [例に戻る]

  5. プロファイルによって最も多く使用されていることが示されたコードの性能を最適化するために,シェアード・ライブラリの再コンパイル,再リンク,再編成を実行します。 [例に戻る]

同じ最適化レベルで作成されたフィードバック・ファイルを使用してください。

フィードバック・ファイルを作成して,-non_shared オプションを用いてプログラムをコンパイルする場合は,フィードバック・ファイルに対して -cord オプションよりも -om オプションを使用する方が有効です。

また,cordruncord ユーティリティとともに使用することもできます。 詳細は, pixie(1)prof(1)cord(1)runcord(1) を参照してください。