3.1.8.3. tradモード¶
ここでは、tradモードについて説明します。
3.1.8.3.1. コンパイル方法¶
MPIライブラリを使用する場合
[_LNlogin]$ mpifccpx [コンパイルオプション] ソースファイル名
MPIライブラリを使用しない場合
[_LNlogin]$ fccpx [コンパイルオプション] ソースファイル名
3.1.8.3.2. コンパイルオプション¶
Cコンパイラの主なコンパイルオプションを示します。
コンパイルオプション |
説明 |
---|---|
-c |
オブジェクトファイルの作成までを行います。
翻訳処理の最後であるリンクを行いません。
|
-o exe_file |
exe_file に指定した実行可能ファイル名/オブジェクトファイル名を作成します。ファイル名を省略した場合は
a.out となります。 |
-O [0|1|2|3] |
|
-Kfast |
ターゲットマシン上で高速に実行するオブジェクトプログラムを作成することを指示します。 |
-Ksimd[=1|2|auto] |
SIMD拡張命令を利用したオブジェクトを生成します。
-Ksimd=1 SIMD拡張命令を利用したオブジェクトを生成します。
-Ksimd=2 -Ksimd=1 オプションに加え、if文などを含むループに対して、SIMD拡張命令を利用したオブジェクトを生成します。-Ksimd=auto ループをSIMD化するかどうかをコンパイラが自動的に判定することを指示します。if文を含むループのSIMD化が促進されます。
-Ksimd -Ksimd の後の数字を省略した場合は-Ksimd=auto になります。-O2 オプション以上が有効な場合、省略時は、-Ksimd オプションが適用されます。-Ksimd オプションが有効な場合、-Kloop_part_simd オプションも有効になります。本オプションは、
-O2 オプション以上が有効な場合に意味があります。 |
-Kparallel |
自動並列を行います。デフォルトは
-Knoparallel です。本オプションは、
-O0 、または、-O1 オプションが有効な場合、無効となります。ファイル名の並びに
-Kparallel オプションを指定して翻訳されたオブジェクトプログラムが含まれている場合、-Kparallel オプションを指定する必要があります。 |
-Kopenmp |
OpenMP C 仕様のディレクティブを有効にします。サポートしている仕様はOpenMP 3.1/OpenMP 4.5(一部)です。
デフォルトは
-Knoopenmp です。ファイル名の並びに
-Kopenmp オプションを指定して翻訳されたオブジェクトプログラムが含まれている場合、-Kopenmp オプションを指定する必要があります。 |
-Kocl |
最適化制御行を有効にします。
デフォルトは
-Knoocl です。 |
-Klargepage |
ラージページ機能を使用する実行可能プログラムを作成するかどうかを指示します。本オプションはプログラムのリンク時に指定する必要があります。デフォルトは、 |
-Koptmsg[=1|2] |
最適化状況をメッセージ出力します。
-Koptmsg=1 実行結果に副作用を生じる可能性がある最適化をしたことをメッセージ出力します。
-Koptmsg=2 Koptmsg=1 に加えて、自動並列化、SIMD化、ループアンローリングなどの最適化機能が動作したことをメッセージ出力します。-Koptmsg -Koptmsg の後の数字を省略した場合は-Koptmsg=1 になります。デフォルトは
-Knooptmsg です。 |
-I directory |
INCLUDEファイルを検索するディレクトリを指定します。 |
-std=[level] |
コンパイラ(プリプロセッサを含む)が解釈する言語仕様のレベルを指定します。
levelには、c89、c99、c11、gnu89、gnu99、またはgnu11のいずれかを指定します。省略時は、
-std=gnu11 オプションが適用されます。 |
-Nlibomp |
並列処理にLLVM OpenMPライブラリを使用します。本オプションはリンク時に指定する必要があります。デフォルトは |
-NRtrap |
実行時の割込み事象を検出するか否かを指示します。
デフォルトは
-NRnotrap です。本オプションは、プログラムの翻訳時およびリンク時に指定する必要があります。
|
-Nsrc |
ソースリストを出力します。 |
-Nsta |
統計情報を出力します。 |
-V |
コンパイラのバージョン情報を標準エラーに出力します。 |
参考
Cコンパイラのコンパイルオプションについては、C言語使用手引書「2.2 翻訳時オプション」を参照してください。
3.1.8.3.3. コンパイルの推奨オプション¶
性能重視:
-Kfast,openmp[,parallel]
スレッド並列によるコア活用、SIMD化によるSVE活用、Software Pipeliningによる命令レベルの並列性向上、
最適化による演算順序変更、逆数近似演算の利用など、A64FXの性能をフルに引き出すためのオプション指定です。
精度重視:
-Kfast,openmp[,parallel],fp_precision
-O0と同じ精度にしたいが、最適化はある程度動かしたいという場合に利用します。
性能重視の推奨オプションに、精度に影響のあるすべての最適化を抑止する-Kfp_precisionオプションを
付加するオプション指定です。
性能に大きく影響する複数の最適化を抑止することになります。
-Kfast
オプションは「-O3 -Keval,fast_matmul,fp_contract,fp_relaxed,fz,ilfunc,mfunc,omitfp,simd_packed_promotion
」を指定した時と等価になります。-Kopenmp
オプションはOpenMP仕様の指示文を有効にします。-Kparallel
オプションは、-O2
、-Kregion_extension
、-Kloop_part_parallel
、Kloop_perfect_nest
、-mt
オプションを誘導します。ただし、-O3
オプションを同時に指定した場合(-Kfast
と同時に指定した場合など)は、-O3
が適用されます。-Kfp_precision
オプションは「-Knoeval,nofast_matmul,nofp_contract,nofp_relaxed,nofz,noilfunc,nomfunc,parallel_fp_precision
」を指定した時と等価です。
注意
推奨オプション以外の最適化機能は、プログラム・データの特性によって効果がある場合とそうでない場合があり、実際に試してみる必要があります。
以下に、オプションの詳細を示します。
-Kfast
と等価になるオプション一覧
コンパイルオプション
説明
-O3
最適化したオプジェクトを生成します。SIMD化、アンローリングなどの最適化を行います。-Keval *
演算の評価方法を変更する最適化を適用します。本オプションが有効な場合、-Ksimd_reduction_product
も有効になります。本オプションと-Kparallel
が有効な場合、-Kfsimple
、-Kreduction
も有効になります。-Kfsimple *
オブジェクトプログラムに対して浮動小数点演算の単純化を行います。
-Kreduction *
リダクションの最適化を行います。
-Ksimd_reduction_product *
乗算のリダクション演算に対して、SIMD化を行います。
-Kfast_matmul *
行列積のループを高速なライブラリ呼び出しに変換します。
-Kfp_contract *
Floating-Point Multiply-Add/Subtract命令を利用した最適化を行います。
-Kfp_relaxed *
単精度または倍精度の浮動小数点除算またはSQRT関数について、逆数近似演算命令とFloating-Point Multiply-Add/Subtract演算命令を利用します。-Kfz
flush-to-zeroモードを使用します。
-Kilfunc=procedure *
単精度および倍精度実数型の組込み関数をインライン展開します。
-Kmfunc *
マルチ演算関数を使用する最適化を行います。
-Komitfp
手続呼出しにおけるフレームポインタレジスタを保証しない最適化を行うことを指示します。本オプションが有効な場合、トレースバック情報が保証されません。-Ksimd_packed_promotion
単精度浮動小数点型ならびに4バイト整数型の配列要素のインデックス計算が 4バイトの範囲を超えないと仮定して、packed-SIMD化を促進します。
注釈
*:最適化は演算結果に影響を与える場合があります。詳細は、マニュアル「C言語使用手引書」の「第3章 最適化機能」の章を参照してください。
自動並列を行う
-Kparallel
から誘導されるオプション一覧
誘導されるオプション
説明
-O2
最適化レベルを指示します。
-Kregion_extension
パラレルリージョンを拡大します。
-Kloop_part_parallel
ループを分割して部分的に自動並列化します。
-Kloop_perfect_nest
不完全多重ループを分割して完全多重ループにするか否かを指示します。
-mt
マルチスレッドセーフオブジェクトを生成します。
3.1.8.3.4. 環境変数(オプション指定)¶
C言語コンパイラ(fccpx)が利用する環境変数を示します。
fccpx_ENV
trad/clangモード共通の環境変数 fccpx_ENV にコンパイルオプションを設定することができます。 fccpx_ENV に定義されたコンパイルオプションは、自動でコンパイラに渡されます。 環境変数やシステムで定義されたコンパイラオプションには、次の優先順位があります。
[優先順位]
翻訳コマンドのオペランド
翻訳時オプション設定用の環境変数(モード固有:fccpx_trad_ENV、fcc_trad_ENV)
翻訳時オプション設定用の環境変数(モード共通:fccpx_ENV、fcc_ENV)
翻訳時プロフィルファイル(モード固有:
/etc$FJSVXTCLANGA/fccpx_trad_PROF
)翻訳時プロフィルファイル(モード共通:
/etc$FJSVXTCLANGA/fccpx_PROF
)省略値
推奨オプションを環境変数 fccpx_ENV に設定する例を示します。
[_LNlogin]$ export fccpx_ENV=-Kfast,parallel
有効になったコンパイルオプションは、
-Nsta
オプションを指定し、標準出力で確認することができます。[_LNlogin]$ fccpx -Nsta sample.c Fujitsu C/C++ Version 4.1.0 Tue Jan 21 14:43:53 2020 Statistics information Option information Environment variable : (省略) Command line options : -Nsta Effective options : -g0 -Qy -std=gnu11 -O0 -Kcmodel=small -Kconst -Knofconst -Knofenv_access -Khpctag -Klargepage -Knolib -Klooptype=f -Knoopenmp -Knoopenmp_simd -Knooptlib_string -Knopc_relative_literal_loads -Knoparallel -Ksimd_reg_size=512 -KA64FX -KARMV8_3_A -KSVE -Ncancel_overtime_compilation -Nnocoverage -Nnoexceptions -Nnofjcex -Nfjprof -Nnohook_func -Nnohook_time -Nline -Nquickdbg=noheapchk -Nquickdbg=nosubchk -NRnotrap -Nnoreordered_variable_stack -Nrt_notune -Nsetvalue=noheap -Nsetvalue=nostack -Nsetvalue=noscalar -Nsetvalue=noarray -Nsetvalue=nostruct -Nsta
TMPDIR
環境変数
TMPDIR
を用いて、コンパイラが使用するテンポラリディレクトリを変更することができます。/etc/profile
でTMPDIR
にはホームディレクトリを設定しています。テンポラリディレクトリを変更する場合は、
/tmp
を使用しないようにしてください。TMPDIR
には/home/
、または、/vol0n0m/data/
の書き込み可能なディレクトリを指定してください。
3.1.8.3.5. 並列処理用C言語ライブラリ¶
スーパーコンピュータ「富岳」では、「並列処理」用に次の2つのライブラリを提供します。
ライブラリ名
説明
LLVM OpenMPライブラリ
オープンソースソフトウェアであるLLVM OpenMP Runtime Libraryをベースにした並列化機能用のライブラリです。
サポートしている仕様は、OpenMP 4.5/OpenMP 5.0(一部)です。
tradモード、および、clangモードで利用できます。
tradモードはOpenMP 3.1/OpenMP 4.5(一部)を利用できます。
LLVM OpenMPライブラリの仕様については、C言語使用手引書「第4章 並列化機能」をお読みください。
富士通OpenMPライブラリ
スーパーコンピュータ「京」、および、PRIMEHPC FX100以前のシステム向け富士通OpenMPライブラリをベースとした並列化機能用のライブラリです。
従来の富士通OpenMPライブラリとの互換を重視する場合に適しています。
サポートしている仕様は、OpenMP 3.1/OpenMP 4.5(一部)です。
tradモードでのみ利用できます。
富士通OpenMPライブラリの仕様については、C言語使用手引書「付録J 富士通OpenMPライブラリ」をお読みください。
並列処理用ライブラリを指定するには、以下のオプションをリンク時に指定する必要があります。
オプション
説明
-Nlibomp
OpenMPライブラリとして、LLVM OpenMPライブラリを使用することを指示します。
省略時は、こちらの
-Nlibomp
オプションが適用されます。-Nfjomplib
OpenMPライブラリとして、富士通OpenMPライブラリを使用することを指示します。
注意
-Nclang
オプションが有効な場合、-Nfjomplib
オプションは無効になり、-Nlibomp
オプションが有効になります。
注釈
OpenMP 4.0以降で追加された次の環境変数はLLVM OpenMPライブラリで利用可能です。 一方、富士通OpenMPライブラリはこれらの環境変数に未対応です。富士通OpenMPライブラリ使用時はこれらの環境変数は無視されます。
OMP_CANCELLATION
OMP_DISPLAY_ENV
OMP_DEFAULT_DEVICE
OMP_MAX_TASK_PRIORITY
並列処理用ライブラリと結合可能なC/C++オブジェクトファイルの組合せを下表に示します。
ライブラリ名
C/C++オブジェクトファイル tradモード
C/C++オブジェクトファイル clangモード
LLVM OpenMPライブラリ
結合可
結合可
富士通OpenMPライブラリ
結合可
結合不可
3.1.8.3.6. コンパイル例¶
マルチノードジョブ(ハイブリッド並列)
[_LNlogin]$ mpifccpx -Kfast,parallel,openmp sample.cシングルノードジョブ(逐次)
[_LNlogin]$ fccpx -Kfast sample.cシングルノードジョブ(自動並列)
[_LNlogin]$ fccpx -Kfast,parallel sample.cシングルノードジョブ(OpenMP)
[_LNlogin]$ fccpx -Kfast,openmp sample.c
3.1.8.3.7. Cサンプルプログラム¶
サンプルプログラムを使用して、コンパイルからジョブ実行までの例を示します。
3.1.8.3.8. 組込みデバッグ機能¶
組込みデバッグ機能は、コンパイル時にデバッグ用のオプションをつけてプログラムをコンパイルし、実行モジュールを実行することで各種検査を行うものです。
組込みデバッグ機能を利用する場合は最適化のレベルが-O0
に落ちる場合があるため、実行時間が通常より長くなります。
組込みデバッグ機能について
実行環境を変えると異常終了する場合があります。このような場合、原因として次のようなものが考えられます。
変数に初期値を設定せずに引用している
配列の添字が配列サイズを超えている
注釈
[実行環境を変える]とは次のような場合です。
プロファイラ等のツールを使用した
ラージページのサイズを変更した
この場合、実行モジュールのメモリ上の配置状況が変わるので、異常終了する場合があります。
これらを検査する組込みデバッグ機能について、ご紹介します。
C/C++利用の場合で、次の検査を組込みデバッグ機能で行います。
次の検査を、組込みデバッグ機能で行います。
配列範囲の検査(
-Nquickdbg=subchk
オプション)配列の添字が配列の範囲内にない場合、
jwe1601i-w
のメッセージが出力されます。詳細は、マニュアル「C言語使用手引書」の「第8章 プログラムのデバッグ」を参照してください。
-Nquickdbg=subchk
のオプションに該当するように作成したサンプルプログラムで表示されるメッセージの例を示します。(サンプルプログラムはメッセージを出すために分かりやすい形にしています)
サンプルプログラム
1 #include <stdio.h> 2 int main() { 3 int data[3]; 4 int p = 5; 5 data[p] = 20; /* ←jwe160i-wを検出 */ 6 }
コンパイル
[_LNlogin]$ fccpx -Kfast -Nquickdbg=subchk -o sample sample.c注釈
コンパイル時に変数が未使用である旨の warning が出力されますがここでは無視します。
"sample.c", line 3: warning: variable "data" was set but never used int data[3];
実行例
実行後、標準エラー出力に以下のメッセージが出力されます。
jwe1601i-w line 5 The outside of the range the array (data) was declared is used (offset:20, declared size:12). error occurs at main line 5 loc 0000000000400b18 offset 0000000000000024 main at loc 0000000000400af4 called from o.s. taken to (standard) corrective action, execution continuing.