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