3.1.8.4. clangモード

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

注意

Clang/LLVMのオプションについては、ほぼすべてのオプションを利用することができますが「C言語使用手引書」-「9章 Clangモード」に掲載していないオプションを指定した場合、動作保証しません。

3.1.8.4.1. コンパイル方法

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

clangモードで翻訳する場合は、-Nclangオプションを有効にします。。

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

[_LNlogin]$ mpifccpx [-Nclangオプションを含むコンパイルオプション] ソースファイル名
  • MPIライブラリを使用しない場合

[_LNlogin]$ fccpx [-Nclangオプションを含むコンパイルオプション] ソースファイル名

参考

-Nclangオプションを含むオプションの並びと、ソースファイル名の並びの指定順序に制約はありません。

-Nclangオプションを含むオプションの並びと、ソースファイル名の並びを混在して指定してもかまいません。

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

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

コンパイルオプション

説明

-c

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

-o exe_file

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

-O [0|1|2|3|fast]

最適化のレベルを指定します。
-Oの後の文字を省略した場合は-O2になります。
オプション省略時は-O2です。

-fvectorize

ループ内の演算に対し、SIMD拡張命令を利用したオブジェクトを生成を指示します。
-O1 オプションが有効な場合、省略時は-fno-vectorizeオプションが適用されます。
-O2 オプション以上が有効な場合、省略時は-fvectorizeオプションが適用されます。
tradモードの-Ksimdと同じ指示です。

-fopenmp

OpenMP C 仕様のディレクティブを有効にします。サポートしている仕様はOpenMP 4.5/OpenMP 5.0(一部)です。
オプション省略時は-fnoopenmpです。
ファイル名の並びに-fopenmpオプションを指定して翻訳されたオブジェクトプログラムが含まれている場合、-fopenmpオプションを指定する必要があります。

-ffj-ocl

clangモードがサポートする富士通コンパイラ独自の最適化制御行(プラグマディレクティブ)を有効化します。。
オプション省略時は-ffj-no-oclです。

-I directory

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

-Rpass=.*

最適化情報を出力します。
tradモードの-Koptmsg=2と同じ指示です。

-std=[level]

コンパイラ(プリプロセッサを含む)が解釈する言語仕様のレベルを指定します。
levelには、c89、c99、c11、gnu89、gnu99、またはgnu11のいずれかを指定します。省略時は、-std=gnu11オプションが適用されます。

-ffj-src

ソースリストを出力します。
tradモードの-Nsrcと同じ指示です。

-ffj-lst[=p|t]

翻訳情報をファイルに出力することを指示します。翻訳情報は、サフィックス".lst"の付いたファイルへ出力します。
Cソースファイルを複数指定した場合には、各ファイル名.lstファイルに出力します。
-ffj-lstオプションが引数を省略して指定された場合、-ffj-lst=pが適用されます。
-ffj-lst=p

翻訳情報として、ソースリストと統計情報を出力することを指示します。

-ffj-lst=t

-ffj-lst=pでの出力に加えて、より詳細な最適化情報を出力することを指示します。

-ffj-largepage

作成する実行可能プログラムがラージページ機能を使用するか否かを指示します。本オプションはプログラムのリンク時に指定する必要があります。デフォルトは、-ffj-largepageです。ラージページ機能を使用しない場合は、-ffj-nolargepageオプションを使用します。また、-ffj-largepageオプションは、-fsanitizeオプションと同時に指定した場合、無効となります。

-mcpu

指定したプロセッサ向けのオブジェクトファイルを出力することを指示します。
省略値は、-mcpu=a64fx が適用されます。

-Nlibomp

並列処理にLLVM OpenMPライブラリを使用します。本オプションは、リンク時に指定する必要があります。省略時は、-Nlibompオプションが適用されます。

--version

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

参考

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

3.1.8.4.3. コンパイルの推奨オプション

CコンパイラのClangモードの最適化オプションとして、-Ofastを指定することを推奨します。

  • -Ofastオプションは「-O3 -ffj-fast-matmul -ffast-math -ffp-contract=fast -ffj-fp-relaxed -ffj-ilfunc -fbuiltin -fomit-frame-pointer -finline-functions」を指定した時と等価になります。

注意

推奨オプション以外の最適化機能は、プログラム・データの特性によって効果がある場合とそうでない場合があり、実際に試してみる必要があります。

以下に、オプションの詳細を示します。

  • -Ofastと等価になるオプション一覧

オプション

説明

-O3

最適化レベル1、および 2 よりも高度な最適化を実施します。

-ffj-fast-matmul *

行列積のループを高速なライブラリ呼び出しに変換します。

-ffast-math *

演算の評価方法を変更する最適化を行います。

-ffp-contract=fast *

Floating-Point Multiply-Add/Subtract演算命令を使用した最適化を行います。

-ffj-fp-relaxed *

単精度浮動小数点除算、倍精度浮動小数点除算およびsqrt関数について、逆数近似演算命令とFloating-Point Multiply-Add/Subtract命令を利用した逆数近似演算を行います。

-ffj-ilfunc *

数学関数をインライン展開します。-ffj-ilfuncオプションのオペランド章省略時は、-ffj-ilfunc=loopオプションが適用されます。

-fbuiltin

標準ライブラリ関数の動作を認識して、最適化を促進させます。

-fomit-frame-pointer

関数呼出しにおける、フレームポインタレジスタを保証しない最適化を行います。

-finline-functions

ソースプログラム上で定義された関数をインライン展開の対象にします。

注釈

*:最適化は演算結果に影響を与える場合があります。詳細は、マニュアル「C言語使用手引書」‐「第9章 clangモード」‐「浮動小数点演算に対する最適化とその副作用」を参照してください。

3.1.8.4.4. 環境変数(オプション指定)

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

  1. fccpx_ENV

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

    [優先順位]

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

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

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

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

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

    6. 省略値

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

    [_LNlogin]$ export fccpx_ENV=-Ofast
    

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

    参考

    -vオプションを指定した場合は、コマンド(翻訳)を実行します。

    -###オプションを指定した場合は、コマンド(翻訳)は実行しません。

    -v指定時の出力例】

    [_LNlogin]$ fccpx -Nclang -v clang_sample.c
    clang: Fujitsu C/C++ Compiler 4.1.0 (Dec 23 2019 15:40:15) (based on LLVM 7.1.0)
    Target: aarch64-unknown-linux-gnu
    Thread model: posix
    InstalledDir: (省略)
    Found candidate GCC installation: (省略)
    Found candidate GCC installation: (省略)
    Selected GCC installation: (省略)
    Candidate multilib: .;@m64
    Selected multilib: .;@m64
     "/opt/FJSVxtclanga/fujitsu_compilers_sve_cross_20191226/sve_cross/clang-comp/bin/clang-7"
     -cc1 -triple aarch64-unknown-linux-gnu -emit-obj -mrelax-all -disable-free
     -disable-llvm-verifier -discard-value-names -main-file-name clang_sample.c
     -mrelocation-model static -mthread-model posix -mdisable-fp-elim -fmath-errno
     -masm-verbose -mconstructor-aliases -munwind-tables -fuse-init-array
     -target-cpu a64fx -mllvm -enable-prefetch-hpc-tag -target-feature +v8.2a
     -target-feature +fp-armv8 -target-feature +neon -target-feature +crc
     -target-feature +crypto -target-feature +ras -target-feature +lse
     -target-feature +rdm -target-feature +sve -target-abi aapcs
     -mllvm -use-sve-vectorizer -fallow-half-arguments-and-returns -ffj-line
     -dwarf-column-info -debug-info-kind=line-tables-only -dwarf-version=4 -debugger-tuning=gdb -v
     -resource-dir /opt/FJSVxtclanga/fujitsu_compilers_sve_cross_20191226/sve_cross/clang-comp/lib64/clang/7.1.0
     -I /opt/FJSVxtclanga/.common/SELN003/include -I /opt/FJSVxtclanga/.common/TELI006/include
     -isysroot /opt/FJSVxos/devkit/aarch64/rfs -internal-isystem /opt/FJSVxos/devkit/aarch64/rfs/usr/local/include
     -internal-isystem /opt/FJSVxtclanga/fujitsu_compilers_sve_cross_20191226/sve_cross/clang-comp/bin/../include/external
     -internal-isystem /opt/FJSVxtclanga/fujitsu_compilers_sve_cross_20191226/sve_cross/clang-comp/lib64/clang/7.1.0/include
     -internal-externc-isystem /opt/FJSVxos/devkit/aarch64/rfs/include
     -internal-externc-isystem /opt/FJSVxos/devkit/aarch64/rfs/usr/include
     -fdebug-compilation-dir /home/users/fj0025/05_C/clang -ferror-limit 19 -fmessage-length 157
     -fno-signed-char -fobjc-runtime=gcc -fdiagnostics-show-option -fcolor-diagnostics
     -o /home/users/xxxxxx/clang_sample-903f6a.o -x c clang_sample.c -faddrsig
    clang -cc1 version 7.1.0 based upon LLVM 7.1.0 default target aarch64-unknown-linux-gnu
    ・・・(省略)
    
  2. TMPDIR

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

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

3.1.8.4.5. 並列処理用C言語ライブラリ

スーパーコンピュータ「富岳」では、並列処理用に2つのライブラリを提供します。

ライブラリ名

説明

LLVM OpenMPライブラリ

  • オープンソースソフトウェアであるLLVM OpenMP Runtime Libraryをベースにした並列化機能用のライブラリです。

  • サポートしている仕様は、OpenMP 4.5/OpenMP 5.0(一部)です。

  • clangモード、および、tradモードで利用できます。

  • tradモードはOpenMP 3.1/OpenMP 4.5(一部)を利用できます。

  • LLVM OpenMPライブラリの仕様については、C言語使用手引書「第4章 並列化機能」をお読みください。

富士通OpenMPライブラリ

  • tradモードでのみ利用できます。

  • 富士通OpenMPライブラリの仕様については、C言語使用手引書「付録J 富士通OpenMPライブラリ」をお読みください。

並列処理に使用するライブラリを指定します。
本オプションは、リンク時に指定する必要があります。

オプション

説明

-Nlibomp

OpenMPライブラリとして、LLVM OpenMPライブラリを使用することを指示します。

省略時は、-Nlibompオプションが適用されます。

-Nfjomplib

clangモードでは使用できません。

注意

-Nclangオプションが有効な場合、-Nfjomplibオプションは無効になり、-Nlibompオプションが有効になります。

注釈

OpenMP 4.0以降で追加された次の環境変数はLLVM OpenMPライブラリで利用可能です。 一方、富士通OpenMPライブラリはこれらの環境変数に未対応です。富士通OpenMPライブラリ使用時はこれらの環境変数は無視されます。

  • OMP_CANCELLATION

  • OMP_DISPLAY_ENV

  • OMP_DEFAULT_DEVICE

  • OMP_MAX_TASK_PRIORITY

3.1.8.4.6. コンパイル例

Cプログラムのコンパイル方法を示します。
ここでは、一般的なC言語のコンパイル手順を示します。

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

[_LNlogin]$ mpifccpx -Nclang -Ofast -fopenmp sample.c

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

[_LNlogin]$ fccpx -Nclang -Ofast sample.c

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

[_LNlogin]$ fccpx -Nclang -Ofast -fopenmp sample.c

3.1.8.4.7. Cサンプルプログラム

サンプルプログラムを使用して、コンパイルからジョブ実行までの例を示します。

3.1.8.4.8. 組込みデバッグ機能

組込みデバッグ機能は、コンパイル時にデバッグ用のオプションをつけてプログラムをコンパイルし、実行モジュールを実行することで各種検査を行うものです。

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

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

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

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

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

  • C/C++利用の場合、次の検査オプションを使用して組込みデバッグ機能で行います。

  • -fsanitize=undefinedオプション

配列の使用時において、宣言した配列のサイズと使用時の添字範囲の正当性を検査

  • -fsanitize=addressオプション

ヒープメモリに対して、メモリの不当な解放、領域外書込み、および、メモリリークを検査

詳細は、マニュアル「C言語使用手引書」の「第9章 Clangモード」-「9.1.2.2.1 コンパイラ全般に関連するオプション」の説明を参照してください。

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

  1. サンプルプログラム

1 #include <stdio.h>
2 int main() {
3   int data[3];
4   int p = 5;
5   data[p] = 20;
6 }
  1. コンパイル

[_LNlogin]$ fccpx -Nclang -Ofast -fsanitize=undefined -o sample_debug sample_debug.c

注釈

コンパイル時に以下の-ffj-largepageオプションは無効になるwarningが出力されます。

clang-6.0: warning: '-fsanitize' specified, '-ffj-largepage' ignored. [-Woption-ignored]
  1. 実行例

[_LNlogin]$ cat sample_debug.sh.5568.err
sample_debug.c:5:3: runtime error: index 5 out of bounds for type 'int [3]'
sample_debug.c:5:3: runtime error: store to address 0xffffffffe608 with insufficient space for an object of type 'int'
0xffffffffe608: note: pointer points here
00 40 00 00  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  8c 32 40 00 00 00 00 00  00 00 00 00