Sun Studio 12: Fortran ユーザーズガイド

3.4.96 -stackvar

可能な場合はいつでも局所変数をメモリースタックに割り当てます。

このオプションは、再帰的で再入力可能なコードの記述を簡単にし、ループを並列化する際の最適化により自由度を与えることができます。

並列化オプションを使用する場合は、-stackvar を使用するようにしてください。

局所変数は、仮引数ではない変数、 COMMON 変数、外部スコープから継承された変数、または USE 文によってアクセス可能になったモジュール変数です。

-stackvar を有効にすると、局所変数は、属性 SAVE または STATIC を持たないかぎり、スタックに割り当てられます。明示的に初期化された変数は、SAVE 属性を使用して暗黙的に宣言されます。明示的に初期化されず、いくつかのコンポーネントが初期化されている構造変数は、デフォルトでは、SAVE を使用して暗黙的に宣言されません。また、SAVE または STATIC 属性を持つ変数と同等な変数は、暗黙的に SAVE または STATIC です。

静的に割り当てられた変数は、プログラムによって明示的に値を指定されないかぎり、暗黙的に 0 に初期化されます。スタックに割り当てられた変数は、構造変数のコンポーネントがデフォルトで初期化できる場合を除き、暗黙的に初期化されません。

-stackvar を使用してサイズが大きい配列をスタック上に割り当てると、スタックからオーバーフローし、セグメント例外が発生する場合があります。このような場合はスタックサイズを大きくする必要があります。

プログラムを実行する初期スレッドには、メインスタックがあり、マルチスレッド化されたプログラムの各ヘルパースレッドには、それぞれスレッドスタックがあります。

メインスタックのデフォルトのサイズは、約 8M バイトです。デフォルトのスレッドスタックサイズは、32 ビットシステムで 4M バイト、64 ビットシステムで 8M バイトです。引数なしで limit コマンドを実行すると、現在のメインスタックのサイズが表示されます。-stackvar を使用したときにセグメント例外が発生する場合は、メインスタックとスレッドスタックのサイズを大きくしてみてください。

例: 現在のメインスタックのサイズを表示します。


demo% limit
cputime         制限なし
filesize        制限なし
datasize        523256K バイト
stacksize       8192K バイト      <---
coredumpsize    制限なし
descriptors     64
memorysize      制限なし
demo%

例: メインスタックのサイズを 64M バイトに設定します。


demo% limit stacksize 65536

例: 各スレッドスタックのサイズを 8M バイトに設定します。


demo% setenv STACKSIZE 8192

各スレーブスレッドで使用されるスタックサイズは、 STACKSIZE 環境変数に値 (キロバイト単位) を指定することで設定できます。

% setenv STACKSIZE 8192

この例は、各スレーブスレッドのスタックサイズを 8M バイトに設定します。

STACKSIZE 環境変数は、接尾辞 BKM、または G の付いた数値も受け付けます。これらの接尾辞はそれぞれ、バイト、キロバイト、メガバイト、ギガバイトを表します。デフォルトはキロバイトです。

並列化と -stackvar を併用する方法の詳細は、『Fortran プログラミングガイド』の「並列化」の章を参照してください。limit コマンドについての詳細は、csh(1) を参照してください。

-xcheck=stkovf フラグを指定してコンパイルすると、スタックオーバーフロー状態に対する実行時の検査が有効になります。「3.4.120 -xcheck=keywordを参照してください。