HOME > システム > SR16000 > SR16000 利用の手引き > 第6章 コンパイラ
第6章 コンパイラ
6.1 概要
SR16000には日立製作所のコンパイラの他、IBM製C/C++コンパイラもインストールされています。
さらに本システムではGNU Compiler Collection (gcc)も利用できます。機能、性能とも商用コンパイラには及ばないことが多いですが、広く使われているコンパイラであるため多くのソフトウェアでサポートされているという利点があります。
本章ではSR16000で使用できるこれらのコンパイラの使い方を、並列プログラムのコンパイル方法および最適化オプションを中心に紹介します。コンパイラの使い方は並列化の手法によって使用するコマンドと必須オプションが異なります。本章では以下の場合についてコマンドと必須オプションを列挙します。
- 並列化なし
- 並列化を行わない場合のコンパイル方法です。逐次実行が前提のライブラリや逐次部分のみを含んだプログラムのコンパイル方法です。
- 自動並列化
- コンパイラによって自動的に並列化するときに使用するコンパイル方法です。
- OpenMP
- 並列化のためのOpenMP指示文を含んだプログラムのコンパイル方法です。
- MPI
- ピュアMPI実行する並列プログラムのコンパイル方法です。
- MPI + 自動並列化
- MPIによって並列化したプログラムをさらに自動並列化によってノード内を並列化するときに使用するコンパイル方法です。
- MPI + OpenMP
- MPIによって並列化したプログラムをさらにOpenMPによってノード内を並列化するときに使用するコンパイル方法です。
6.2 日立製作所製 最適化 C/C++コンパイラ
6.2.1 推奨オプション
難しい説明を飛ばしてとりあえず使ってみたい方は次のようにコンパイルして下さい。典型的な数値計算プログラムでは通常安全なオプションですが場合によっては誤った結果となるやや危険なオプションを含んでいます。$ cc -Os -noparallel +Op program.c $ mpicc -Os -noparallel +Op mpi-program.c
6.2.2 コマンド
C言語のコンパイルコマンドは cc、C++言語のコンパイルコマンドは sCC となります。以下に使い方を示します。角括弧は省略可能(またはデフォルトで設定されている)ことを意味します。- 並列化なし
-
$ cc [-noparallel] [options] source_file
$ sCC [-noparallel] [options] source_file
- 自動並列化
-
$ cc -parallel [options] source_file
$ sCC -parallel [options] source_file
- OpenMP
-
$ cc -parallel -omp [options] source_file
$ sCC -parallel -omp [options] source_file
- MPI
-
$ mpicc [-noparallel] [options] source_file
$ mpisCC [-noparallel] [options] source_file
- MPI + 自動並列化
-
$ mpicc -parallel [options] source_file
$ mpisCC -parallel [options] source_file
- MPI + OpenMP
-
$ mpicc -parallel -omp [options] source_file
$ mpisCC -parallel -omp [options] source_file
6.2.3 最適化オプション
以下に示すレベルに従って最適化することができます。オプション無指定時はレベル3でコンパイルされます。なお、最適化機能には副作用を含むものがあり、プログラムによっては計算結果が異なったり、エラーが生じる場合があります。

これらの最適化オプションの他、性能に大きく影響することが知られているオプションに次のものがあります。

6.2.4 自動並列化オプション
自動並列化には並列化のレベルに応じて次のようなオプションがあります。

6.2.5 その他のオプション
分割コンパイル、リンクなどに使用するオプションは gcc など一般的なコンパイラと共通です。

6.3 日立製作所製 最適化FORTRAN90コンパイラ
6.3.1 推奨オプション
難しい説明を飛ばしてとりあえず使ってみたい方は次のようにコンパイルして下さい。典型的な数値計算プログラムでは通常安全なオプションですが場合によっては誤った結果となるやや危険なオプションを含んでいます。$ f90 -Oss -noparallel program.f90 $ mpif90 -Oss -noparallel mpi-program.f90
6.3.2 コマンド
日立製作所製最適化FORTRAN90コンパイラは f90 コマンドで起動します。f77コマンドはありませんが、FORTRAN77プログラムもf90コマンドでコンパイルすることができます。- 並列化なし
- $ f90 [-noparallel] [options] source_file
- 自動並列化
- $ f90 -parallel [options] source_file
- OpenMP
- $ f90 -parallel -omp [options] source_file
- MPI
- $ mpif90 [-noparallel] [options] source_file
- MPI + 自動並列化
- $ mpif90 -parallel [options] source_file
- MPI + OpenMP
- $ mpif90 -parallel -omp [options] source_file
言語仕様と形式はソースファイルの拡張子によって次のように設定されます。

6.3.3 言語オプション
拡張子に関わらず規格や形式を指定するには次のオプションを用います。

6.3.4 最適化オプション
以下に示すレベルに従って最適化することができます。オプション無指定時はレベル3でコンパイルされます。なお、最適化機能には副作用を含むものがあり、プログラムによっては計算結果が異なったり、エラーが生じる場合があります。

-Oss に含まれませんが、次のオプションも高速化につながる可能性があります。

6.3.5 自動並列化オプション
自動並列化には並列化のレベルに応じて次のようなオプションがあります。

6.3.6 その他のオプション
分割コンパイル、リンクなどに使用するオプションは一般的なコンパイラと共通です。

6.4 日立製作所製 最適化コンパイラ オプションの詳細
6.4.1 最適化の内容
前節までで日立製作所製最適化コンパイラの基本的なオプションを紹介しましたが、-Os などの最適化オプションは複数の最適化技術を組み合わせて使用することを示しており、アプリケーションによっては計算結果が変わってしまう最適化技術を含んでいます。以下に最適化オプション -Os または -Oss が行う最適化の種類と、それぞれの最適化手法を個別に選択するためのオプションをまとめます。
表6-4-1 -Os に含まれるオプション

表6-4-2 -Ossに含まれるオプション

6.4.2 最適化の個別設定と打ち消し
特定の最適化技術のみを使用する場合は表6-4-1および表6-4-2に示したオプションを個別に設定します。また -Oss や -Os が含む最適化技術の一部を無効化したいときは各オプションに no を付けたオプションを -Oss または -Os の後に置きます。特に、自動並列化を抑止するための -noparallel はピュアMPIプログラムのコンパイル時には必須となります。$ mpif90 -Oss -noparallel mpi-program.f90
6.4.3 並列化報告
チューニングのヒントのために並列化の報告を出力することができます。次のように -loglist オプションを付けてコンパイルして下さい。並列化ログはソースファイル名の拡張子を .log にしたファイルとして生成され、元のソースファイルにコメントを加える形で並列化状況が書き込まれます。$ mpif90 -Oss -loglist mpi-program.f90
6.5 日立製作所製 最適化コンパイラ 実行時オプションと環境変数
6.5.1 自動並列化およびOpenMPのスレッド数指定
自動並列化またはOpenMPによる並列化を行った場合、実行時のスレッド数は次の表にある環境変数で指定します。環境変数を設定しなかった場合は理論コア数(SR16000 では常に64)となります。

環境変数の具体的な指定方法は後の「使用例」の章に例を載せます。
6.5.2 FORTRANの実行時オプション
FORTRANプログラムの実行時にはプログラムの動作を変更するいくつかのオプションが指定できます。オプションは次のように -F に続けてオプションを書きます。$ ./a.out -F'RUNST(UFLOW),RUNST(OFLOW)'ただし、この方法はシェルの特殊文字との相性が悪く、特にバッチジョブでは正常にプログラムに渡らないことが多いので実行時オプションは上のようにプログラムの引数として指定するのではなく、次の例のように環境変数 HF_90USEROPTS に設定するようにしてください。
export HF_90USEROPTS='-FRUNST(UFLOW),RUNST(OFLOW)'
主なオプションは次の通りです。詳しくはオンラインマニュアルをご覧下さい。

6.6 IBM製 C/C++コンパイラ
6.6.1 推奨オプション
とりあえず使ってみたい方は次のようにコンパイルして下さい。$ xlc -qsmp=noauto program.c
6.6.2 コマンド
C言語のコンパイルコマンドは xlc、C++言語のコンパイルコマンドは xlC となります。また、MPIを使用する場合にはC言語のコンパイルコマンドはmpixlc、C++言語のコンパイルコマンドはmpixlCとなります。以下に使い方を示します。角括弧は省略可能を意味します。- 並列化なし
-
$ xlc -qsmp=noauto [options] source_file
$ xlC -qsmp=noauto [options] source_file
- 自動並列化
-
$ xlc -qsmp=auto [options] source_file
$ xlC -qsmp=auto [options] source_file
- OpenMP
-
$ xlc -qsmp=omp [options] source_file
$ xlC -qsmp=omp [options] source_file
- MPI
-
$ mpixlc [options] source_file
$ mpixlC [options] source_file
- MPI + 自動並列化
-
$ mpixlc -qsmp=auto [options] source_file
$ mpixlC -qsmp=auto [options] source_file
- MPI + OpenMP
-
$ mpixlc -qsmp=omp [options] source_file
$ mpixlC -qsmp=omp [options] source_file
6.6.3 最適化オプション
以下に示すレベルに従って最適化することができます。オプション無指定時はレベル2でコンパイルされます。なお、最適化機能には副作用を含むものがあり、プログラムによっては計算結果が異なったり、エラーが生じる場合があります。

6.6.4 自動並列化オプション
自動並列化には次のようなオプションがあります。

-qsmp 指定時のサブオプションのうち、主なものは次のようになります。

6.6.5 その他のオプション
分割コンパイル、リンクなどに使用するオプションは gcc など一般的なコンパイラと共通です。

プログラムのデバッグに利用できるオプションは次のものがあります

アーキテクチャに最適化するオプションは次のものがありますが、デフォルト(何も指定しない場合)では 64bit、POWER7に最適化されるようになっています。

6.7 GNU Compiler Collection
GCC のコマンドはC言語、C++、FORTRAN がそれぞれ gcc、 g++、 g95 です。詳しい使い方は info gcc コマンドなどでご確認下さい。
6.8 分割コンパイルとリンク
$ mpicc -parallel -omp -Os -c a.c $ mpicc -parallel -omp -Os -c b.c $ mpicc -parallel -omp a.o b.o -o programこのようにするとソースの変更があった場合も変更したソースのみをコンパイルするだけで済みます。分割コンパイルをするときは、変更があったファイルのみを自動的にコンパイルできる make と呼ばれるツールを使用するのが一般的です。なお各コンパイラ共、自動並列化、OpenMP 関連のオプションはコンパイル時、リンク時双方に必要です。