HOME > システム > SR16000 > SR16000 利用の手引き > 第6章 コンパイラ

第6章 コンパイラ

6.1 概要

SR16000では日立製作所製最適化C、C++、FORTRAN90コンパイラを標準のコンパイラとしています。このコンパイラは本センターでサービスを提供していた過去のスーパーコンピューター(SR11000, HA8000 クラスタシステムなど)のコンパイラと高い互換性を持つため、本センターを利用したことのある利用者はプログラムやコンパイル方法を変更することなくSR16000を利用できます。また、このコンパイラは高速な逐次コードを生成するだけでなく、高度な自動並列化機能を有することで知られており、本システムで初めてスーパーコンピュータを利用するユーザーにもお勧めできるコンパイラです。
SR16000には日立製作所のコンパイラの他、IBM製C/C++コンパイラもインストールされています。
さらに本システムではGNU Compiler Collection (gcc)も利用できます。機能、性能とも商用コンパイラには及ばないことが多いですが、広く使われているコンパイラであるため多くのソフトウェアでサポートされているという利点があります。
本章ではSR16000で使用できるこれらのコンパイラの使い方を、並列プログラムのコンパイル方法および最適化オプションを中心に紹介します。コンパイラの使い方は並列化の手法によって使用するコマンドと必須オプションが異なります。本章では以下の場合についてコマンドと必須オプションを列挙します。
並列化なし
並列化を行わない場合のコンパイル方法です。逐次実行が前提のライブラリや逐次部分のみを含んだプログラムのコンパイル方法です。
自動並列化
コンパイラによって自動的に並列化するときに使用するコンパイル方法です。
OpenMP
並列化のためのOpenMP指示文を含んだプログラムのコンパイル方法です。
MPI
ピュアMPI実行する並列プログラムのコンパイル方法です。
MPI + 自動並列化
MPIによって並列化したプログラムをさらに自動並列化によってノード内を並列化するときに使用するコンパイル方法です。
MPI + OpenMP
MPIによって並列化したプログラムをさらにOpenMPによってノード内を並列化するときに使用するコンパイル方法です。
▲ 第6章 コンパイラ TOPへ

6.2 日立製作所製 最適化 C/C++コンパイラ

本節では日立製作所の最適化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-1

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


表6-2-2

6.2.4 自動並列化オプション

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


表6-2-3

6.2.5 その他のオプション

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


表6-2-4
▲ 第6章 コンパイラ TOPへ

6.3 日立製作所製 最適化FORTRAN90コンパイラ

本節ではSR16000の標準FORTRANコンパイラである日立製作所製最適化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-1

6.3.3 言語オプション

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


表6-3-2

6.3.4 最適化オプション

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


表6-3-3

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


表6-3-4

6.3.5 自動並列化オプション

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


表6-3-5

6.3.6 その他のオプション

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


表6-3-6
▲ 第6章 コンパイラ TOPへ

6.4 日立製作所製 最適化コンパイラ オプションの詳細

6.4.1 最適化の内容

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


表6-4-1 -Os に含まれるオプション
表6-4-1

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

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章 コンパイラ TOPへ

6.5 日立製作所製 最適化コンパイラ 実行時オプションと環境変数

本節は実行時に設定する環境変数または実行時オプションについて説明します。

6.5.1 自動並列化およびOpenMPのスレッド数指定

自動並列化またはOpenMPによる並列化を行った場合、実行時のスレッド数は次の表にある環境変数で指定します。環境変数を設定しなかった場合は理論コア数(SR16000 では常に64)となります。


表6-5-1

環境変数の具体的な指定方法は後の「使用例」の章に例を載せます。

6.5.2 FORTRANの実行時オプション

FORTRANプログラムの実行時にはプログラムの動作を変更するいくつかのオプションが指定できます。オプションは次のように -F に続けてオプションを書きます。
 $ ./a.out -F'RUNST(UFLOW),RUNST(OFLOW)'
ただし、この方法はシェルの特殊文字との相性が悪く、特にバッチジョブでは正常にプログラムに渡らないことが多いので実行時オプションは上のようにプログラムの引数として指定するのではなく、次の例のように環境変数 HF_90USEROPTS に設定するようにしてください。
 export HF_90USEROPTS='-FRUNST(UFLOW),RUNST(OFLOW)'

主なオプションは次の通りです。詳しくはオンラインマニュアルをご覧下さい。


表6-5-2
▲ 第6章 コンパイラ TOPへ

6.6 IBM製 C/C++コンパイラ

本節では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-1

6.6.4 自動並列化オプション

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


表6-6-2

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


表6-6-3

6.6.5 その他のオプション

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


表6-6-4

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


表6-6-5

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


表6-6-6
▲ 第6章 コンパイラ TOPへ

6.7 GNU Compiler Collection

SR16000 には GNU Compiler Collection (GCC) がインストールされています。一般的に数値計算用途には前節までに紹介した商用コンパイラの方が高性能です。しかし性能がそれほど重要でないツール類やフリーソフトウェアのコンパイルには、世界中のユーザーによってテストされているGCCを使うのが最もトラブルが少ないと期待されます。
GCC のコマンドはC言語、C++、FORTRAN がそれぞれ gcc、 g++、 g95 です。詳しい使い方は info gcc コマンドなどでご確認下さい。
▲ 第6章 コンパイラ TOPへ

6.8 分割コンパイルとリンク

規模の大きなプログラムは複数のソースコードに分割し、分割コンパイルを行うことをお勧めします。分割コンパイルは各ソースコードのコンパイル時に -c オプションをつけてコンパイルし、生成されたオブジェクトファイルを最後にリンクします。次の例では上2行がコンパイルのみを行っており、最後の行がリンクを行っています。
 $ 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 関連のオプションはコンパイル時、リンク時双方に必要です。
▲ 第6章 コンパイラ TOPへ