Fortran ユーザーズガイド | ![]() ![]() ![]() ![]() ![]() |
第 2 章
Sun Fortran コンパイラの使用
この章では、Fortran 77 と Fortran 95 コンパイラの使用方法について説明します。
コンパイラの主な使用目的は、Fortran などの手続き型言語で記述されたプログラムを、コンピュータで実行できるデータファイルに変換することです。コンパイル処理の一部として、コンパイラから自動的にリンカーを起動して、実行可能ファイルを生成することもできます。
Sun Fortran 77 と Fortran 95 は次の目的で使用することもできます。
- マルチプロセッサ用の並列化実行ファイルを生成します (
-parallel
オプション) 。- ソースファイルとサブルーチン間におけるプログラムの整合性を分析し、レポートを作成します (
-Xlist
オプション)。- ソースファイルを以下のファイルに変換します。
- 実行可能ファイルにリンクします。
- 実行時デバッガを有効にして実行可能ファイルを生成します (
-g
オプション)。- 文単位または手続き単位の実行時のプロファイルを有効にして、実行可能ファイルを生成します (
-pg
オプション)。- 並列化ループの実行時プロファイルを有効にして、実行可能ファイルを生成します
(-Zlp
オプション)。- ソースコードを調べて ANSI 標準への準拠を確認します (
-ansi
オプション)。クイックスタート
ここでは Sun Fortran コンパイラを使用して、Fortran プログラムをコンパイルし、実行する方法について、簡単に説明します。コマンド行オプションの参考情報は、次の章で紹介します。
注 - この章に示すコマンド行の例では、主にf77
を使用します。特に説明がない限り、f95
にも同じように適用されます。ただし、出力の内容は多少異なります。
Fortran アプリケーションの基本的な実行手順は次のとおりです。まず、エディタを使用して、
.f、.for、.f90、f95、.F
、.F90
または F95 という拡張子の付いた Fortran のソースファイルを作成します。次に、コンパイラを起動して実行可能ファイルを生成し、最後にそのファイル名を入力してそのプログラムを実行します。例 : 画面上にメッセージを出力するプログラムの作成例を示します。
demo%cat greetings.f
PROGRAM GREETINGSPRINT *, 'Real programmers write Fortran!'ENDdemo%f77 greetings.f
greetings.f:MAIN greetings:demo%a.out
Real programmers write Fortran!demo%この例では、
f77
がソースファイルgreetings.f
をコンパイルし、デフォルトではa.out
という実行可能ファイルを生成します。プログラムを起動するには、コマンドプロンプトで実行可能ファイルの名前a.out
を入力します。一般的には、UNIX のコンパイラは実行可能ファイルとして
a.out
というデフォルトではファイルを生成します。同じ名前のファイルがすでに存在する場合は、次回にコンパイルを実行すると、出力が上書きされ、上書きされると不都合な場合もあります。-o
コンパイラオプションを使用すると、実行可能出力ファイルの名前を明示的に指定することができます。
demo%f77 -o greetings -fast greetings.f
greetings.f:MAIN greetings:demo%上の例では、
-o
オプションによって、実行可能コードがgreetings
というファイルに書き込まれるようになります (慣例では、実行可能ファイルの名前には、メインソースファイルから拡張子を除いた名前を指定します)。また別の方法として、コンパイル処理が終わるごとに、
mv
コマンドを使用してデフォルトのa.out
ファイルの名前を変更することもできます。どちらの方法でも、実行可能ファイルの名前を入力してプログラムを実行します。
demo%greetings
Real programmers write Fortran!demo%以下に、
f95
を使用した同じ例を示します。
demo% cat greetings.f95program greetingsprint*, 'Real programmers write Fortran 95!'enddemo% f95 -o greetings greetings.f95demo% greetingsReal programmers write Fortran 95!demo%以下の項では、
f77
およびf95
で使用するコマンドの表記法、コンパイラのソース行指令、注意事項などについて解説します。次の章では、コマンド行の構文とすべてのオプションについて詳しく説明します。コンパイラの起動
単純なコンパイラコマンドのシェルプロンプトでの起動方法は次のとおりです。
f77
<オプション> <ファイル名> ... Fortran 77 コンパイラ起動f95
<オプション> <ファイル名> ... Fortran 95 コンパイラ起動<ファイル> には、1 つ以上の Fortran のソースファイル名を指定します。拡張子として
.f、.F、.f90、f95、.F90
、F95 または.for
が付いている <オプション> には 1 つまたは複数のコンパイラオプションフラグを指定します (.f90
または.f95
の拡張子が付いているファイルは、f95
コンパイラだけが認識する「自由書式」の Fortran 95 ソースファイルです)。次の例では、
f95
は 2 つのソースファイルをコンパイルして、実行時デバッガを有効な状態にしてgrowth
という名前の実行可能ファイルを生成します。
demo%f95 -g -o growth growth.f fft.f95
注 - Sun WorkShop 6 の Fortran 95 のコンパイラは、f95
またはf90
のどちらのコマンドを使用しても起動できます。今回のリリースでf90
コマンドはf95
の別名になりました。
コンパイルとリンク処理の流れ
上記の例では、コンパイラは
growth
.o
と
fft.o
のロードオブジェクトファイルを自動的に生成し、次にシステムリンカーを起動してgrowth
という実行可能プログラムファイルを生成します。コンパイルの終了後、オブジェクトファイル
growth.o
と
fft.o
が残ります。このため、ファイルの再リンクや再コンパイルが簡単に行うことができます。コンパイルに失敗すると、それぞれのエラーごとにメッセージが表示されます。エラーがあるソースファイルについては
.o
ファイルや実行可能プログラムファイルは作成されません。ファイル名の拡張子
コマンド行で入力するファイル名の拡張子によって、コンパイラがそのファイルをどのように処理するかが決まります。以下の表に示されていない拡張子の付いたファイル名、および拡張子のないファイル名は、リンカーに渡されます。
Fortran 95 の自由形式については、付録 C「Fortran 95 の機能と相違点」を参照してください。
ソースファイル
Fortran コンパイラでは、コマンド行に複数のソースファイルを指定することができます。コンパイルユニットとも呼ばれる 1 つのソースファイル中に、複数の手続き
(主プログラム、サブルーチン、関数、ブロックデータ、モジュールなど) を記述することができます。アプリケーションは、一つのファイルに一つのソースコード手続きを記述して構成することも、同時に処理される手続きを一つのファイルにまとめて構成することもできます。これらの構成方法の長所と欠点については、『Fortran プログラミングガイド』を参照してください。ソースファイルプリプロセッサ
f77
およびf95
は、fpp
と
cpp
というソースファイルプリプロセッサをサポートしています。いずれのプリプロセッサもコンパイラから起動され、ソースコード「マクロ」とシンボリック定義を展開してから、コンパイルを開始します。デフォルトではfpp
が使用されます。-xpp=cpp
オプションを指定すると、fpp
から
cpp
にデフォルトを変更できます ( -Dname オプションの説明も参照してください)。
fpp
は Fortran 言語専用のソースプリプロセッサです。詳細は、fpp
(1) のマニュアルページとfpp
の README を参照してください。fpp
はデフォルトのプリプロセッサで、f77
の場合は拡張子.F
のファイルに対して起動され、f9
5 の場合は.F
、.F90
または F95 拡張子のファイルに対して起動されます。http://www.netlib.org/fortran/
fpp
のソースコードは、次に示す web サイト Netlib から使用できます。
標準的な Unix C 言語のプリプロセッサについては、
cpp
(1) を参照してください。Fortran のソースファイルでは、cpp
よりもfpp
を使用することをお勧めします。別々に実行するコンパイルとリンク
コンパイルとリンクをそれぞれ個別に実行することができます。
-c
オプションを指定すると、ソースファイルをコンパイルして.o
オブジェクトファイルだけが生成され、実行可能ファイルは生成されません。-c
オプションを指定しない場合、コンパイラはリンカーを起動します。このようにコンパイルとリンクを別々に実行すると、次の例に示すように、 1 つのファイルを修正するための目的で全体を再コンパイルする必要がなくなります。1 つのファイルをコンパイルし、別の手順で他のオブジェクトファイルとリンクする。
demo%f95 -c file1.f
(新規オブジェクトファイルを作成)
demo%f95 -o prgrm file1.o file2.o file3.o
(新規実行可能ファイルを作成)リンクを実行する時には (2 行目)、プログラム全体を構成するのに必要なオブジェクトファイルをすべて指定してください。オブジェクトファイルが不足していると、未定義の外部参照エラー (ルーチンの不足) によって、リンクが失敗します。
コンパイルとリンクの整合性
コンパイルとリンクを別々に行う場合、コンパイルとリンクの各オプションを選択するときにそれらの整合性を確認しておく必要があります。以下のオプションを指定してプログラムのコンパイルを行った場合は、同じオプションを指定してリンクを行ってください。。
-a, -autopar, -Bx, -dbl, -fast, -G, -Lpath, -lname, -mt, -xmemalign, -nolib, -norunpath, -p, -pg, -xlibmopt, -xlic_lib=name, -xprofile=p
例 : -a を付けた sbr.f と -a なしの smain.f をコンパイルし、リンクを別々に行います
(-a で tcov 旧式のプロファイルを呼び出す)。
demo$f95 -c -a sbr.f
demo$f95 -c smain.f
demo$f95 -a sbr.o smain.o (リンク :
-
a をリンカーに渡す)
オプションによっては、すべてのソースファイルをリンクも含めてそのオプションを指定してコンパイルする必要があります。以下にオプションを示します。
-autopar, -aligncommon, -dx, -dalign, -dbl, -explicitpar, -f, -misalign, -native, -parallel, -r8, -xarch=a, -xcache=c,
-xchip=c, -xF, -xtarget=t, -xtypemap, -ztext
Fortran 95 と FORTRAN 77 のコンパイルが混在している場合のリンク
一般に、プログラム全体を構成するオブジェクトファイルのいずれかが、
f95
でコンパイルされている場合、最後のリンクもf95
で実行する必要があります。f95
でコンパイルされた.o
オブジェクトファイルがない場合のみ、f77
を使用して実行可能ファイルを生成してください。付録 C「Fortran 95 の機能と相違点」も参照してください。認識されないコマンド行引数
コンパイラが認識できない引数がコマンド行で指定された場合、リンカーオプション、オブジェクトプログラムのファイル名、またはライブラリ名として解釈されます。
- 認識されないオプション (
-
が付いている) には、警告メッセージが出力されます。- 認識されない 非オプション (
-
が付いていない) には警告メッセージが出力されません。リンカーにも認識されない場合には、リンカーエラーメッセージが出力されます。
最初の例では、
-bit
は
f95
では認識されず、このオプションはリンカー (ld
) に渡されます 。ただし、ld
では 1 文字のオプションを続けて並べることもできるため、-bit
が
-b
-i
-t
と解釈されます。b、i、t
はいずれもld
の有効なオプションであるからです。これは、ユーザーが意図している場合と、意図していない場合とがあります。2 つ目の例では、
f77/f95
の共通のオプションとして-fast
を指定しようとしていますが、先頭のハイフンが抜けています。この場合も、コンパイラは引数をリンカーに渡し、リンカーはこれをファイル名と解釈します。以上の例から、コンパイラコマンドを指定する場合には、十分な注意が必要であることがわかります。
モジュール (Fortran 95)
f95
は、ソースファイル中にある各MODULE
宣言に対して、それぞれモジュール情報ファイルを自動的に作成し、USE
文で引用されるモジュールを検索します。見つかったモジュール (MODULE
module_name) ごとに、コンパイラは、対応するファイルmodule_name
.mod を現在のディレクトリ内に生成します。たとえば、ファイルmysrc.f95
中にあるMODULE
list
単位のモジュール情報ファイルlist.mod
はf95
によって生成されます。コンパイラは、現在のディレクトリを検索して、
USE
文の中で引用されている各モジュールファイルを検索します。モジュールファイルは、USE
文でMODULE
を引用しているソースファイルをコンパイルする前にコンパイルします。-M
のコマンド行オプションを使用すると、検索パスにディレクトリを追加できます。ただし、個々の.mod
ファイルをコマンド行で直接指定することはできません。指令
Fortran の注釈の書式であるソースコード指令を使用して、特殊な最適化または並列化の選択に関する情報をコンパイラに渡すことができます。コンパイラ指令は、プラグマとも呼ばれます。コンパイラは、一連の一般指令および並列化指令を認識します。Fortran 95 も OpenMP 共有メモリマルチプロセッシング指令を処理します。
f95
に固有の指令については付録 Cで説明します。
f77
およびf95
が認識する全指令の一覧は、付録 E に記載されています。
注 - 指令は Fortran 規格には含まれていません。
一般的な指令
一般的な Sun の Fortran 指令は次のような書式で使用します。
変数 keyword は特定の指令を表します。追加の引数やサブオプションも指定できます。指令によっては、上記に示す
SUN
やSPARC
といった追加のキーワードを指定しなければなりません。
- 1 カラム目は、注釈指示子の文字
c
、C
、!
、*
などです。f95
の自由形式の ! は、認識される唯一の注釈指示子 (!$PRAGMA
) です。本章に示す例では、固定形式を想定しています。- 次の 7 文字は空白文字を入れず
$PRAGMA
とします。大文字でも小文字でもかまいません。f77
の場合、! という注釈指示子文字を使用する指令は、行のどのカラムにも記述できます。f95
の場合、このことは自由形式のソースプログラムでしか行えません。
- 最初の 8 文字の後では、空白は無視され、大文字と小文字は区別されません。
- 指令は注釈なので行をまたがって継続することはできません。ただし、1 行で完結している
C$PRAGMA
行を複数使うことができます。- 注釈が上記の構文条件を満たしていると、コンパイラが認識できる指令が 1 つまたは複数含まれていることになります。上記の構文条件を満たしていない場合は、警告メッセージが出力されます。
- C プリプロセッサの
cpp
は注釈行または指令行の中でマクロシンボル定義を展開します。Fortran プリプロセッサのfpp
は注釈行の中でマクロの展開は行いませんが、正当なf77
とf95
の指令は認識し、指令キーワード外の置換を制限します。ただし、キーワードSUN
が必要な指令には注意してください。cpp
は小文字のsun
を事前定義した値で置き換えます。また、cpp
マクロSUN
を定義すると、SUN 指令キーワードが干渉されます。一般的な規則では、次のようにソースがcpp
またはfpp
で処理される場合、プラグマは大文字と小文字を混在させて指定します。
C$PRAGMA Sun UNROLL=3
Fortran のコンパイラは、次の一般的な指令を認識します。
C 指令
C()
指令は、その引数が外部関数であることを指定します。これは、EXTERNAL
宣言と同義です。ただし、通常の外部名とは違って、Fortran コンパイラでは、これらの引数名に下線が付けられません。詳細は、『Fortran プログラミングガイド』の「C-Fortran インタフェース」の章を参照してください。特殊な関数の
C()
指令は、各副プログラム中にある、その関数への最初の引用よりも前に現われなければなりません。
EXTERNAL ABC, XYZC$PRAGMA C(ABC, XYZ)
UNROLL 指令
UNROLL
指令では、C$PRAGMA
の後にSUN
と指定する必要があります。
C$PRAGMA SUN UNROLL=
n 指令は、ループを n 回展開するようにオプティマイザに指示します。(コンパイラは、解析の結果、ループの展開が適切であると判断した場合のみ展開します)。実際に展開されたループがあると、実行可能ファイルのサイズが大きくなります。パフォーマンスと最適化についての詳細は、『Fortran プログラミングガイド』を参照してください。
例 : ループを 2 回展開するときは、次のように指定します。
C$PRAGMA SUN UNROLL=2WEAK 指令
WEAK
指令は、以前に定義されているよりも低い優先順位で同じシンボルを定義します。この指令は主に、ライブラリを作成する場合にソースファイル中で使用されます。この場合、優先順位が低いシンボルが解決されなくても、リンカーからはエラーメッセージは出力されません。
C$PRAGMA WEAK (name1 [=name2])
WEAK
(name 1) によって、name1 が優先順位が低いシンボルとして定義されます。この場合、リンカーは name1 の定義が見つけられなくてもエラーメッセージを出力しません。
WEAK
(name1=name2) によって、name1 が弱いシンボルとして、および name2 の別名として定義されます。プログラムから呼び出された name1 が定義されていない場合、リンカーはライブラリの定義を使用します。ただし、プログラムで name1 の定義が行われている場合は、そのプログラムの定義が使用され、ライブラリ中にある name1 の優先順位が低い大域的な定義は使用されません。プログラムから name2 が直接呼び出されると、ライブラリの定義が使用されます。name2 の定義が重複すると、エラーが発生します。詳細は、Solaris の『リンカーとライブラリ』を参照してください。
OPT 指令
OPT
指令では、C$PRAGMA
の後にSUN
と指定する必要があります。
OPT
指令は副プログラムの最適化レベルを設定し、コンパイルコマンド行に指定されているレベルは上書きされます。指令は副プログラムの直前に指定する必要があり、その副プログラムだけに適用されます。次に例を示します。
C$PRAGMA SUN OPT=2SUBROUTINE smart(a,b,c,d,e)...etc
-04
を指定するf77
コマンドでコンパイルする場合、指令はこのレベルを上書きして-02
でサブルーチンをコンパイルします。このルーチンの後に別の指令がない限り、次の副プログラムは-04
でコンパイルされます。ルーチンを
-xmaxopt=
n オプションでコンパイルして、指令が認識されるようにする必要があります。このコンパイラオプションはPRAGMA
OPT
指令の最適化の最大値を指定します。PRAGMA
OPT
に指定した最適化レベルが-xmaxopt
レベルよりも大きいと、-xmaxopt
レベルが使用されます。PIPELOOP=n 指令 (SPARC のみ)
PIPELOOP=
n 指令では、C$PRAGMA
の後にSUN
と指定する必要があります。指令は DO ループの直前に指定する必要があります。n には正の整定数かゼロを指定し、ループ間の依存関係をオプティマイザに指示します。ゼロの値は反復間の依存関係がないことを示し、オプティマイザで自由にパイプラインできます。正の値の n はループの I 番目の反復が (I-n) 番目の反復に依存していることを意味し、一度に n 反復だけパイプラインできます。
C We know that the value of K is such that there can be noC cross-iteration dependencies (E.g. K>N)C$PRAGMA SUN PIPELOOP=0DO I=1,NA(I)=A(I+K) + D(I)B(I)=B(I) + A(I)END DO最適化についての詳細は、『Fortran プログラミングガイド』を参照してください。
(SPARC のみ) PERFETCH 指令
-xprefetch
オプションフラグを使用すると、コンパイラに指示した一連のPREFETCH
指令 は、指定のデータ要素について先読み命令を生成することができます。先読み命令は、UltraSPARC プラットフォームでだけ使用できます。
C$PRAGMA SPARC_PREFETCH_READ_ONCE(name)C$PRAGMA SPARC_PREFETCH_READ_MANY(name)C$PRAGMA SPARC_PREFETCH_WRITE_ONCE(name)C$PRAGMA SPARC_PREFETCH_WRITE_MANY(name)先読み命令の詳細は、『C ユーザーズガイド』または『SPARC Architecture Manual, Version 9』も参照してください。
並列化指令
並列化指令は、コンパイラに対して、指令の後に続く
DO
ループまたはコードの範囲を並列化するように明示的に指示します。一般的な指令とは、構文が異なります。並列化指令は、-parallel
または
-explicitpar
コンパイルオプションが指定されている場合のみ、認識されます。Fortran の並列化指令については『Fortran プログラミングガイド』を参照してください。
注 - Fortran コンパイラの並列化機能には、Sun WorkShop HPC のライセンスが必要です。
Fortran のコンパイラは、Sun、Cray、OpenMP という三つの形式の並列化指令をサポートします。
デフォルトは、Sun 形式の並列化指令です (
-mp=sun
というコンパイラオプションを指定すると、明示的に選択されます)。Sun 指令には、$PAR
という指令センチネルが付きます。一方、Cray 形式の並列化指令を使用するには、
-mp=cray
というコンパイラオプションを指定します。これには、MIC$
というセンチネルが付きます。Sun と Cray では、同じ指令でも解釈の仕方が異なります。詳細は、『Fortran プログラミングガイド』の並列化の章を参照してください。Fortran 95 は、次の章に示すような OpenMP 並列化指令も受け付けます。
- 最初の文字は、1 カラム目になければなりません。
- 最初の文字は、
c
、C
、*
、!
のいずれかです。- 次の 4 文字は、空白を入れず
$PAR
(サン形式) または MIC$ (Cary 形式) とします。大文字でも小文字でもかまいません。- その後に、指令のキーワードと修飾子を空白で区切って続けます。
明示的な並列化指令のキーワードは次のとおりです。
TASKCOMMON、DOALL、DOSERIAL、DOSERIAL*
並列化指令では、キーワードの後にオプション修飾子を指定します。
例 : 共有変数でループを指定 :
C$PAR DOALL SHARED(yvalue) Sun 形式CMIC$ DOALL SHARED(yvalue) Cray 形式並列化およびこれらの指令の概要については付録 E を、詳細は『Fortran プログラミングガイド』をそれぞれ参照してください。
OpenMP 指令
Sun WorkShop 6 の Fortran 95 コンパイラは、OpenMP アーキテクチャレビューボードで指定したように、OpenMP Fortran 共有メモリマルチプロセッシング API を認識します。詳細は、OpenMPの web サイト http://www.openmp.org を参照してください。
OpenMP 指令を使用可能にするには、
-mp=openmp
または-openmp
というコマンド行オプションを指定してコンパイルしなければなりません。OpenMP 指令の概要は、付録 E に記載されています。
OpenMP 指令は、Sun または Cray 形式のどちらか一方の並列化指令と併用できます。ただし、それは、これらの指令が互いに入れ子になっていない場合に限ります。Sun または Cray の指令と OpenMP を使用可能にするには、
-mp=openmp
、sun
または-mp=openmp
、cray
と指定します。コンマの後には空白文字を入れません。コンパイラの利用方法
Sun Fortran コンパイラを効果的に利用するための方法をいくつか紹介します。
ハードウェアプラットフォームの特定
コンパイラフラグの中には、特定のハードウェアプラットフォームのオプションセットに合わせてコードを生成できるものもあります。
fpversion
ユーティリティを実行すると、ネイティブプロセッサのハードウェアプラットフォームの仕様を表示することができます。
表示される値は、
fpversion
が呼び出されたときのシステムの負荷によって異なります。詳細については
fpversion
(1) および『数値計算ガイド』を参照してください。環境変数の使用
FFLAGS
または
OPTIONS
環境変数を設定して、オプションを指定することができます。コマンド行で
FFLAGS
またはOPTIONS
のいずれかを明示的に指定します。make
ファイルの暗黙のコンパイル規則を使用している場合は、make
プログラムによってFFLAGS
が自動的に使用されます。
demo% setenv FFLAGS '-fast -Xlist'
demo% f95 $FFLAGS any.f
make
を使用するときに、FFLAGS
変数が上記のように設定されており、makefile
の暗黙のコンパイル規則が適用される場合 (すなわち明示的なコンパイラ・コマンド行がない場合) にmake
を実行すると、次のコンパイルを実行した場合と同じ意味になります。
f77 -silent -fast -Xlist
files...
make
はサンのすべてのコンパイラで使用できる協力なプログラム開発ツールです。make
(1) マニュアルページおよび『Fortran プログラミングガイド』の第 3 章「プログラム開発」を参照してください。
注 -make
が仮定するデフォルトの暗黙的規則では、.f95
および.mod
(Fortran 95 のモジュールファイル) という拡張子付きのファイルを認識できません。詳細は、『Fortran プログラミングガイド』および Fortran 95 の README ファイルを参照してください。
メモリーサイズ
コンパイル処理は大量のメモリーを使用することがあります。必要なメモリーのサイズは、選択した最適化レベル、およびコンパイルするファイルのサイズや複雑さに依存します。SPARC プラットフォームでは、最適化でメモリーが不足した場合は、その時点の手続きを低いレベルで最適化し直し、後続のルーチンはコマンド行の
-O
n オプションで指定されていた本来のレベルで最適化を再開します。ワークステーションには最低 24M バイトのメモリーが実装されている必要があります。推奨値は 32M バイトです。メモリーの使用量は、手続きのサイズ、最適化レベル、仮想メモリーの制限、ディスクのスワップファイルのサイズ、その他さまざまな要素によって異なります。
多数のルーチンを含む単一のソースファイルをコンパイルすると、メモリーやスワップ領域が不足することがあります。
コンパイラのメモリーが不足する場合は、最適化レベルを下げてください。または
(1) を使用して、複数のルーチンが含まれているソースファイルを、1 ルーチンが 1 ファイルに対応するようにいくつかのファイルに分割してください。
fsplitスワップ領域の制限
SunOSTM のオペレーティングシステムコマンド、
swap -s
により、利用可能なスワップ領域が表示されます。詳細は、swap
(1M) を参照してください。
demo%swap -s
total: 40236k bytes allocated + 7280k reserved = 47516k used, 1058708k available
demo%/usr/sbin/dmesg | grep mem
mem = 655360K (0x28000000)avail mem = 602476544スワップ領域の拡大
スワップ領域のサイズを拡大するには、
mkfile
(1M) とswap
(1M) を使用します。この操作は、スーパーユーザーだけが実行できます。mkfile
によって特定のサイズのファイルを作成し、swap
-a
によってそのファイルをシステムのスワップ領域に追加します。
demo#mkfile -v 90m /home/swapfile
/home/swapfile 94317840 bytesdemo#/usr/sbin/swap -a /home/swapfile
仮想メモリーの制限
最適化レベル
-O3
以上のレベルで大規模なルーチン (1 つの手続きが数千行ものコードで構成されるルーチン) をコンパイルすると、メモリーがさらに必要になる場合があり、コンパイル時間のパフォーマンスが低下することもあります。この問題には、1 つプロセスで利用できる仮想メモリーの量を制限することによって対処することができます。
sh
では、ulimit
コマンドを使用します (sh
(1) を参照してください)。
csh
では、limit
コマンドを使用します (csh
(1) を参照してください)。いずれの場合も、オプティマイザは 16MB のデータ領域で最適化を再実行します。
この制限はマシンで利用可能なスワップ領域の総量を超えることはできないので、実際は、大規模なコンパイルの進行中であってもマシンを普通に使用できる程度の小さい値を指定してください。
コンパイル処理でスワップ領域の半分以上が使用されることのないように注意してください。
例 : 32MB のスワップ領域のあるマシンでは、次のコマンドを使用します。
demo$ulimit -d 1600
demo%limit datasize 16M
最適な設定は、最適化のレベルや、利用可能な実メモリーと仮想メモリーの量によって異なります。
64 ビットの Solaris 環境では、アプリケーションデータセグメントのサイズに対する弱い制限値は 2GB です。データ領域を追加割り当てする必要がある場合は、シェルの
limit
またはulimit
コマンドを使用して制限値を削除します。csh
の場合 :
demo%limit datasize unlimited
demo%unlimit -d unlimited
サン・マイクロシステムズ株式会社 Copyright information. All rights reserved. |
ホーム | 目次 | 前ページへ | 次ページへ | 索引 |