パフォーマンス拡張手法

パフォーマンスを向上するには、最適化するアプリケーションの特性を識別することから開始します。次の表は、いくつかの一般的なアプリケーションの特性をリストし、パフォーマンスに影響を与える可能性のある問題と推奨する解決方法を示します。これらの手法は多くの場合に役立ちます。これらの手法を使用する鍵は経験です。

推奨する手法により達成できるパフォーマンス向上の可能性は、「影響」カテゴリーに示されています。アプリケーションやコードの設計に関する問題の場合は、示されたパフォーマンスの向上を達成できないこともあります。しかし、ここで示されている影響は一般的に正しいものです。「影響」カテゴリーは、推奨する手法を実行する前と比較して、どの程度パフォーマンスが向上するかを、次の 4 段階で示しています。

次の表は、アプリケーションの特性、および最も影響を与える手法の順に記述されています。

アプリケーションの特性

影響

推奨する手法

テクニカル・アプリケーション

ループの多いコードを含むテクニカル・アプリケーション

テクニカル・アプリケーションとは、ループの入れ子で合計 CPU サイクルの大部分を消費する関数のサブセットを含むプログラムです。

-O3 (Linux* および Mac OS* X) または /O3 (Windows*) を使用してターゲットのループを入れ子し、ループ変換やプリフェッチを有効にします。

高レベルの最適化 (HLO) レポートを使用して、コンパイラーがどの HLO 最適化を選択したかを確認します。

「HLO レポート」を参照してください。

(上記と同じ)
IA-64 アーキテクチャーのみ

-O2-O3 (Linux)、/O2/O3 (Windows) の場合、SWP レポートを使用して、鍵となるループでソフトウェアのパイプライン化が発生したかどうか、発生しなかった場合はその理由を判断します。

次のような場合、ソフトウェアのパイプライン化を許可するようにコードを変更できます。

  • 存在しないことを想定していた再帰がレポートで報告された場合、エイリアス問題を解決するか、ループで IVDEP 宣言子を使用します。

  • ループが大きすぎるか、レジスターを使い果たしてしまう場合、ループを手動で、または distribute 宣言子を使用して、より小さなセグメントに分けます。

  • コンパイラーが Global Acyclic Scheduler はより良い結果を生成できると判断した場合でも、ユーザーがループをパイプライン化すべきであると判断した場合、ループで SWP 宣言子を使用します。

(上記と同じ)
IA-32 アーキテクチャーおよびインテル® 64 アーキテクチャーのみ

使用できるオプションについては、「ベクトル化の概要」および「自動ベクトル化」セクションの残りのトピックを参照してください。

コードの変更に関する詳細は、「ベクトル化レポート」を参照してください。

(上記と同じ)

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) および PGO を使用して、アプリケーション・コードを最適化します。

その他のアプリケーション

複数の場所から呼び出される小さな関数を多く含むアプリケーション

-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 およびその他の宣言子を使用して、アプリケーションの速度を向上させます。

「ベクトル化のサポート」を参照してください。

算術関数

単精度データ型に float 組み込み関数 (例えば、sqrt() ではなく sqrtf()) を使用します。

ユーザーコードの代わりにマス・カーネル・ライブラリー (MKL) を呼び出します。

(最適化を有効にする) ユーザーコードの代わりに F90 組み込み関数を呼び出します。

OS/ライブラリーの推奨事項

エリア

影響

説明

シンボル・プリエンプション

Linux のシンボル・プリエンプション・モデルは、Windows よりもパフォーマンスに影響を与えます。Linux はフル・プリエンプションを使用しています。Windows はプリエンプションを使用していません。-fminshared -fvisibility=protected を使用します。

「シンボルの可視属性オプション」を参照してください。

メモリーの割り当て

サードパーティーのメモリー管理ライブラリーを使用すると、広範囲なメモリー割り当てが必要なアプリケーションのパフォーマンス向上に役立ちます。

ハードウェア/システムの推奨事項

コンポーネント

影響

説明

ディスク

ハードドライブへの格納手法をより高度なものにします。例えば、IDE の代わりに SCSI を使用します。

適切な RAID レベルを使用します。

システムのハードドライブの数を増やします。

メモリー

システムのメモリーを増やすと、パフォーマンスが向上します。例えば、4 つのメモリースロットのうち 2 つのスロットにしかメモリーをセットしていない場合、残りの 2 つのスロットにメモリーを増設することで、パフォーマンスが向上します。

プロセッサー

 

多くのアプリケーションでは、パフォーマンスはプロセッサーの速度、プロセッサーの数、プロセッサーのコアの種類、およびキャッシュサイズに直接影響されます。