ソースコード上のガイドラインを実施することで、ランタイム・パフォーマンスを向上させることができます。ランタイム・パフォーマンスをどの程度向上できるかは、文が実行される回数に関連します。例えば、ループ内で多数回実行される算術式を改善すると、ループ外で 1 回実行される同様の式を改善するよりも、パフォーマンス向上の可能性が高くなります。
32 ビットよりも小さな整数または論理データを使わないようにしてください。16 ビット (または 8 ビット) データ型へアクセスすると、データアクセスの効率性が低下します。特に Itanium® ベース・システムでは、その傾向は顕著となります。
配列データの格納領域とメモリ・キャッシュ・ミスを最小限にするには、64 ビットデータでなく 32 ビットデータを使用します。ただし、8 バイト整数より広い数値範囲や、倍精度浮動小数点数より広い範囲と精度を必要とする場合を除きます。
整数および浮動小数点 (REAL) データを同一の計算に混在させないようにします。浮動小数点算術式 (代入文) のすべての数を浮動小数点値として表現することで、固定形式と浮動小数点形式間のデータ変換が不要となります。また、整数算術式のすべての数を整数値として表現することにも、同様の利点があります。これによってランタイム・パフォーマンスは向上します。
例えば、I と J が共に INTEGER 変数である場合、定数 (2.) を整数値 (2) として表現することで、データを変換する必要がなくなります。
非効率的なコード:
INTEGER I, J
I = J / 2.
効率的なコード:
INTEGER I, J
I = J / 2
1 つの式でサイズの異なる同じ汎用データ型を使用しても、ランタイム・パフォーマンスには最小限の影響しかないか、まったく影響がない場合もあります。例えば、同じ浮動少数点算術式で、REAL、DOUBLE PRECISION、COMPLEX 浮動少数点数を使用しても、ランタイム・パフォーマンスへの影響は最小限か、あるいは、皆無です。
変数に複数のデータ型が使える場合、次の順序に従ってデータ型を選択してください。 ここに示す順序は効率の高い順にリストされています。
整数 (上記の例も参照)
単精度実数で、明示的に REAL、REAL (KIND=4)、または REAL*4 と示したもの
倍精度実数で、明示的に DOUBLE PRECISION、REAL (KIND=8)、または REAL*8 と示したもの
拡張精度実数で、明示的に REAL (KIND=16) または REAL*16 と示したもの
ただし算術式では、整数データと浮動小数点 (REAL) データを混在させないようにしてください (前項の例を参照)。
実行速度の遅い算術演算子を避けるためにコードを修正する前に、最適化によって、多数の低速な算術演算子が高速の算術演算子に変換される可能性があることに注意してください。例えば、コンパイラの最適化により、式 H=J**2 は H=J*J に変換されます。
さらに、低速な算術演算子を高速の算術演算子に置き換えることによって、結果の精度が変わったり、またソースコードの保守性 (読み易さ) に影響が生じることがないかどうかを考慮する必要もあります。
低速な算術演算子を高速な算術演算子へ置き換えるのは、重要なコード部分については必要な場合のみ行います。次に、インテル® Fortran 算術演算子を高速のものから順に示します。
加算 (+)、減算 (-)、浮動小数点乗算 (*)
整数乗算 (*)
除算 (/)
べき乗 (**)
EQUIVALENCE 文は使わないようにします。EQUIVALENCE により、次のような状況が発生します。
アライメントされないデータや、自然境界にまたがるデータを生じさせます。
次に示すようないくつかの最適化を妨げます。
特定の条件下でのグローバル・データ解析 (「-On オプションによる最適化の設定」の -O2 を参照)
EQUIVALENCE 文に制御変数が含まれている場合の暗黙的な DO ループコラプス
インテル Fortran コンパイラは、コンパイル時に、使用されているサブプログラムの定義にアクセスできる場合、サブプログラムのインライン化を行うことがあります。文関数および内部サブプログラムを使用することで、インライン化されるサブプログラム参照数が最大になります。特に多数のソースファイルを最適化レベル -O3 で、まとめてコンパイルする場合に効果があります。
詳細は、「効率的なコンパイル」を参照してください。
可能な限り DO ループ内の算術演算や他の演算は最小限に抑えます。不要な演算をループの外に移動することによって、パフォーマンスが向上します (例えば、ループ中の中間不変値が不要な場合など)。
ループの最適化についての詳細は、「Itanium® ベース・アプリケーションのパイプライン化」 および 「ループのアンロール」を参照してください。インテル Fortran 文の構文については、『Intel® Fortran Language Reference』(英語) マニュアルを参照してください。