高位変換は、特にループおよび配列言語のパフォーマンスを向上させるための最適化です。 最適化技法には、交換、フューズ、ループ・アンロール、一時配列生成の削減が含まれます。 これらの最適化は以下を目標としています。
-qhot=vector は、-qhot が指定されたときのデフォルトです。 -qhot=vector を指定したコンパイルは、ループのいくつかを変換し、標準バージョンではなく 最適化バージョンの関数を活用します。 最適化された関数は、逆数、平方根などの関数および演算を含む 標準装備ライブラリーにあります。 最適化バージョンは、精度とパフォーマンスに関するさまざまなトレードオフを行います。 -qstrict の使用は、-qhot=novector を暗黙指定します。
-qhot=simd (ショート・ベクトル化) は、配列データを最適化して、ターゲット・アーキテクチャーで許可される場合、算術演算を並列で実行します。 並列演算は、16 バイト・ベクトル・レジスターで行われます。 この最適化は、倍精度の浮動小数点算術演算はサポートせず、-qarch=ppc970 を指定する必要があります。
すべてのコードに対して、-qhot を -O3 とともに使用して みてください。 (コンパイラーは、-qhot について少なくとも -O2 レベルを想定します。) これは、変換の機会がないときに中間的な効果を持たせるように設計されています。
-qhot オプションは、ループ、配列言語およびメモリー管理の パフォーマンスを改善するために変換を行います。
このオプションは最低でもレベル 2 の -O が必要です。 -C オプションはこれを禁止します。
SMP ハードウェアがあれば、-qsmp オプションを指定して、ループを 自動的に並列化できます。 この最適化には、明示的にコード化された DO ループに加えて、 配列言語用のコンパイラーで生成された DO ループ (WHERE、 FORALL、配列割り当てなど) が含まれています。 コンパイラーは独立したループを並列化するにすぎません (個々の反復は、 他の反復とは別個に計算できます)。 コンパイラーがループの自動並列化を行わないケースとして、ループに I/O が入っている場合があります。 これは、予期しない結果につながるおそれがあるためです。 この場合、ユーザーは、PARALLEL DO または作業共用 DO ディレクティブを 使って、そのようなループを安全に並列化できるようコンパイラーに指示を与えることができます。 ただし、I/O が以下の可能性のいずれかに適合していることが前提となります。
詳細については、「XL Fortran ランゲージ・リファレンス」にある PARALLEL DO または 作業共用 DO ディレクティブの説明を参照してください。
-qhot および -qsmp オプション は、次のようなプログラムに使用できます。
-qhot オプションによって実行されるループ変換は、特定の変換の実行の標準的なループ およびコスト (使用するレジスターと持ち込まれる潜在的な遅延という意味で) の特性 に関する一連の前提事項によって制御されます。
このコスト・モデルは、次のことを考慮に入れています。
正確に情報 (たとえば、ループの反復回数) を判別できる場合は、コンパイラーは この情報を使用してプログラムのその位置におけるコスト・モデルの正確性を 向上させます。 情報が判別できない場合は、コンパイラーはコスト・モデルの デフォルト時の前提事項に依存します。 デフォルト時の前提事項を変更して、 コンパイラーがループを最適化する方法に影響を及ぼすことができます。 このとき、次のようなコンパイラー・オプションを指定します。
値を正確にすることは重要ではありません。また、ファイル内のすべてのループについて 値が正確である必要はありません。 次の場合は、この値はループに使用されません。
反復回数が多いループのスピードを上げるだけのループ変換もあります。 プログラムにそのようなループが多く含まれている場合、 または反復回数が多いループがホット・スポットおよびボトルネックとなっている場合は、 n に大きな値を指定してください。
プログラムにさまざまなループが入っている場合があるため (これらのオプションによってスピードが 上がるもの、影響されないもの、遅くなるものがある)、 どのループがどのオプションから最も益を得るかを判別し、いくつかのループを別のファイルに分割し、 最も適したオプションのセットとディレクティブを指定してファイルを コンパイルすることができます。
ループ・アンロールには、2 回、3 回またはそれ以上の反復作業を行うためにループ本体をアンロールし、 それに比例して繰り返しのカウントを減らすことが関係しています。 ループ・アンロールを行うことには、以下の利点があります。
ループをアンロールすると、新しいループ本体のコード・サイズが増えることになるので、 レジスターの割り振りが増えてレジスター・スピルの原因となる場合があります。 このため、アンロールを行ってもパフォーマンスが向上しないことがあります。
-qtune 設定によってプロセッサー内のレジスターと機能ユニットの数を決定します。 たとえば、 ループをチューニングする場合、 -qtune=pwr4 を設定すると、コンパイラーは、ほとんどの内側ループを深さが 2 になるまでアンロールして、余分の演算ユニットを 利用するようにします。
-qcache 設定は、コンパイラーがループをブロックする際に使用するブロック化係数を決定します。 使用可能なキャッシュ・メモリーが多いほど、ブロック化係数は大きくなります。
一般に、定数または調整可能な境界を持つ配列、大きさ引き継ぎ配列、pointee 配列に対する演算は、自動、想定形状、形状無指定配列、 その他の配列よりも処理が少なくて済み、かつ、スピードも速いようです。
プログラムが配列言語を使用していても、式の左辺の配列が右辺の配列と重複する配列の代入を決して 実行しない場合は、オプション -qalias=noaryovrlp を指定すると、一時配列オブジェクトの使用が 減るため、パフォーマンスを向上させることができます。
-qhot オプションも、多くの一時配列を削減することができます。
XL Fortran 対応のチップ・ターゲットのキャッシュ・アーキテクチャーをインプリメントした ことが、2 の累乗となっている配列次元によるキャッシュの使用効率の低下を招く場合があります。
-qhot オプションの arraypad サブオプションを使用すると、コンパイラーは、配列処理を しているループの効率が向上する可能性があるところで配列の次元を増加させます。 次元 (特に最初の次元) が 2 の乗数になっている大きな配列がある場合、あるいはキャッシュ・ミスまたは ページ不在によって配列を処理しているプログラムが遅くなっている場合は、-qhot ではなく -qhot=arraypad または -qhot=arraypad=n の指定を考慮する必要があります。
-qhot=arraypad が実行する埋め込みは内部的です。またソース・コード (EQUIVALENCE ステートメントで 作成されるものなど) の中に該当するケースがないことを想定しており、その場合の記憶素子には埋め込みで 分断された関係が入っています。 また、配列の次元を手動で埋め込むことがプログラムの結果に影響しないと判断できる場合は、そのような 埋め込みを行うこともできます。
埋め込みが (特に多次元配列の場合に) 使用する追加ストレージは、プログラムが再び遅くなるか、あるいは ストレージがなくなるところまでプログラムのオーバーヘッドを増加させる場合があります。 詳細については、-qhot オプションを参照してください。