スタック: 自動割り当てと確認

このグループのオプションは、コンパイラーにより生成されたコードのスタックおよび変数の計算を制御できます。

変数の自動割り当て

-automatic (Linux*および Mac OS* X) と /automatic (Windows*)

これらのオプションは、ローカルで宣言された変数を、スタティック・ストレージではなくランタイムスタックに割り当てるよう指定します。プロシージャーで定義された変数が SAVE または ALLOCATABLE 属性を持たない場合、それらの変数は、スタックのみに割り当てられます。このオプションは、EQUIVALENCE 文または SAVE 文内の変数、および COMMON 内の変数には作用しません。

-automatic (Linux および Mac OS X) または /automatic (Windows) を指定すると、プログラムのパフォーマンスが向上することがあります。ただし、プログラムが、最後にルーチンが呼び出されたときと同じ値を持つ変数に依存している場合は、プログラムが正しく機能しないことがあります。複数のルーチン呼び出しにわたってその値を保持する必要のある変数は、SAVE 文内になければなりません。

Note icon

Linux: -recursive または -openmp を指定すると、デフォルトは -auto になります。

Windows: Windows NT* システムでは、スタックフレームのアドレス指定を大きくしすぎると、パフォーマンス・ペナルティーが課せられます。このパフォーマンスの低下は、/Qauto が原因で発生することがあります。これは、配列がスカラーとともにスタックに割り当てられるためです。

-auto-scalar (Linux および Mac OS X) または /Qauto-scalar (Windows)

これらのオプションにより、INTEGERREALCOMPLEX、または LOGICAL の各組み込み型ローカルスカラー変数のスタックへの割り当てが行われます。このオプションは、EQUIVALENCE 文または SAVE 文内の変数、および COMMON 内の変数には影響しません。

-auto-scalar (Linux および Mac OS X) または /Qauto-scalar (Windows) オプションを指定すると、プログラムのパフォーマンスが向上することがあります。ただし、プログラムが、最後にルーチンが呼び出されたときと同じ値を持つ変数に依存している場合は、プログラムが正しく機能しないことがあります。複数のサブルーチン呼び出しにわたってその値を保持する必要のある変数は、SAVE 文内になければなりません。このオプションは、すべてのローカル変数をスタックに割り当てる -auto (Linux および Mac OS X)、/Qauto (Windows) によく似ていますが、-auto-scalar (Linux および Mac OS X)、/Qauto-scalar (Windows) は上記の型のスカラー変数のみをスタックに割り当てる点が異なります。

Note icon

Windows: Windows NT では、大きすぎるスタックフレームをアドレス指定するとパフォーマンスが低下します。このパフォーマンスの低下は、/Qauto が原因で発生することがあります。これは、配列がスカラーとともにスタックに割り当てられるためです。しかし、/Qauto-scalar を使用して、32KB 以上のローカルスカラー変数を使用すると、パフォーマンスの低下を防ぐことができます。

-auto-scalar (Linux および Mac OS X) または /Qauto-scalar (Windows) を使用すると、コンパイラーは、プログラムの実行中にどの変数をレジスターに保持すべきかについて、より良い選択を行います。

-save, -zero[-] (Linux および Mac OS X) または /Qsave, /Qzero[-] (Windows)

-save (Linux および Mac OS X)、/Qsave (Windows) オプションでは、-auto (Linux)、/Qauto (Windows) の逆の効果が得られます。-save (Linux および Mac OS X)、/Qsave (Windows) オプションは、再帰ルーチン内にあるローカル変数を除くすべての変数を静的割り当てに保存します。

ルーチンが 2 回以上呼び出される場合は、このオプションを指定すると、最後に終了した呼び出しから得られるローカル変数の値が保持されます。save オプションにより、ルーチンの終了時に最終結果がメモリーに保存され、次回の呼び出しの際に再利用されます。このオプションでは、結果の丸めが頻繁になるので、一部パフォーマンスが低下することがあります。

Note icon

Linux および Mac OS X: -save の機能は、-noauto と同じです。

Windows: /Qsave の機能は /save および /noautomatic と同じです。

コンパイラーがコードを最適化する際、結果はレジスターに保存されます。

-zero[-] (Linux および Mac OS X)、/Qzero[-] (Windows) オプションは、INTEGERREALCOMPLEX、または LOGICAL 組み込み型のローカルスカラー変数で、保存はされているがまだ初期化されていない変数を、すべてゼロに初期化します。SAVE とともに使用されます。

まとめ

変数を割り当てるには 3 つのオプションがあります。-save (Linux および Mac OS X)、/Qsave (Windows)、または -auto (Linux)、/Qauto (Windows)、そして -auto-scalar (Linux)、/Qauto-scalar (Windows) です。指定できるのはこれらのうち 1 つだけです。

各方法は次のような相互関係にあります。

スペースの確認と設定

スタックスペースの検証および設定を行うためのオプションを次に示します (これらのオプションは Windows のみでサポートされています)。

エイリアス

-common-args (Linux および Mac OS X) または /Qcommon-args (Windows) オプションは、参照によるサブプログラム引数がお互いのエイリアスを持っていると見なします。

common-args オプションの代わりに -assume dummy_aliases (Linux および Mac OS X) または /assume:dummy_aliases (Windows) オプションを使用することを推奨します。

オプションの使用に関する詳細は、次のトピックを参照してください。

CRAY* ポインター・エイリアシングを回避する

オプション -safe-cray-ptr (Linux および Mac OS X) または /Qsafe-cray-ptr (Windows) は、CRAY* ポインターが他の変数とエイリアスしないように指定します。次の例について考えてみます。

pointer (pb, b)

pb = getstorage()

do i = 1, n

  b(i) = a(i) + 1

enddo

オプションが指定されていない場合、コンパイラーは b と a がエイリアスされていると仮定します。このような仮定を回避するには、このオプションを指定します。コンパイラーは b(i)a(i) がお互いに独立しているとして処理します。

しかし、変数を CRAY ポインターでエイリアスする場合、-safe-cray-ptr (Linux および Mac OS X) または /Qsafe-cray-ptr (Windows) オプションを使用すると、正確な結果が得られません。下記の例のコードでは、オプションを使用しないでください。

pb = loc(a(2))

do i=1, n

  b(i) = a(i) +1

enddo

クロスプラットフォーム

例えば、実数型のオブジェクトは、整数型としてアクセスできません。詳しい規則については、ANSI 標準を参照してください。

このオプションは、次の点を前提にしてコンパイラーに指示します。

プログラムが上記の条件を満たす場合、このオプションを設定することでプログラムの最適化が向上します。ただし、プログラムが上記の条件を 1 つでも満たさない場合、コンパイラーは誤ったコードを生成する可能性があるため、このオプションを無効にしなければなりません。

詳細は、次のトピックを参照してください。