3.1.9.3. tradモード

ここでは、tradモードについて説明します。

3.1.9.3.1. コンパイル方法

C++プログラムのコンパイル方法を示します。C++コンパイラはFCCpxを使用します。
MPIライブラリを使用する時は、mpiFCCpxを利用することにより、MPIのヘッダファイル、ライブラリを意識する必要がありません。

MPIライブラリを使用する場合

[_LNlogin]$ mpiFCCpx [コンパイルオプション] ソースファイル名

MPIライブラリを使用しない場合

[_LNlogin]$ FCCpx [コンパイルオプション] ソースファイル名

3.1.9.3.2. コンパイルオプション

C++コンパイラの主なコンパイルオプションを示します。

コンパイルオプション

説明

-c

オブジェクトファイルの作成までを行います。
翻訳処理の最後であるリンクを行いません。

-o exe_file

exe_fileに指定した実行可能ファイル名/オブジェクトファイル名を作成します。
ファイル名を省略した場合はa.outとなります。

-O [0|1|2|3]

最適化のレベルを指定します。
-Oの後の数字を省略した場合は-O2になります。
デフォルトは-O2です。

-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です。

-I directory

INCLUDEファイルを検索するディレクトリを指定します。

-Klargepage

ラージページ機能を使用する実行可能プログラムを作成するかどうかを指示します。本オプションはプログラムのリンク時に指定する必要があります。デフォルトは、-Klargepageです。ラージページ機能を使用しない場合は、-Knolargepageオプションを使用します。

-Koptmsg[=1|2]

最適化状況をメッセージ出力します。
-Koptmsg=1
実行結果に副作用を生じる可能性がある最適化をしたことをメッセージ出力します。
-Koptmsg=2
Koptmsg=1に加えて、自動並列化、SIMD化、ループアンローリングなどの最適化機能が動作したことをメッセージ出力します。
-Koptmsg
-Koptmsgの後の数字を省略した場合は-Koptmsg=1になります。
デフォルトは-Knooptmsgです。

-std=[level]

コンパイラ(プリプロセッサを含む)が解釈する言語仕様のレベルを指定します。
levelには、、c++98、c++03、c++11、c++14、c++17、gnu++98、gnu++03、gnu++11、gnu++14、gnu++17のいずれかを指定します。
省略時は、-std=gnu++14オプションが適用されます。

-stdlib=[name]

標準テンプレートライブラリ(STL)の種別を指定します。
nameには、libc++、または、libstdc++を指定します。
-stdlib=libc++
libc++ バージョン7.0を使用します。
-stdlib=libstdc++
libstdc++を使用します。
省略時は、-stdlib=libstdc++オプションが適用されます。

--alternative_tokens

2文字表記("<%"のような表記)および演算子キーワード("not"のような表記)を認識するか否かを指示します。
デフォルトは--no_alternative_tokensです。

-Klargepage

ラージページ機能を使用する実行可能プログラムを作成するかどうかを指示します。本オプションはプログラムのリンク時に指定する必要があります。デフォルトは、-Klargepageです。ラージページ機能を使用しない場合は、-Knolargepageオプションを使用します。

-Nlibomp

並列処理にLLVM OpenMPライブラリを使用します。本オプションはリンク時に指定する必要があります。デフォルトは-Nlibompです。並列処理に富士通OpenMPライブラリを使用する場合は、-Nfjomplibを指定します。

-NRtrap

実行時の割込み事象を検出するか否かを指示します。
デフォルトは-NRnotrapです。
本オプションは、プログラムの翻訳時およびリンク時に指定する必要があります。

-Nsrc

ソースリストを出力します。

-Nsta

統計情報を出力します。

-V

コンパイラのバージョン情報を標準エラーに出力します。

参考

C++コンパイラのコンパイルオプションについては、C++使用手引書「2.2 翻訳時オプション」を参照してください。

3.1.9.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_parallelKloop_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.9.3.4. 環境変数(オプション指定)

C++コンパイラ(FCCpx)が利用する環境変数を示します。

  1. FCCpx_ENV

    trad/clangモード共通の環境変数 FCCpx_ENV にコンパイルオプションを設定することができます。 FCCpx_ENV に定義されたコンパイルオプションは、自動でコンパイラに渡されます。 環境変数やシステムで定義されたコンパイラオプションには、次の優先順位があります。

    [優先順位]

    1. 翻訳コマンドのオペランド

    2. 翻訳時オプション設定用の環境変数(モード固有:FCCpx_trad_ENV、FCC_trad_ENV)

    3. 翻訳時オプション設定用の環境変数(モード共通:FCCpx_ENV、FCC_ENV)

    4. 翻訳時プロフィルファイル(モード固有:/etc$FJSVXTCLANGA/FCCpx_trad_PROF

    5. 翻訳時プロフィルファイル(モード共通:/etc$FJSVXTCLANGA/FCCpx_PROF

    6. 省略値

    推奨オプションを環境変数 FCCpx_ENV に設定する例を示します。

    [_LNlogin]$ export FCCpx_ENV=-Kfast,parallel
    

    有効になったコンパイルオプションは、-Nstaオプションを指定し、標準出力で確認することができます。

    [_LNlogin]$ FCCpx -Nsta sample.cc
    Fujitsu C/C++ Version 4.1.0   Tue Jan 21 15:10:28 2020
    Statistics information
      Option information
        Environment variable : (省略)
        Command line options : -Nsta
        Effective options    : -g0 -Qy -std=gnu++14 -O0 -Kcmodel=small -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 -Nexceptions -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
    
  2. TMPDIR

    環境変数TMPDIRを用いて、コンパイラが使用するテンポラリディレクトリを変更することができます。 /etc/profileTMPDIRにはホームディレクトリを設定しています。

    テンポラリディレクトリを変更する場合は、/tmpを使用しないようにしてください。 TMPDIRには/home/、または、/vol0n0m/data/の書き込み可能なディレクトリを指定してください。

3.1.9.3.5. 並列処理用C++ライブラリ

スーパーコンピュータ「富岳」では、以下のライブラリを提供します。

  • 標準テンプレートライブラリ(STL)としてlibc++

  • 並列処理用に、以下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.9.3.6. コンパイル例

C++プログラムのコンパイル例を示します。

マルチノードジョブ(ハイブリッド並列)

[_LNlogin]$ mpiFCCpx -Kfast,parallel,openmp sample.cc

シングルノードジョブ(逐次)

[_LNlogin]$ FCCpx -Kfast sample.cc

シングルノードジョブ(自動並列)

[_LNlogin]$ FCCpx -Kfast,parallel sample.cc

シングルノードジョブ(OpenMP)

[_LNlogin]$ FCCpx -Kfast,openmp sample.cc

3.1.9.3.7. 組込みデバッグ機能

組込みデバッグ機能は、コンパイル時にデバッグ用のオプションをつけてプログラムをコンパイルし、実行モジュールを実行することで各種検査を行うものです。 組込みデバッグ機能を利用する場合は最適化のレベルが-O0に落ちる場合があるため、実行時間が通常より長くなります。

  • 組込みデバッグ機能について

実行環境を変えると異常終了する場合があります。このような場合、原因として次のようなものが考えられます。

  1. 変数に初期値を設定せずに引用している

  2. 配列の添字が配列サイズを超えている

注釈

[実行環境を変える]とは次のような場合です。

  • プロファイラ等のツールを使用した

  • ラージページのサイズを変更した

この場合、実行モジュールのメモリ上の配置状況が変わるので、異常終了する場合があります。

これらを検査する組込みデバッグ機能について、ご紹介します。

  • C/C++利用の場合で、次の検査を組込みデバッグ機能で行います。

次の検査を、組込みデバッグ機能で行います。

  • 配列範囲の検査(-Nquickdbg=subchkオプション)

配列の添字が配列の範囲内にない場合、jwe1601i-wのメッセージが出力されます。

詳細は、マニュアル「C++言語使用手引書」の「第8章 プログラムのデバッグ」を参照してください。

-Nquickdbg=subchkのオプションに該当するように作成したサンプルプログラムで表示されるメッセージの例を示します。(サンプルプログラムはメッセージを出すために分かりやすい形にしています)

  1. サンプルプログラム

1 #include <cstdlib>
2 #include <iostream>
3 int main() {
4   int data[3];
5   int p = 5;
6   data[p] = 20;       /* ←jwe160i-wを検出 */
7 }
  1. コンパイル

[_LNlogin]$ FCCpx -Kfast -Nquickdbg=subchk -V -o sample sample.c
  1. 実行例

jwe1601i-w The outside of the range the array(data) was declared is used (offset : 20, declared size : 12).
 error occurs at main     line 6 loc 0000000000102750 offset 0000000000000070
 main         at loc 00000000001026e0 called from o.s.
taken to (standard) corrective action, execution continuing.