Fortran ユーザーズガイド ホーム目次前ページへ次ページへ索引


第 2 章

Sun Fortran コンパイラの使用

この章では、Fortran 77 と Fortran 95 コンパイラの使用方法について説明します。

コンパイラの主な使用目的は、Fortran などの手続き型言語で記述されたプログラムを、コンピュータで実行できるデータファイルに変換することです。コンパイル処理の一部として、コンパイラから自動的にリンカーを起動して、実行可能ファイルを生成することもできます。

Sun Fortran 77 と Fortran 95 は次の目的で使用することもできます。

クイックスタート

ここでは Sun Fortran コンパイラを使用して、Fortran プログラムをコンパイルし、実行する方法について、簡単に説明します。コマンド行オプションの参考情報は、次の章で紹介します。


注 - この章に示すコマンド行の例では、主に f77 を使用します。特に説明がない限り、f95 にも同じように適用されます。ただし、出力の内容は多少異なります。

Fortran アプリケーションの基本的な実行手順は次のとおりです。まず、エディタを使用して、.f、.for、.f90、f95、.F.F90 または F95 という拡張子の付いた Fortran のソースファイルを作成します。次に、コンパイラを起動して実行可能ファイルを生成し、最後にそのファイル名を入力してそのプログラムを実行します。

例 : 画面上にメッセージを出力するプログラムの作成例を示します。

demo% cat greetings.f
	PROGRAM GREETINGS
	PRINT *, 'Real programmers write Fortran!' 
	END
demo% 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.f95
program greetings
print*, 'Real programmers write Fortran 95!'
end
demo% f95 -o greetings greetings.f95
demo% greetings
 Real programmers write Fortran 95!
demo%

以下の項では、f77 および f95 で使用するコマンドの表記法、コンパイラのソース行指令、注意事項などについて解説します。次の章では、コマンド行の構文とすべてのオプションについて詳しく説明します。

コンパイラの起動

単純なコンパイラコマンドのシェルプロンプトでの起動方法は次のとおりです。

f77 <オプション> <ファイル名> ...
Fortran 77 コンパイラ起動
f95 <オプション> <ファイル名> ...
Fortran 95 コンパイラ起動

<ファイル> には、1 つ以上の Fortran のソースファイル名を指定します。拡張子として .f、.F、.f90、f95、.F90F95 または .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 ファイルや実行可能プログラムファイルは作成されません。

ファイル名の拡張子

コマンド行で入力するファイル名の拡張子によって、コンパイラがそのファイルをどのように処理するかが決まります。以下の表に示されていない拡張子の付いたファイル名、および拡張子のないファイル名は、リンカーに渡されます。

表 2-1   Fortran コンパイラが認識するファイル名の拡張子  
拡張子 言語 処理
.f
Fortran 77
または
Fortran 95 固定形式
ソースファイルをコンパイルし、オブジェクトファイを現在のディレクトリに出力する。オブジェクトファイルのデフォルト名は、ソースファイル名に拡張子.o を付けたもの。
.f95
.f90

Fortran 95
自由形式
.f と同じ(f95 のみ)。
.for
Fortran 77 .f と同じ。
.F
Fortran 77
または
Fortran 95
固定形式
コンパイルの前に、Fortran 77 のソースファイルを Fortran または C のプリプロセッサで処理する。
.F95
.F90

Fortran 95
自由形式
Fortran コンパイラでコンパイルする前に、Fortran 95 の自由形式のソースファイルを Fortran または C のプリプロセッサで処理する (f95 のみ)
.S
アセンブラ アセンブルする前にアセンブラのソースファイルを C プリプロセッサで処理する。
.s
アセンブラ アセンブラでソースファイルをアセンブルする。
.il
インライン
展開
インライン展開コードのテンプレートファイルを処理する。コンパイラは、テンプレートを使用して、インライン呼び出しを指定したルーチンに展開する。
.o
オブジェクトファイル オブジェクトファイルをリンカーに渡す。
.a,
.so,
.so.
n
ライブラリ ライブラリの名前をリンカーに渡す。.a ファイルは静的ライブラリ、.so と .so.n ファイルは動的ライブラリ。


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 のファイルに対して起動され、f95 の場合は .F.F90 または F95 拡張子のファイルに対して起動されます。

fpp のソースコードは、次に示す web サイト Netlib から使用できます。

http://www.netlib.org/fortran/

標準的な 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 の機能と相違点」も参照してください。

認識されないコマンド行引数

コンパイラが認識できない引数がコマンド行で指定された場合、リンカーオプション、オブジェクトプログラムのファイル名、またはライブラリ名として解釈されます。

基本的には次のように区別されます。

例 :

demo% f95 -bit move.f   <-  -bit オプションは f95 では認識されません。
f95: 警告: ld が起動される場合は、オプション -bit は ld に渡されます。そ
れ以外は無視されます
demo% f95 fast move.f     <-   入力ミス (-fast と入力しようとした)
ld: 重大なエラー: ファイル fast: ファイルをオープンできません: ファイルも
ディレクトリもありません。
ld: 重大なエラー: ファイル処理エラー。a.out へ書き込まれる出力がありませ
ん。

最初の例では、-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.modf95 によって生成されます。

コンパイラは、現在のディレクトリを検索して、USE 文の中で引用されている各モジュールファイルを検索します。モジュールファイルは、USE 文で MODULE を引用しているソースファイルをコンパイルする前にコンパイルします。-M のコマンド行オプションを使用すると、検索パスにディレクトリを追加できます。ただし、個々の .mod ファイルをコマンド行で直接指定することはできません。

指令

Fortran の注釈の書式であるソースコード指令を使用して、特殊な最適化または並列化の選択に関する情報をコンパイラに渡すことができます。コンパイラ指令は、プラグマとも呼ばれます。コンパイラは、一連の一般指令および並列化指令を認識します。Fortran 95 も OpenMP 共有メモリマルチプロセッシング指令を処理します。

f95 に固有の指令については付録 Cで説明します。

f77 および f95 が認識する全指令の一覧は、付録 E に記載されています。


注 - 指令は Fortran 規格には含まれていません。

一般的な指令

一般的な Sun の Fortran 指令は次のような書式で使用します。

C$PRAGMA keyword ( a [ , a ] ... ) [ , keyword ( a [ , a ] ... ) ] ,... 
C$PRAGMA SUN keyword ( a [ , a ] ... ) [ , keyword ( a [ , a ] ... ) ] ,... 
C$PRAGMA SPARC keyword ( a [ , a ] ... ) [ , keyword ( a [ , a ] ... ) ] ,... 

変数 keyword は特定の指令を表します。追加の引数やサブオプションも指定できます。指令によっては、上記に示す SUNSPARC といった追加のキーワードを指定しなければなりません。

一般的な指令の構文は、次のとおりです。

制限事項は、次のとおりです。

C$PRAGMA Sun UNROLL=3

Fortran のコンパイラは、次の一般的な指令を認識します。

表 2-2   一般的な Fortran 指令
C 指令 C$PRAGMA C(list)
外部関数名のリストを C 言語ルーチンとして宣言します。
UNROLL 指令 C$PRAGMA SUN UNROLL=n 次のループが n 回まで展開できることをコンパイラに指示します。
WEAK 指示 C$PRAGMA WEAK(name[=name2]) name を弱いシンボルまたは name 2 の別名として宣言します。
OPT 指令 C$PRAGMA SUN OPT=n 副プログラムの最適化レベルに n を設定します。
PIPELOOP 指令 C$PRAGMA SUN PIPELOOP=n
反復間 n のループの依存関係を宣言する.
PREFETCH 指令 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_ONCE(name)
名前の参照のために、先読み命令を生成するようにコンパイラに要求します。 (Requires -xprefetch option.)


C 指令

C() 指令は、その引数が外部関数であることを指定します。これは、EXTERNAL 宣言と同義です。ただし、通常の外部名とは違って、Fortran コンパイラでは、これらの引数名に下線が付けられません。詳細は、『Fortran プログラミングガイド』の「C-Fortran インタフェース」の章を参照してください。

特殊な関数の C() 指令は、各副プログラム中にある、その関数への最初の引用よりも前に現われなければなりません。

例:C ABC XYZ をコンパイルします。

       EXTERNAL ABC, XYZ
C$PRAGMA C(ABC, XYZ)

UNROLL 指令

UNROLL 指令では、C$PRAGMA の後に SUN と指定する必要があります。

C$PRAGMA SUN UNROLL=n 指令は、ループを n 回展開するようにオプティマイザに指示します。(コンパイラは、解析の結果、ループの展開が適切であると判断した場合のみ展開します)。

n には正の整数を指定します。以下の選択肢があります。

実際に展開されたループがあると、実行可能ファイルのサイズが大きくなります。パフォーマンスと最適化についての詳細は、『Fortran プログラミングガイド』を参照してください。

例 : ループを 2 回展開するときは、次のように指定します。

C$PRAGMA SUN UNROLL=2

WEAK 指令

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=2
        SUBROUTINE 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 no
C    cross-iteration dependencies (E.g. K>N)
C$PRAGMA SUN PIPELOOP=0
      DO I=1,N
       A(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 並列化指令も受け付けます。

SUN/Cray の並列化指令の構文は以下のとおりです。

 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=openmpsun または -mp=openmpcray と指定します。コンマの後には空白文字を入れません。

コンパイラの利用方法

Sun Fortran コンパイラを効果的に利用するための方法をいくつか紹介します。

ハードウェアプラットフォームの特定

コンパイラフラグの中には、特定のハードウェアプラットフォームのオプションセットに合わせてコードを生成できるものもあります。fpversion ユーティリティを実行すると、ネイティブプロセッサのハードウェアプラットフォームの仕様を表示することができます。

demo% fpversion
A SPARC-based CPU is available.
 CPU's clock rate appears to be approximately 467.1 MHz.
 Kernel says CPU's clock rate is 480.0 MHz.
 Kernel says main memory's clock rate is 120.0 MHz.
 
 Sun-4 floating-point controller version 0 found.
 An UltraSPARC chip is available.
 FPU's frequency appears to be approximately 492.7 MHz.
 
 Use "-xtarget=ultra2i -xcache=16/32/1:2048/64/1" 
code-generation option.
 
 Hostid = hardware_host_id.

表示される値は、fpversion が呼び出されたときのシステムの負荷によって異なります。

詳細については fpversion(1) および『数値計算ガイド』を参照してください。

環境変数の使用

FFLAGS または OPTIONS 環境変数を設定して、オプションを指定することができます。

コマンド行で FFLAGS または OPTIONS のいずれかを明示的に指定します。make ファイルの暗黙のコンパイル規則を使用している場合は、make プログラムによって FFLAGS が自動的に使用されます。

例 : FLAGS を設定します (C シェル)。

demo% setenv FFLAGS '-fast -Xlist'

例 : FFLAGS を明示的に使用します。

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 プラットフォームでは、最適化でメモリーが不足した場合は、その時点の手続きを低いレベルで最適化し直し、後続のルーチンはコマンド行の -On オプションで指定されていた本来のレベルで最適化を再開します。

ワークステーションには最低 24M バイトのメモリーが実装されている必要があります。推奨値は 32M バイトです。メモリーの使用量は、手続きのサイズ、最適化レベル、仮想メモリーの制限、ディスクのスワップファイルのサイズ、その他さまざまな要素によって異なります。

多数のルーチンを含む単一のソースファイルをコンパイルすると、メモリーやスワップ領域が不足することがあります。

コンパイラのメモリーが不足する場合は、最適化レベルを下げてください。または
fsplit
(1) を使用して、複数のルーチンが含まれているソースファイルを、1 ルーチンが 1 ファイルに対応するようにいくつかのファイルに分割してください。

スワップ領域の制限

SunOSTM のオペレーティングシステムコマンド、swap -s により、利用可能なスワップ領域が表示されます。詳細は、swap(1M) を参照してください。

例 : swap コマンドを使用します。

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 bytes 
 demo# /usr/sbin/swap -a  /home/swapfile

仮想メモリーの制限

最適化レベル -O3 以上のレベルで大規模なルーチン (1 つの手続きが数千行ものコードで構成されるルーチン) をコンパイルすると、メモリーがさらに必要になる場合があり、コンパイル時間のパフォーマンスが低下することもあります。この問題には、1 つプロセスで利用できる仮想メモリーの量を制限することによって対処することができます。

例 : 仮想メモリーを 16MB に制限します。

 demo$ ulimit -d 16000

例 : 仮想メモリーを 16MB に制限します。

 demo% limit datasize 16M

いずれの場合も、オプティマイザは 16MB のデータ領域で最適化を再実行します。

この制限はマシンで利用可能なスワップ領域の総量を超えることはできないので、実際は、大規模なコンパイルの進行中であってもマシンを普通に使用できる程度の小さい値を指定してください。

コンパイル処理でスワップ領域の半分以上が使用されることのないように注意してください。

例 : 32MB のスワップ領域のあるマシンでは、次のコマンドを使用します。

sh の場合:

demo$ ulimit -d 1600

csh の場合:

demo% limit datasize 16M

最適な設定は、最適化のレベルや、利用可能な実メモリーと仮想メモリーの量によって異なります。

64 ビットの Solaris 環境では、アプリケーションデータセグメントのサイズに対する弱い制限値は 2GB です。データ領域を追加割り当てする必要がある場合は、シェルの limit または ulimit コマンドを使用して制限値を削除します。csh の場合 :

demo% limit datasize unlimited

shksh の場合 :

demo% unlimit -d unlimited

詳細は、『Solaris 64 ビット開発ガイド』を参照してください。


サン・マイクロシステムズ株式会社
Copyright information. All rights reserved.
ホーム   |   目次   |   前ページへ   |   次ページへ   |   索引