ホーム » システム » スーパーコンピュータシステムITO » 富士通コンパイラ利用法

富士通コンパイラ利用法

最終更新日:2019年1月17日

富士通コンパイラはHPCミドルウェアFUJITSU Software Technical Computing Suite (TCS)の一部を構成するソフトウェアです。 ここでは、主にプログラム言語Fortran、C、C++の翻訳・実行方法とバッチ処理方法について解説します。


利用環境

システム・利用範囲

  • サブシステムA
  • 九州大学構成員 学術研究機関構成員 民間利用の方
  • サブシステムB
  • 九州大学構成員 学術研究機関構成員 民間利用の方

利用コマンド

プログラム言語の翻訳・リンクのための書式とコマンドの一覧は以下の通りです。

コマンド [option] file [...]
言語処理系 コマンド 自動並列化* OpenMP*
非MPI並列 Fortran frt -Kparallel -Kopenmp
C fcc
C++ FCC
MPI並列 Fortran mpifrt
C mpifcc
C++ mpiFCC
データ並列 XPFortran xpfrt

* 自動並列化およびOpenMPオプションはデフォルトでは無効です。


利用方法

C/C++

C/C++コンパイラにはfcc / FCCコマンドを用います。 またIntel MPIを利用する場合には,mpifcc / mpiFCCコマンドを用います。 (以下のプログラム例では fccおよびmpifccのみを記載しますのでC++を使う場合はfccおよびmpiFCCに読み替えてください。)

例1)逐次プログラム

$ fcc -Kfast sample.c

例2)ノード内スレッド並列(自動並列)プログラム

$ fcc -Kfast,parallel sample.c

例3)ノード内スレッド並列(OpenMP)プログラム

$ fcc -Kfast,openmp sample.c

例4)MPI並列(フラットMPI)プログラム

$ mpifcc -Kfast sample.c

例5)ハイブリッド並列(OpenMP+MPI)プログラム

$ mpifcc -Kfast,openmp sample.c

Fortran

Fortranコンパイラは frt コマンドを利用します。 またMPIライブラリを使用する場合はmpifrt コマンドを利用します。

例1)逐次プログラム

$ frt -Kfast sample.f90

例2)ノード内スレッド並列(自動並列)Fortranプログラム

$ frt -Kfast,parallel sample.f90

例3)ノード内スレッド並列(OpenMP) Fortranプログラム

$ frt -Kfast,openmp sample.f90

例4)MPI並列(フラットMPI) Fortranプログラム

$ mpifrt -Kfast sample.f90

例5)ハイブリッド並列(OpenMP+MPI) Fortranプログラム

$ mpifrt -Kfast,openmp sample.f90

主なコンパイルオプション

コンパイルオプション 説明
-c オブジェクトファイルまで生成
-o exe_file 実行可能ファイル名/オブジェクトファイル名をexe_fileに変更
実行可能ファイル名を省略した場合にはa.out
-O[0, 1, 2, 3] 最適化レベルを指定。-Oの後の数字を省略した場合は-O3 (デフォルトでは-O2)
-Kfast 高速化のための最適化オプションを誘導(最適化での推奨オプション)
-Kparallel 自動並列化を行う (デフォルト: -Knoparallel)
-Kopenmp OpenMP Fortran 仕様ディレクティブを有効化。(デフォルト: -Knoopenmp)
-Kocl 最適化制御行を有効化(デフォルト: -Knoocl)
-I directory インクルードファイル、モジュールファイルを検索するディレクトリを指定
-Fixed (Fortranのみ) ソースコードが固定形式で記述されていることを指定
-Free (Fortranのみ) ソースコードが自由形式で記述されていることを指定
-Fwide (Fortranのみ) ソースコードの1行の長さが255の固定形式で記述されていることを指定
-fw wレベル(低レベルのエラー)およびsレベル(重度のエラー)の診断メッセージのみを出力
-fs sレベル(重度のエラー)の診断メッセージのみを出力
-Haefosux (Fortranのみ) 翻訳時および実行時に引数の整合性、添字式、部分列式の値、未定義な変数の参照または配列式の形状適合などを検査。
-Koptmsg[=level] 最適化状況をメッセージ出力
-Koptmsg=1: 実行結果に副作用を生じる可能性がある最適化をしたことを出力
-Koptmsg=2: optmsg=1に加えて自動並列化・SIMD化・ループアンローリングなどの最適化機能が動作したことを出力
-Koptmsgの後の数字を省略した場合は-Koptmsg=1(デフォルト: -Koptmsg=1)
-Qt 詳細な最適化情報及び統計情報を出力
-V コンパイラのバージョン情報を出力
-Xg (Cのみ) GNU Cコンパイラ仕様の言語仕様に基づいてコンパイル。-Xgオプションが指定された場合、C89規格でコンパイルする。 GNU拡張仕様とC99規格を同時に指定する場合には、-noansiオプションを同時に指定する必要がある
-Nsta (C/C++のみ) 統計情報を出力

C/C++ および Fortranの標準的なオプションとして、"-Kfast,parallel"を推奨します。 最適化機能は、プログラムデータの特性によって効果がある場合と、そうでない場合があり、実際に動作させて検証する必要があります。 詳しくは「C言語使用手引書 第3章 逐次最適化機能」、「C++言語使用手引書 第3章 逐次最適化機能」または「Fortran使用手引書 第9章 最適化機能」を参照してください。 なお、本コンパイラは、現時点で AVX512には対応していません。


実行時環境変数

Fortran / C / C++ プログラムにおいて実行時に指定可能な主な環境変数は以下の通りです。

環境変数 説明
PARALLEL

自動並列化によりスレッド並列化されたプログラムを実行する場合にスレッド数を指定。
省略時はジョブが利用可能なコア数が使用される。

OMP_NUM_THREADS

OpenMP によりスレッド並列化されたプログラムを実行する場合にスレッド数を指定。
省略時はジョブが利用可能なコア数が使用される。

THREAD_STACK_SIZE

スレッド毎のスタック領域の大きさをキロバイト単位で指定。
省略時は ulimit -s の値が使用される。 環境変数 OMP_STACKSIZE が指定されている場合大きい方の指定値が採用される。


数値計算ライブラリ

富士通コンパイラから利用できる数値演算ライブラリに BLAS / LAPACK / ScaLAPACK、およびSSL IIがあります。

BLAS / LAPACK / ScaLAPACK

ライブラリ名 バージョン 説明
BLAS - ベクトル演算や行列演算ライブラリ
※ Level3 全ルーチン,Level2 重要ルーチンでスレッド並列ルーチンを提供
LAPACK 3.2.2 線形代数ライブラリ
※ 重要ルーチンでスレッド並列ルーチンを提供
ScaLAPACK 1.8 線形代数メッセージパッシング並列ライブラリ
※ ScaLAPACK1.8 の追加機能を提供
BLAS / LAPACK / ScaLAPACK オプション一覧
利用ライブラリ 並列性 指定オプション 備考
BLAS 逐次 -SSL2
スレッド並列 -SSL2BLAMP
LAPACK 逐次 -SSL2
スレッド並列 -SSL2BLAMP
ScaLAPACK MPI並列 -SCALAPACK リンクする BLAS/LAPACK に応じて -SSL2 または
-SSL2BLAMP を指定

BLAS / LAPACK / ScaLAPACK ライブラリの詳細についてはマニュアル 「Technical Computing Suite V1.0 数学ライブラリの利用手引」を参照してください。

例1)逐次版 BLAS/LAPACK を利用する

$ frt -Kfast -SSL2 sample.f90
$ fcc -Kfast -SSL2 sample.c

例2)スレッド並列版 BLAS/LAPACK を利用する

$ frt -Kfast,openmp -SSL2BLAMP sample.f90
$ fcc -Kfast,openmp -SSL2BLAMP sample.c

例3)ScaPALACK(ノード内逐次版)を利用する

$ mpifrt -Kfast -SCALAPACK -SSL2 sample.f90
$ mpifcc -Kfast -SCALAPACK -SSL2 sample.c

例4) ScaLAPACK(ノード内スレッド並列版)を利用する

$ mpifrt -Kfast,openmp -SCALAPACK -SSL2BLAMP sample.f90
$ mpifcc -Kfast,openmp -SCALAPACK -SSL2BLAMP sample.c

SSL II(Scientific Subroutine Library II)

ライブラリ名 説明
SSL II スレッドセーフな逐次計算向け数値演算ライブラリ。
線形計算、固有値・固有ベクトル、非線形計算、極値問題、
補間・近似、変換、数値微積分、微分方程式、特殊関数、
疑似乱数サブルーチンなど
SSL II スレッド並列機能 並列効果の見込める重要機能にSMP向け並列処理に適合した
インターフェースで並列数値計算アルゴリズムを採用。
連立1次方程式の直接解法および反復解法、逆行列、
固有値問題、フーリエ変換、擬似乱数など
C-SSL II Fortran 版SSL II の逐次機能サブセットをC言語インター
フェースで利用可能にしたスレッドセーフな逐次版
C-SSL-II スレッド並列機能 Fortran 版SSL II スレッド並列機能のサブセットのC言語イン
ターフェース版
SSL II/MPI MPIで並列化された3次元フーリエ変換ルーチン
高速4倍精度基本演算ライブラリ 4倍精度の値を double-double 形式で表現し、高速に演算を行うライブラリ
SSL II系オプション一覧
利用ライブラリ 並列性 指定オプション 備考
SSL II
C-SSL II
逐次 -SSL2 -SSL2 もしくは -SSL2BLAMPどちらでも結合可能。
リンクする BLAS/LAPACK に応じてを指定する
スレッド並列 -SSL2BLAMP
SSL II/MPI MPI 並列 -SSL2MPI 同時に -SSL2 または -SSL2BLAMP を指定する

SSL II / C-SSL-II ライブラリは逐次機能とスレッド並列機能を持ちますがサブルーチン名が異なるため混在して利用可能です。 SSL II ライブラリの詳細はマニュアル「Technical Computing Suite V1.0 数学ライブラリの利用手引」を参照してください。

例1)逐次版SSL IIを利用する

$ frt -Kfast -SSL2 sample.f90

例2)スレッド並列版 SSL II を利用する

$ frt -Kfast,openmp -SSL2BLAMP sample.f90

例3)逐次版C-SSL II を利用する

$ fcc -Kfast,openmp -SSL2 sample.c

例4)SSL II/MPI を利用する

$ mpifrt -Kfast,openmp -SSL2MPI -SSL2 sample.f90

XPFortran

XPFortran コンパイラは xpfrt コマンドを利用します。

$ xpfrt -Kfast sample.f90

オプションの詳細はマニュアル「XPFortran使用手引書(PCクラスタ) 第2章言語処理システム」を参照してください。


バッチ処理

ITOのサブシステム A/Bで富士通コンパイラで作成した実行可能ファイル(モジュール)を実行するためには、 「バッチ処理」と呼ばれる手続きにより計算サーバーに処理の依頼をする必要があります。

バッチ処理の詳細は バッチ処理を参照してください。

以下に富士通コンパイラで翻訳した実行可能ファイルをバッチジョブにより処理するスクリプトの例を示します。


例1)逐次プログラム


  • 仮想ノード数
  • :1ノード(1プロセス)
  • 仮想ノードあたりのコア数(スレッド数)
  • :1コア(1スレッド)(リソースグループのコア数を指定)
  • 最大経過時間
  • :10分
  • 標準エラー出力と標準出力をまとめて標準出力に書き出す
  • :あり
  • ジョブリソースグループ(キュー)
  • :ito-single
    #!/bin/bash
    #PJM -L "rscunit=ito-a"
    #PJM -L "rscgrp=ito-single"
    #PJM -L "vnode=1"
    #PJM -L "vnode-core=1"
    #PJM -L "elapse=10:00"
    #PJM -j
    #PJM -X
    
    ./a.out
    
    
    サブシステム名(ito-a)の指定
    リソースグループ(ito-single)の指定
    仮想ノード数を指定
    仮想ノードあたりのCPUコア数を指定(リソースグループのコア数を指定)
    最大経過時間の指定
    標準エラー出力と標準出力をまとめて標準出力に書き出す
    ジョブ投入時の環境変数をジョブ実行環境に継承
    
    プログラムの実行
    

    例2)ノード内スレッド並列(OpenMP)プログラム

  • 仮想ノード数(プロセス数)
  • :1ノード(1プロセス)
  • 仮想ノードあたりのコア数(スレッド数)
  • :36コア(36スレッド、自動並列)(リソースグループのコア数を指定)
  • 最大経過時間
  • :10分
  • 標準エラー出力と標準出力を同じファイルにする
  • :あり
  • ジョブリソースグループ(キュー)
  • :ito-ss-dbg
    #!/bin/bash
    #PJM -L "rscunit=ito-a"
    #PJM -L "rscgrp=ito-ss-dbg"
    #PJM -L "vnode=1"
    #PJM -L "vnode-core=36"
    #PJM -L "elapse=10:00"
    #PJM -j
    #PJM -X
    
    export PARALLEL=36
    ./a.out
    
    
    サブシステム名(ito-a)の指定
    リソースグループ(ito-ss-dbg)の指定
    仮想ノード数を指定
    仮想ノードあたりのCPUコア数を指定(リソースグループのコア数を指定)
    最大経過時間の指定
    標準エラー出力と標準出力をまとめて標準出力に書き出す
    ジョブ投入時の環境変数をジョブ実行環境に継承
    
    自動並列用環境変数(実行時のスレッド数)指定
    プログラムの実行
    

    例3)ノード内スレッド並列(自動並列)プログラム

  • 仮想ノード数(プロセス数)
  • :1ノード(1プロセス)
  • 仮想ノードあたりのコア数(スレッド数)(リソースグループのコア数を指定)
  • :36コア(36スレッド、OpenMP並列)
  • 最大経過時間
  • :10分
  • 標準エラー出力と標準出力を同じファイルにする
  • :あり
  • ジョブリソースグループ(キュー)
  • :ito-ss-dbg
    #!/bin/bash
    #PJM -L "rscunit=ito-a"
    #PJM -L "rscgrp=ito-ss-dbg"
    #PJM -L "vnode=1"
    #PJM -L "vnode-core=36"
    #PJM -L "elapse=10:00"
    #PJM -j
    #PJM -X
    
    export OMP_NUM_THREADS=36
    ./a.out
    
    
    サブシステム名(ito-a)の指定
    リソースグループ(ito-ss-dbg)の指定
    仮想ノード数を指定
    仮想ノードあたりのCPUコア数を指定(リソースグループのコア数を指定)
    最大経過時間の指定
    標準エラー出力と標準出力をまとめて標準出力に書き出す
    ジョブ投入時の環境変数をジョブ実行環境に継承
    
    OpenMP環境変数(実行時のスレッド数)指定
    プログラムの実行
    

    例4)フラットMPI並列プログラム

  • 仮想ノード数(プロセス数)
  • :144ノード(144プロセス)(リソースグループのコア数以上を指定)
  • 仮想ノードあたりのコア数(スレッド数)
  • :1コア(1スレッド)
  • 最大経過時間
  • :10分
  • 標準エラー出力と標準出力を同じファイルにする
  • :あり
  • ジョブリソースグループ(キュー)
  • :ito-g-16-dbg
    #!/bin/bash
    #PJM -L "rscunit=ito-a"
    #PJM -L "rscgrp=ito-s-dbg"
    #PJM -L "vnode=144"
    #PJM -L "vnode-core=1"
    #PJM -L "elapse=10:00"
    #PJM -j
    #PJM -X
    
    mpiexec -n 144 ./a.out
    
    
    サブシステム名(ito-a)の指定
    リソースグループ(ito-s-dbg)の指定
    仮想ノード数を指定(リソースグループのコア数以上を指定)
    仮想ノードあたりのCPUコア数を指定
    最大経過時間の指定
    標準エラー出力と標準出力をまとめて標準出力に書き出す
    ジョブ投入時の環境変数をジョブ実行環境に継承
    
    プログラムの実行
    

    例5)ハイブリッド並列化プログラム

  • 仮想ノード数(プロセス数)
  • :24ノード(24プロセス)
  • 仮想ノードあたりのコア数(スレッド数)
  • :6コア(6スレッド)
    (仮想ノード数 * 仮想ノードあたりのコア数がリソースグループのコア数以上となるよう指定)
  • 最大経過時間
  • :10分
  • 標準エラー出力と標準出力を同じファイルにする
  • :あり
  • ジョブリソースグループ(キュー)
  • :ito-s-dbg
    #!/bin/bash
    #PJM -L "rscunit=ito-a"
    #PJM -L "rscgrp=ito-s-dbg"
    #PJM -L "vnode=24"
    #PJM -L "vnode-core=6"
    #PJM -L "elapse=10:00"
    #PJM -j
    #PJM -X
    
    export OMP_NUM_THREADS=6
    mpiexec -n 24 ./a.out
    
    
    サブシステム名(ito-a)の指定
    リソースグループ(ito-s-dbg)の指定
    仮想ノード数を指定
    仮想ノードあたりのCPUコア数を指定 (vnode * vnode-coreがリソースグループのコア数以上となるよう指定)
    最大経過時間の指定
    標準エラー出力と標準出力をまとめて標準出力に書き出す
    ジョブ投入時の環境変数をジョブ実行環境に継承
    
    OpenMP並列用環境変数(スレッド数)設定
    プログラムの実行
    

    MPI用のジョブオプション

    MPIジョブを実行する際に指定する主なオプションは以下の通りです。 --mpi オプションに続けてMPI 実行時の動作を指定します。 詳細はマニュアル「ジョブ運用ソフトウェア エンドユーザ向けガイド」を参照ください。

    オプション名 説明
    --mpi proc=num 静的に起動する最大プロセス数を指定
    省略時は仮想ノード数となる。
    --mpi rank-map-bynode[=rankmap] ノードに1プロセス生成すると次のノードに移動し、ラウンドロビンでランクを割り付ける
    (rank-map-bychipと排他)
    --mpi rank-map-bychip[:rankmap] ノードに [proc÷vnode-code](小数点以下切り上げ)のプロセスを生成すると
    次のノードに移動しランクを割り付ける(rank-map-bynodeと排他)
    --mpi rank-map-hostfile=filename filenameに従って生成するプロセスのランクを割り付ける