パフォーマンスを向上するには、最適化するアプリケーションの特性を識別することから開始します。次の表は、いくつかの一般的なアプリケーションの特性をリストし、パフォーマンスに影響を与える可能性のある問題と推奨する解決方法を示します。これらの手法は多くの場合に役立ちます。これらの手法を使用する鍵は経験です。
推奨する手法により達成できるパフォーマンス向上の可能性は、「影響」カテゴリーに示されています。アプリケーションやコードの設計に関する問題の場合は、示されたパフォーマンスの向上を達成できないこともあります。しかし、ここで示されている影響は一般的に正しいものです。「影響」カテゴリーは、推奨する手法を実行する前と比較して、どの程度パフォーマンスが向上するかを、次の 4 段階で示しています。
最高: 50% ~
高: ~ 50%
中: ~ 25%
低: ~ 10%
次の表は、アプリケーションの特性、および最も影響を与える手法の順に記述されています。
アプリケーションの特性 |
影響 |
推奨する手法 |
---|---|---|
テクニカル・アプリケーション |
||
ループの多いコードを含むテクニカル・アプリケーション |
高 |
テクニカル・アプリケーションとは、ループの入れ子で合計 CPU サイクルの大部分を消費する関数のサブセットを含むプログラムです。 -O3 (Linux* および Mac OS* X) または /O3 (Windows*) を使用してターゲットのループを入れ子し、ループ変換やプリフェッチを有効にします。 高レベルの最適化 (HLO) レポートを使用して、コンパイラーがどの HLO 最適化を選択したかを確認します。 「HLO レポート」を参照してください。 |
(上記と同じ) |
高 |
-O2 と -O3 (Linux)、/O2 と /O3 (Windows) の場合、SWP レポートを使用して、鍵となるループでソフトウェアのパイプライン化が発生したかどうか、発生しなかった場合はその理由を判断します。 次のような場合、ソフトウェアのパイプライン化を許可するようにコードを変更できます。
|
(上記と同じ) |
高 |
使用できるオプションについては、「ベクトル化の概要」および「自動ベクトル化」セクションの残りのトピックを参照してください。 コードの変更に関する詳細は、「ベクトル化レポート」を参照してください。 |
(上記と同じ) |
中 |
PGO プロファイルに基づいて他の最適化を行います。 「プロファイルに基づく最適化の概要」を参照してください。 |
多くの正規化されていない浮動小数点値の演算を含むアプリケーション |
最高 |
-fp-model fast=2 (Linux および Mac OS X) または /fp:fast=2 または -ftz (Linux および Mac OS X) または /Qftz (Windows) を試します。パフォーマンスの向上が、浮動小数点演算の精度と再現性に大きく影響することがあります。 コンパイラーでサポートされている浮動小数点オプションの使用についての詳細は、「浮動小数点演算」を参照してください。 |
スパース・マトリクス・アプリケーション |
中 |
(下記の) メモリーポインター一義化に対して推奨する手法を参照してください。 prefetch プラグマまたは prefetch 組み込み関数を使用します。間接配列で異なるプリフェッチ方式を試します。 プリフェッチの使用については、「高レベルな最適化の概要」または「プリフェッチのサポート」を参照してください。 |
サーバー・アプリケーション |
||
分岐中心のコードを含む適切なフラット・プロファイル・サーバー・アプリケーション |
中 |
フラット・プロファイル・アプリケーションとは、単一のモジュールが CPU サイクルを極端に消費しないアプリケーションのことです。 PGO を使用して、コンパイラーに最も頻繁に使用されるパスと関数を知らせます。この結果、インテル® コンパイラーは最適な方法でコードをアレンジできます。 利用可能なアプリケーション上で PGO を使用します。 「プロファイルに基づく最適化の概要」を参照してください。 |
大規模なサーバー・アプリケーション |
低 |
-O1 (Linux および Mac OS X) または /O1 (Windows) を使用して、アプリケーションを最適化します。ストリームラインを利用可能な最も汎用的な方法でコード化します。 この手法は、生成されるコードの量を減らし、インライン展開を無効にし、スペキュレーションを無効にし、できるだけ多くの命令コードのキャッシュを有効にします。 |
データベース・エンジン |
中 |
-O1 (Linux および Mac OS X) または /O1 (Windows) および PGO を使用して、アプリケーション・コードを最適化します。 |
(上記と同じ) |
中 |
アプリケーション全体に -ipo (Linux および Mac OS X) または /Qipo (Windows) を使用します。 「プロシージャー間の最適化の概要」を参照してください。 |
その他のアプリケーション |
||
複数の場所から呼び出される小さな関数を多く含むアプリケーション |
低 |
-ip (Linux および Mac OS X) または /Qip (Windows) を使用して、単一ソースモジュール内でプロシージャー間のインライン展開を有効にします。 ストリームラインは、関数を呼び出したコードブロック内のコードを複写することで単純な関数の実行をコード化します。これによりアプリケーションのサイズは増加します。 一般的に、大きく複雑な関数はインライン展開しないでください。 「プロシージャー間の最適化の概要」を参照してください。 |
(上記と同じ) |
低 |
-ipo (Linux および Mac OS X) または /Qipo (Windows) を使用して、複数のソースモジュール内と複数のソースモジュール間の両方でプロシージャー間のインライン展開を有効にします。-ip (Linux および Mac OS X) または /Qip (Windows) を使用することでアプリケーションのサイズが増加することがあります。 このオプションを使用すると、発生する拡張プログラムフロー解析により、リンク時間が長くなります。 プロシージャー間の最適化 (IPO) を使用することにより、プログラム全体の解析を実行します。これは、メモリーポインターの一義化に役立ちます。 |
上記にリストされたアプリケーション固有の推奨する手法とは別に、以下の表で示すように、パフォーマンスを向上する、アプリケーション固有、OS/ライブラリー固有、およびハードウェア固有の推奨事項があります。
アプリケーション固有の推奨事項
アプリケーション・エリア |
影響 |
推奨する手法 |
---|---|---|
キャッシュ・ブロッキング |
高 |
-O3 (Linux および Mac OS X) または /O3 (Windows) を使用して、自動キャッシュ・ブロッキングを有効にします。HLO レポートを使用して、コンパイラーがキャッシュ・ブロッキングを自動的に有効にしたかどうかを判断します。有効にならなかった場合、手動キャッシュ・ブロッキングを検討します。 「キャッシュ・ブロッキング」を参照してください。 |
より良いエイリアス解析のためのコンパイラー・プラグマ |
中 |
ベクトルの依存性を無視します。ivdep およびその他のプラグマを使用して、アプリケーションの速度を向上させます。 を参照してください。 |
メモリーポインター一義化コンパイラー・キーワードおよびオプション |
中 |
restrict キーワードと -restrict オプション (Linux および Mac OS X) または /Qrestrict オプション (Windows) を使用して、メモリーポインターを一義化します。 ソースコードで restrict キーワードを使用した場合、コンパイル中に -restrict オプション (Linux および Mac OS X) または /Qrestrict オプション (Windows) を使用する必要があります。 restrict キーワードとオプションを使用する代わりに、次のコンパイラー・オプションを使用します。
|
軽量なメモリー参照の一貫性を保証するコードを生成 |
低 |
一部のアプリケーションは、volatile 属性を使用してメモリー操作を保証します。ハードウェアで積極的なメモリー・オーダリングを行う必要はありません。 IA-64 アーキテクチャー:
|
算術関数 |
低 |
単精度データ型に float 組み込み関数 (例えば、sqrt() ではなく sqrtf()) を使用します。 ユーザーコードの代わりにマス・カーネル・ライブラリー (MKL) を呼び出します。 (最適化を有効にする) ユーザーコードの代わりに F90 組み込み関数を呼び出します。 |
アセンブリー・コードで関数を呼び出す代わりに組み込み関数を使用 |
低 |
インテル® コンパイラーは組み込み関数をインクルードします。これらの組み込み関数を使用してコードを最適化します。コンパイラーの組み込み関数を使用することで、コードの移植性を高めつつ、アプリケーションのパフォーマンスを向上できます。 |
OS/ライブラリーの推奨事項
エリア |
影響 |
説明 |
---|---|---|
ライブラリー関数 |
低 |
IA-64 アーキテクチャーのシステムのみ。setjump 関数を使用している場合、setjmp の代わりに _setjmp を使用して、setjmp バッファーに保存される浮動小数点状態の量を減らすことを検討します。 |
シンボル・プリエンプション |
低 |
Linux のシンボル・プリエンプション・モデルは、Windows よりもパフォーマンスに影響を与えます。Linux はフル・プリエンプションを使用しています。Windows はプリエンプションを使用していません。-fminshared -fvisibility=protected を使用します。 「シンボルの可視属性オプション」を参照してください。 |
メモリーの割り当て |
低 |
サードパーティーのメモリー管理ライブラリーを使用すると、広範囲なメモリー割り当てが必要なアプリケーションのパフォーマンス向上に役立ちます。 |
ハードウェア/システムの推奨事項
コンポーネント |
影響 |
説明 |
---|---|---|
ディスク |
中 |
ハードドライブへの格納手法をより高度なものにします。例えば、IDE の代わりに SCSI を使用します。 適切な RAID レベルを使用します。 システムのハードドライブの数を増やします。 |
メモリー |
低 |
システムのメモリーを増やすと、パフォーマンスが向上します。例えば、4 つのメモリースロットのうち 2 つのスロットにしかメモリーをセットしていない場合、残りの 2 つのスロットにメモリーを増設することで、パフォーマンスが向上します。 |
プロセッサー |
|
多くのアプリケーションでは、パフォーマンスはプロセッサーの速度、プロセッサーの数、プロセッサーのコアの種類、およびキャッシュサイズに直接影響されます。 |