3.3. LLVM¶
LLVMを基盤にもつ、C/C++/Fortran用コンパイラの利用方法を示します。 計算ノード向けバイナリを出力するLLVMはログインノード(Intel)、計算ノードの双方で利用可能です。
3.3.1. LLVMの利用方法¶
3.3.1.1. コンパイル環境設定¶
LLVMコンパイラは、
今までのバージョンも引き続きご利用できます。
LLVM19.1.4を利用したい方は、'LLVM v19.1.4' をご利用ください。
LLVM21.1.0を利用したい方は、後述の利用環境を設定で
LLVM/llvmorg-21.1.0を指定してください。
コンパイルを実行する前に以下を実行して利用環境を設定してください。
ログインノード
[_LNIlogin]$ module load LLVM/llvmorg-22.1.0
計算ノード
[_CNlogin]$ module load LLVM/llvmorg-22.1.0
利用できる環境は、以下のとおりです。
ソフトウェア名
言語
バージョン
コマンド
Clang
C
22.1.0
clang
Clang++
C++
22.1.0
clang++
Flang
Fortran
22.1.0
flang
3.3.1.2. コンパイルコマンド¶
LLVMを使用したC言語プログラムのコンパイル例を示します。 コマンドはログインノード、計算ノード共通です。 翻訳時オプションに関しては、LLVMのClang/Flangに準じます。
(特にflangでは翻訳に時間がかかる場合があります。 計算ノードで実行する際には、下に述べるようにpjsubのオプションでキャッシュ容量を多めに割り当ててください)
【逐次実行】
- ログインノード
[_LNIlogin]$ clang -O3 ソースファイル名
- 計算ノード
[_CNlogin]$ clang -O3 ソースファイル名
【OpenMP】
OpenMP利用には、"-fopenmp"をご使用ください。
- ログインノード
[_LNIlogin]$ clang -O3 -fopenmp ソースファイル名
- 計算ノード
[_CNlogin]$ clang -O3 -fopenmp ソースファイル名
【MPI】
MPIライブラリはmpiclang/mpiclang++/mpiflangコマンドにより利用可能です。
- ログインノード
[_LNIlogin]$ mpiclang -O3 -fopenmp source_file
- 計算ノード
[_CNlogin]$ mpiclang -O3 -fopenmp source_file
参考
上記例は、C++ (mpiclang++), Fortran (mpiflang) の場合も同様の方法となります。
LLVM22の富士通MPIは富士通コンパイラ環境内のライブラリを使用しており、モジュール非互換のためmpiflangコマンドで翻訳時に以下のエラーメッセージを出力してリンクエラーになる場合があります。
リンク時エラーメッセージ例
undefined reference to `_QMmpi_f08_callbacksPmpi_type_null_copy_fn'
undefined reference to `_QMmpi_f08_typesPompi_comm_op_eq'
flang-22: error: linker command failed with exit code 1 (use -v to see invocation)
このエラーは以下の全てを満たす場合に発生します。
use mpi_f08を使用する。
mpi_f08の構成要素であるmpi_f08_callbacksモジュールまたはmpi_f08_typesモジュールに定義されているモジュール副プログラムを使用する。
- エラーになる場合は、mpiflangコマンドのオプションに以下を追加してください。
-L/vol0004/apps/r/OSS_CN/llvm-22.1.0/fj-mpi-tcs/libmpi_usempif
- また、実行時のLD_LIBRARY_PATHにも以下のパスを追加してください。
/vol0004/apps/r/OSS_CN/llvm-22.1.0/fj-mpi-tcs/libmpi_usempif
注意
LD_LIBRARY_PATHに指定する /vol0004/apps/r/OSS_CN/llvm-22.1.0/fj-mpi-tcs/libmpi_usempif は ${LLVM_BASEDIR}/lib64 より先に記載する必要があります。
ジョブスクリプトによるコンパイル例
計算ノードにジョブを割り当てる際には、pjsubのオプションに--llio cn-cache-size=1Giを指定してください。 指定しない場合、翻訳時間が長くなる可能性があります。
#!/bin/sh -x #PJM -L "node=1" #PJM -L "rscgrp=small" #PJM -L "elapse=01:00:00" #PJM -x PJM_LLIO_GFSCACHE=/vol0004 #PJM -g groupname #PJM --llio cn-cache-size=1Gi #PJM -s # module purge module load LLVM/llvmorg-22.1.0 mpiclang -o sample1.out sample1.c
3.3.1.3. 実行方法¶
コンパイルされたプログラムの実行は、ジョブスクリプト、インタラクティブジョブ双方で可能です。
ジョブスクリプト例を示します。 高並列で実行する場合は、性能向上のため、実行ファイルとLLVMライブラリをllio_transferを使い転送してください。
#!/bin/sh -x #PJM -L "node=128" #PJM --mpi "max-proc-per-node=4" #PJM -L "rscgrp=small" #PJM -L "elapse=01:00:00" #PJM -x PJM_LLIO_GFSCACHE=/vol0004 #PJM -g groupname #PJM -s # module purge module load LLVM/llvmorg-22.1.0 llio_transfer `find ${LLVM_BASEDIR}/lib64 -type f -name \*.so\*` llio_transfer sample1.out mpiexec ./sample1.out
参考
C++, Fortranプログラムの実行も同様の方法となります。
注釈
LLVM21.1.0 を利用する場合はMPIライブラリ(${MPI_HOME}/lib64 配下のファイル)もllio_transferを使い転送してください。
3.3.1.4. ライブラリの利用¶
このLLVMで利用できるOpenBLAS、 FFTWが用意されています。
こちらのライブラリは他のコンパイラからは使用できません。
3.3.1.4.1. OpenBLASの利用方法¶
- 格納場所は以下です。
ライブラリの分類
インストールディレクトリ
LP64, 逐次
/vol0004/apps/r/OSS_CN/llvm/openblas-seq
LP64, スレッド並列
/vol0004/apps/r/OSS_CN/llvm/openblas-omp
ILP64, 逐次
/vol0004/apps/r/OSS_CN/llvm/openblas-seq-ilp64
ILP64, スレッド並列
/vol0004/apps/r/OSS_CN/llvm/openblas-omp-ilp64
3.3.1.4.1.1. プログラム翻訳方法¶
OpenBLASを利用するプログラムを翻訳する場合は、LLVMを使用するための環境設定を行った上で、 リンク時のオプションに-lopenblasを追加してください。
またスレッド並列ライブラリを利用する場合は、オプションに-fopenmpを追加してください。
さらに言語に応じて、以下のオプションを追加してください。
C/C++の場合:
-Lオプションおよび-IオプションでOpenBLASをインストールしたディレクトリ(${OPENBLAS_DIR})のライブラリおよびヘッダを指定してください
-lflang_rt.runtime -lm を指定してください
Fortranの場合:
-LオプションでOpenBLASをインストールしたディレクトリ(${OPENBLAS_DIR})のライブラリを指定してください
3.3.1.4.1.2. プログラム実行方法¶
OpenBLASを利用するプログラムを実行する場合は、LD_LIBRARY_PATHに${OPENBLAS_DIR}/libを追加してください。
オリジナルOpenBLASからの変更点
オリジナルOpenBLAS 0.3.26に対して、A64FX向けに以下のルーチンをチューニングしています。
DGEMM
SGEMM
3.3.1.4.2. FFTWの利用方法¶
FFTWは/vol0004/apps/r/OSS_CN/llvm/fftw3に格納されています(FFTW_DIR)。
3.3.1.4.2.1. プログラム翻訳方法¶
FFTWを利用するプログラムを翻訳する場合は、LLVMを使用するための環境設定を行った上で、 リンク時のオプションに以下のライブラリを追加してください。
単精度の逐次ライブラリ : -lfftw3f
単精度のスレッド並列ライブラリ : -lfftw3f_omp -lfftw3f
倍精度の逐次ライブラリ : -lfftw3
倍精度のスレッド並列ライブラリ : -lfftw3_omp -lfftw3
またスレッド並列ライブラリを利用する場合は、オプションに-fopenmpを追加してください。
さらに-Lオプションおよび-IオプションでFFTWをインストールしたディレクトリ(${FFTW_DIR})のライブラリおよびヘッダを指定してください。
3.3.1.4.2.2. プログラム実行方法¶
FFTWを利用するプログラムを実行する場合は、LD_LIBRARY_PATHに${FFTW_DIR}/libを追加してください。
オリジナルFFTWからの変更点
各種SIMD命令に対応するためのヘッダファイルをSVE命令に対応
プラン生成と呼ばれる自動チューニング機構で、選択されない処理ルートを除去することで効率化を実施
3.3.1.5. 注意事項¶
3.3.1.5.1. REAL(KIND=16) および COMPLEX(KIND=16) 型に関する注意点¶
ログインノード上にあるクロス環境のflangでは、 REAL(KIND=16)およびCOMPLEX(KIND=16)型を使用したFortranプログラムのコンパイル時に、 以下のエラーが発生します。
エラーが発生する翻訳例
flang complex16.f90 error: Semantic errors in complex16.f90 ./complex16.f90:3:3: error: COMPLEX(KIND=16) is not an enabled type for this target complex(kind=16) :: x ^^^^^^^^^^^^^^^^^^^^^flang real16.f90 error: Semantic errors in real16.f90 ./real16.f90:3:3: error: REAL(KIND=16) is not an enabled type for this target real(kind=16) :: x, y, z ^^^^^^^^^^^^^^^^^^^^^^^^
回避方法
この制限はログインノード上にあるクロス環境のflangに特有のものであり、計算ノード上にあるネイティブ環境のflangでは 正常にコンパイルが可能です。 そのため、これらの型を使用する場合は、計算ノードにあるネイティブ環境のflangを用いて コンパイルを行ってください。
3.3.1.5.2. 言語間結合における注意事項¶
3.3.1.5.2.1. 結合時の翻訳コマンドと必須オプション¶
LLVMコンパイラで作成したFortran、C、C++のオブジェクトプログラムを組み合わせて結合する際には、以下の点に注意してください。
- C++オブジェクト(libstdc++を利用)をリンクする場合
コマンドclangまたはflangを使用してリンクする際は、オプション
-lstdc++を指定してください。- C++オブジェクト(libc++を利用)をリンクする場合
コマンドclangまたはflangを使用してリンクする際は、オプション
-lc++を指定してください。- Fortranオブジェクトをリンクする場合
コマンドclangまたはclang++を使用してリンクする際は、以下のオプションを指定してください。
-lflang_rt.runtime -lm
3.3.2. 富士通コンパイラからの移行¶
本章では、富士通コンパイラで開発・ビルドされたアプリケーションを、LLVM(https://llvm.org/)コンパイラ環境へ円滑に移行するために、両コンパイラの仕様および動作の違いについて説明します。
3.3.2.1. 翻訳コマンド¶
富士通コンパイラとLLVMコンパイラの翻訳コマンドの違いを示します。富士通コンパイラの場合、ネイティブコンパイラとクロスコンパイラでコマンド名が異なります。一方、LLVMコンパイラでは、ネイティブ/クロスの区別なく同一のコマンド名になります。
項目 |
富士通コンパイラ |
LLVMコンパイラ |
|---|---|---|
C コンパイラ |
fcc
fccpx
|
clang |
C++ コンパイラ |
FCC
FCCpx
|
clang++ |
Fortran コンパイラ |
frt
frtpx
|
flang |
3.3.2.2. 翻訳時オプション¶
3.3.2.2.1. 翻訳時オプションの対応¶
富士通コンパイラ(tradモード、clangモード)とLLVMコンパイラでは、翻訳時オプションの体系や指定方法に違いがあります。本節では、両コンパイラの翻訳時オプション対応表を、移行時の参考情報として提示します。
表:共通機能を持つ翻訳時オプションでは、富士通コンパイラとLLVMコンパイラでオプション名が共通で、機能概要も同一である翻訳時オプションを一覧化しています。表:類似機能を持つ翻訳時オプション(C/C++コンパイラ向け)および表:類似機能を持つ翻訳時オプション(Fortranコンパイラ向け)は、オプション名は異なるが、機能概要は同一である翻訳時オプションをまとめています。
注釈
富士通コンパイラ固有の翻訳時オプション(例:-Kや-ffj)は、LLVMコンパイラでは利用できません。これらを指定すると翻訳時エラーとなり、処理は中断されます。富士通コンパイラ固有の翻訳時オプションの例は、非互換機能を参照ください。
機能概要が同じオプションであっても、最適化の結果が異なる場合があります。 移行後は、動作検証を行うことを推奨します。
オプション名 |
|---|
-Dname[=tokens] |
-E |
-Idir |
-Ldir |
-P |
-S |
-Uname |
-Wtool,arg1[,arg2]… |
-c |
-g |
-g0 |
-lname |
-o pathname |
-shared |
-v |
-w |
富士通コンパイラ tradモードのオプション名 |
富士通コンパイラ clangモードのオプション名 |
LLVMコンパイラのオプション名 |
|---|---|---|
-KA64FX |
-mcpu=a64fx |
-mcpu=a64fx |
-KARMV8_1_A |
-march=armv8.1-a |
-march=armv8.1-a |
-KARMV8_2_A |
-march=armv8.2-a |
-march=armv8.2-a |
-KARMV8_3_A |
-march=armv8.3-a |
-march=armv8.3-a |
-KARMV8_A |
-march=armv8-a |
-march=armv8-a |
-KGENERIC_CPU |
-mcpu=generic |
-mcpu=generic |
-K{PIC|pic} |
-f{PIC|pic} |
-f{PIC|pic} |
-Kcmodel={small|large} |
-mcmodel={small|large} |
-mcmodel={small|large} |
-K{eval|noeval} |
-f{fast-math|no-fast-math} |
-f{fast-math|no-fast-math} |
-Kfast |
-Ofast |
-O3 -ffast-math |
-Kfp_contract |
-ffp-contract=fast |
-ffp-contract={fast|on|fast-honor-pragmas} |
-Knofp_contract |
-ffp-contract=off |
-ffp-contract=off |
-Kfp_relaxed |
-ffj-fp-relaxed |
-freciprocal-math -mrecip |
-Knofp_relaxed |
-ffj-no-fp-relaxed |
-fno-reciprocal-mathまたは -mrecip=none |
-K{largepage|nolargepage} |
-ffj-{largepage|no-largepage} |
ラージページ機能参照 |
-K{lib|nolib} |
-f{builtin|no-builtin} |
-f{builtin|no-builtin} |
-Kloop_fission |
-ffj-loop-fission |
-mllvm -enable-loop-distribute |
-K{omitfp|noomitfp} |
-f{omit-frame-pointer|no-omit-frame-pointer} |
-f{omit-frame-pointer|no-omit-frame-pointer} |
-K{openmp|noopenmp} |
-f{openmp|no-openmp} |
-f{openmp|no-openmp} |
-K{openmp_simd|noopenmp_simd} |
-f{openmp-simd|no-openmp-simd} |
-f{openmp-simd|no-openmp-simd} |
-Koptmsg=2 |
-Rpass=.* |
-Rpass=.* |
-K{simd|nosimd} |
-f{vectorize|no-vectorize} |
-f{vectorize|no-vectorize} |
-K{strict_aliasing|nostrict_aliasing} |
-f{strict-aliasing|no-strict-aliasing} |
-f{strict-aliasing|no-strict-aliasing} |
-Kswp |
-ffj-swp |
-mllvm -aarch64-enable-pipeliner |
-K{unroll|nounroll} |
-f{unroll-loops|no-unroll-loops} |
-f{unroll-loops|no-unroll-loops} |
-N{exceptions|noexceptions} |
-f{exceptions|no-exceptions} |
-f{exceptions|no-exceptions} |
-V |
--version |
--version |
{-x-|-x0} |
-f{inline-functions|no-inline-functions} |
-f{inline-functions|no-inline-functions} |
富士通コンパイラのオプション名 |
LLVMコンパイラのオプション名 |
|---|---|
-KA64FX |
-mcpu=a64fx |
-KARMV8_1_A |
-march=armv8.1-a |
-KARMV8_2_A |
-march=armv8.2-a |
-KARMV8_3_A |
-march=armv8.3-a |
-KARMV8_A |
-march=armv8-a |
-KGENERIC_CPU |
-mcpu=generic |
-K{PIC|pic} |
-f{PIC|pic} |
-Kcmodel={small|large} |
-mcmodel={small|large} |
-K{eval|noeval} |
-f{fast-math|no-fast-math} |
-Kfast |
-O3 -ffast-math -fstack-arrays |
-Kfp_contract |
-ffp-contract={fast|on} |
-Knofp_contract |
-ffp-contract=off |
-Kfp_relaxed |
-freciprocal-math -mrecip |
-Knofp_relaxed |
-fno-reciprocal-mathまたは -mrecip=none |
-K{largepage|nolargepage} |
ラージページ機能参照 |
-K{omitfp|noomitfp} |
-f{omit-frame-pointer|no-omit-frame-pointer} |
-K{openmp|noopenmp} |
-f{openmp|no-openmp} |
-Koptmsg=2 |
-Rpass=.* |
-K{simd|nosimd} |
-f{vectorize|no-vectorize} |
-Kswp |
-mllvm -aarch64-enable-pipeliner |
-K{unroll|nounroll} |
-f{unroll-loops|no-unroll-loops} |
-V |
--version |
3.3.2.2.2. 翻訳時オプションの有効条件と省略時の動作¶
LLVMコンパイラの一部の翻訳時オプションでは、明示的に指定した場合の有効条件(最適化レベルや前提オプションの有無など)や、省略時のデフォルト動作が、富士通コンパイラと異なります。
下表に、現時点で判明している範囲について、富士通コンパイラとLLVMコンパイラの有効条件と誘導条件を示します。
翻訳時オプションの詳細や否定形の翻訳時オプションについては、公式ドキュメント(※)などを参照ください。
(※)LLVMのバージョンによって参照すべきドキュメントが異なるため、LLVM Releaseサイト https://releases.llvm.org/ にアクセスし、使用しているバージョンに対応したドキュメントをご確認ください。
富士通(tradモード)
①オプションが有効になる条件
②オプションを誘導する条件
|
富士通(clangモード)
①オプションが有効になる条件
②オプションを誘導する条件
|
LLVM
①オプションが有効になる条件
②オプションを誘導する条件
|
|---|---|---|
-x-
①-O1以上
②-O3以上
|
-finline-functions
①-O2以上
②-O2以上
|
-finline-functions
①-O1以上
②-O1以上
|
-Kswp
①-O1以上
②-O2以上
|
-ffj-swp
①-O1以上
②なし(明示指定のみ)
|
-mllvm -aarch64-enable-pipeliner
①-O1以上
②なし(明示指定のみ)
|
-Kfp_contract
①-O1以上
②-Kfast指定
|
-ffp-contract=fast (※1)
①-O1以上
②-Ofast指定
|
-ffp-contract=fast (※2)
①-O1以上
②-ffast-math指定
|
-Kunroll
①-O1以上
②-O2以上
|
-funroll-loops
①-O1以上
②-O2以上
|
-funroll-loops
①-O1以上
②-O2以上
|
-Ksimd[=auto]
①-O2以上
②-O2以上
|
-fvectorize
①-O1以上
②-O2以上
|
-fvectorize
①-O1以上
②-O2以上
|
-Kfp_relaxed
①-O1以上
②-Kfast指定
|
-ffj-fp-relaxed
①-O1以上
②-Ofast指定
|
-freciprocal-math -mrecip
①-O1以上かつ、-fno-honor-infinitiesまたは -freciprocal-math または-ffast-math
②なし(明示指定のみ) (※3)
|
-Kloop_fission (※4)
①-O2以上
②-O2以上
|
-ffj-loop-fission (※4)
①-O2以上
②-O2以上
|
-mllvm -enable-loop-distribute
①-O1以上
②なし(明示指定のみ)
|
-Komitfp
①-O1以上
②-Kfast指定
|
-fomit-frame-pointer (※5、※6)
①なし(最適化レベルに依存しない)
②-Ofast指定
|
-fomit-frame-pointer (※5、※6)
①なし(最適化レベルに依存しない)
②なし(明示指定のみ) (※3)
|
※1 富士通コンパイラ(clangモード)には-ffp-contract=onの指定も存在します。-ffp-contract=onは、最適化レベルに関わらず有効になります。-ffp-contract=[on|fast|off]を省略した場合、-ffp-contract=onが適用されます。
※2 LLVMコンパイラには-ffp-contract=[on|fast-honor-pragmas]の指定も存在します。-ffp-contract=onは、最適化レベルに関わらず有効になります。-ffp-contract=fast-honor-pragmasは、-O1以上で有効になります。-ffp-contract=[on|fast|fast-honor-pragmas|off]を省略した場合、-ffp-contract=onが適用されます。
※3 -ffast-mathから-freciprocal-mathのみ誘導しますが、-mrecipは誘導しません。
※4 富士通コンパイラでは、-Kloop_fission(tradモード)/ -ffj-loop-fission(clangモード)を単独で指定してもループ分割は行われません。ループ分割を有効にするには、最適化指示子loop_fission_targetで対象ループを指定するか、fission_point(tradモードのみ)で分割位置を指定する必要があります。
※5 富士通コンパイラ(clangモード)の-fno-omit-frame-pointerオプションを指定した場合は、-mno-omit-leaf-frame-pointerを誘導します。LLVMコンパイラの-fno-omit-frame-pointerを指定した場合は、-mno-omit-leaf-frame-pointerを誘導しません。
※6 富士通コンパイラ(clangモード)の-fomit-frame-pointerオプションを指定した場合は、-momit-leaf-frame-pointerを誘導します。LLVMコンパイラの-fomit-frame-pointerを指定した場合は、-momit-leaf-frame-pointerを誘導しませんが、LLVMの実装上、リーフ関数のフレームポインタも削除されるため、結果的に富士通コンパイラ(clangモード)と同様の動作となります。
富士通
①オプションが有効になる条件
②オプションを誘導する条件
|
LLVM
①オプションが有効になる条件
②オプションを誘導する条件
|
|---|---|
-Kswp
①-O1以上
②-O2以上
|
-mllvm -aarch64-enable-pipeliner
①-O1以上
②-O1以上
|
-Kfp_contract
①-O1以上
②-Kfast指定
|
-ffp-contract=fast
①-O1以上
②-fast-math指定
|
-Kunroll
①-O1以上
②-O2以上
|
-funroll-loops
①-O1以上
②-O2以上
|
-Ksimd[=auto]
①-O2以上
②-O2以上
|
-fvectorize
①-O1以上
②-O2以上
|
-Kfp_relaxed
①-O1以上
②-Kfast指定
|
-freciprocal-math -mrecip
①-O1以上かつ、-fno-honor-infinities または-ffast-math
②なし(明示指定のみ) (※)
|
-Komitfp
①-O1以上
②-Kfast指定
|
-fomit-frame-pointer
①なし(最適化レベルに関わらない)
②なし(明示指定のみ)
|
※ -ffast-mathから-freciprocal-mathのみ誘導しますが、-mrecipは誘導しません。
3.3.2.3. 非互換機能¶
LLVMコンパイラでは、富士通コンパイラおよびA64FX固有の機能が利用できません。主な非対応機能を以下に示します。
富士通コンパイラ固有の翻訳時オプション
以下のような富士通コンパイラ固有の翻訳時オプションをLLVMコンパイラに指定した場合、翻訳時エラーとなり処理が中断されます。
-Kオプション(例: -Kfast)
-Nオプション(例: -NRtrap)
-ffjオプション(例: -ffj-fjprof)
数学ライブラリ関連オプション(例: -SSL2、-lfjlapacksve)
その他、富士通コンパイラ特有のオプション(例: -A’name(token)’)
※類似機能のオプションについては翻訳時オプション内の表:類似機能を持つ翻訳時オプション(C/C++コンパイラ向け)および表:類似機能を持つ翻訳時オプション(Fortranコンパイラ向け)を参照してください。
富士通コンパイラ固有の最適化指示子
ソースコード内に富士通コンパイラ固有の最適化指示子が記述されている場合、LLVMコンパイラでは認識されず、無視されます。
富士通コンパイラ固有の環境変数
以下のような富士通コンパイラ固有の環境変数は、富士通コンパイラでの翻訳時や、富士通コンパイラで作成したバイナリ実行時に使用されていましたが、LLVMコンパイラでは設定しても動作に影響を与えず、無視されます。
翻訳コマンドの環境変数(例: fcc_ENV)
実行時環境変数(例: FLIB_C_MESSAGE)
あらかじめ定義されたマクロ名
富士通コンパイラでは、
__FUJITSUや__CLANG_FUJITSUなどのマクロがあらかじめ定義されており、ソースコード内で条件分岐に利用されている場合があります。これらのマクロは LLVM コンパイラでは定義されていません。条件分岐に利用している場合は、期待通りの処理が行われるか確認することを推奨します。詳細なマクロ一覧については、あらかじめ定義されたマクロ名の差異を参照してください。
A64FX固有の機能 (環境変数やオプションを通じて利用)
以下の機能は、富士通コンパイラでは主に環境変数、翻訳時オプション、最適化指示子を通じて制御されていましたが、LLVMコンパイラではこれらの制御手段が提供されません。これらの機能を利用していたアプリケーションは、移行時に動作の違いが生じる可能性があるため、動作検証を通じて確認することを推奨します。
ハードウェアバリア (例: 環境変数FLIB_BARRIER=HARD)
セクタキャッシュ機能 (例: 最適化指示子scache_isolate_way L2=n1)
ハードウェアプリフェッチアシスト機能 (例: -Khpctag)
富士通Fortranコンパイラの実行時オプション
富士通Fortranコンパイラで作成した実行バイナリは、起動時にコマンドライン引数を用いて挙動を制御する「実行時オプション」が提供されています。LLVMコンパイラ(flang)では、これらの実行時オプションに相当する機能は提供されておらず、実行時オプションをLLVMコンパイラで作成した実行バイナリに指定しても、特別な処理は行われません。
富士通プロファイラ(fipp/fapp)
富士通コンパイラでは、性能解析に富士通プロファイラ(fipp/fapp)が利用可能ですが、LLVMコンパイラでは利用できません。LLVMコンパイラを利用する場合は、perfなどの一般的な性能解析ツールをご使用ください。
3.3.2.4. あらかじめ定義されたマクロ名の差異¶
富士通コンパイラとLLVMコンパイラでは、あらかじめ定義されているマクロに差異があります。富士通コンパイラでのみ定義されているマクロや、両コンパイラで同一マクロの値が異なる場合があります。ソースコードで条件分岐にこれらのマクロを使用している場合、動作に影響する可能性があります。そのため、マクロ定義の差異を確認することを推奨します。
3.3.2.4.1. 富士通コンパイラでのみ定義されているマクロ¶
富士通コンパイラでのみ定義されているマクロを示します。
マクロ名
|
補足
|
|---|---|
__FCC_major__
|
C/C++コンパイラ共通
|
__FCC_minor__
|
C/C++コンパイラ共通
|
__FCC_patchlevel__
|
C/C++コンパイラ共通
|
__FCC_version__
|
C/C++コンパイラ共通
|
__FUJITSU
|
C/C++コンパイラ共通
|
__STDC_NO_ATOMICS__
|
Cコンパイラのみ
|
__STDC_NO_THREADS__
|
Cコンパイラのみ
|
__MT__
|
C/C++コンパイラ共通
|
__SIGNED_CHARS__
|
C/C++コンパイラ共通
|
_BOOL
|
C++コンパイラのみ
|
_GNU_SOURCE
|
C++コンパイラのみ
|
_WCHAR_T
|
C++コンパイラのみ
|
__ARRAY_OPERATORS
|
C++コンパイラのみ
|
__EXCEPTIONS
|
C++コンパイラのみ
|
__FJ_RUNTIME_USES_NAMESPACES
|
C++コンパイラのみ
|
__GNUG__
|
C++コンパイラのみ
|
__PLACEMENT_DELETE
|
C++コンパイラのみ
|
__RTTI
|
C++コンパイラのみ
|
__FMTL_PARALLEL
|
C++コンパイラのみ
|
__FMTL_SERIAL
|
C++コンパイラのみ
|
__FMTL_SSL2
|
C++コンパイラのみ
|
__FMTL_SSL2BLAMP
|
C++コンパイラのみ
|
マクロ名
|
補足
|
|---|---|
__CLANG_FUJITSU
|
C/C++コンパイラ共通
|
__FCC_major__
|
C/C++コンパイラ共通
|
__FCC_minor__
|
C/C++コンパイラ共通
|
__FCC_patchlevel__
|
C/C++コンパイラ共通
|
__FCC_version__
|
C/C++コンパイラ共通
|
マクロ名
|
補足
|
|---|---|
__FRT_major__
|
|
__FRT_minor__
|
|
__FRT_patchlevel__
|
|
__FRT_version__
|
|
__FUJITSU
|
|
__linux
|
flangのみ未定義、clang/clang++では定義済み
|
__unix
|
flangのみ未定義、clang/clang++では定義済み
|
linux
|
flangのみ未定義、clang/clang++では定義済み
|
unix
|
flangのみ未定義、clang/clang++では定義済み
|
3.3.2.4.2. 値が異なるマクロ¶
富士通コンパイラとLLVMコンパイラの両方で定義され、値が異なるマクロを示します。
マクロ名
|
富士通 マクロの値
|
LLVM マクロの値
|
補足
|
|---|---|---|---|
__GNUC_MINOR__
|
1
|
2
|
C/C++コンパイラ共通
|
__GNUC_PATCHLEVEL__
|
0
|
1
|
C/C++コンパイラ共通
|
__GNUC__
|
6
|
4
|
C/C++コンパイラ共通
|
__STDC_VERSION__
|
201112L
|
201710L
|
Cコンパイラのみ
|
__WCHAR_TYPE__
|
int
|
unsigned int
|
C/C++コンパイラ共通
|
_OPENMP
|
201107
|
202011
|
C/C++コンパイラ共通
|
マクロ名
|
富士通 マクロの値
|
LLVM マクロの値
|
補足
|
|---|---|---|---|
__STDC_VERSION__
|
201112L
|
201710L
|
Cコンパイラのみ
|
__clang_major__
|
7
|
22
|
C/C++コンパイラ共通
|
__clang_version__
|
"7.1.0 "
|
"22.1.0 "
|
C/C++コンパイラ共通
|
_OPENMP
|
201107
|
202011
|
C/C++コンパイラ共通
|
マクロ名
|
富士通 マクロの値
|
LLVM マクロの値
|
|---|---|---|
_OPENMP
|
201511
|
202011
|
3.3.2.5. 最適化指示子の差異¶
富士通コンパイラとLLVMコンパイラでは、最適化指示子に差異があります。現時点で判明している範囲について、両コンパイラの最適化指示子の対応関係を下表に示します。なお、最適化の有効条件は翻訳時オプションの有効条件と同じです。詳細は 翻訳時オプションの有効条件と省略時の動作を参照してください。
富士通コンパイラ tradモード
|
富士通コンパイラ clangモード
|
LLVMコンパイラ
|
|---|---|---|
#pragma[ fj] loop simd
|
#pragma clang loop vectorize(enable)
|
clangモードと同じ
|
#pragma[ fj] loop nosimd
|
#pragma clang loop vectorize(disable)
|
clangモードと同じ
|
なし
|
#pragma clang loop vectorize_width(n, scalable)
|
clangモードと同じ
|
なし
|
#pragma clang loop vectorize(assume_safety)
|
clangモードと同じ
|
#pragma[ fj] loop unroll
|
#pragma clang loop unroll(enable)
|
clangモードと同じ
|
#pragma[ fj] loop unroll n
|
#pragma clang loop unroll_count(n)
|
clangモードと同じ
|
#pragma[ fj] loop unroll "full"
|
#pragma clang loop unroll(full)
|
clangモードと同じ
|
#pragma[ fj] loop nounroll
|
#pragma clang loop unroll(disable)
|
clangモードと同じ
|
#pragma loop fp_contract
|
#pragma clang fp contract(fast)
|
clangモードと同じ
|
#pragma loop nofp_contract
|
#pragma clang fp contract(off)
|
clangモードと同じ (※1)
|
なし
|
#pragma clang fp contract(on)
|
clangモードと同じ
|
#pragma loop loop_fission_target
|
#pragma fj loop loop_fission_target
|
#pragma clang loop distribute(enable) (※2)
|
#pragma procedure fp_relaxed
|
なし
|
#pragma clang fp reciprocal(on)
|
#pragma procedure nofp_relaxed
|
なし
|
#pragma clang fp reciprocal(off)
|
※1 -ffp-contract=fastである場合、オプション指定を優先し#pragma clang fp constract(off)指定を無視します。-ffp-contract=fast-honor-pragmasである場合、#pragma clang fp constract(off)指定を優先します。
※2 LLVMコンパイラの#pragma clang loop distribute(enable)は、富士通コンパイラの最適化指示子loop_fission_targetと同様にループ分割を指示するものですが、アルゴリズムが異なるため、同一の効果は保証されません。
富士通コンパイラ
|
LLVMコンパイラ
|
|---|---|
!OCL SIMD
|
!dir$ vector always
|
!OCL NOSIMD
|
!dir$ novector
|
!OCL UNROLL[(n)]
|
!dir$ unroll [n]
|
!OCL NOUNROLL
|
!dir$ nounroll
|
3.3.2.6. 代替手段¶
3.3.2.6.1. ラージページ機能¶
富士通コンパイラでは、ラージページ機能がデフォルトで有効となっており、特別な設定を行わずに利用可能でした。これにより、環境やアプリケーションによっては性能向上が期待できる場合があります。一方、LLVMコンパイラではこの機能が標準では有効になっていないため、利用するには明示的な指定が必要です。
「富岳」環境では、翻訳時(リンク時)オプションに以下を追加することで、HPC拡張のラージページ機能を使用することができます。
-L/opt/FJSVxos/mmm/lib64 -lmpg -Wl,-T/opt/FJSVxos/mmm/util/bss-2mb.lds
このオプションは、他のライブラリよりも前に指定してください。ラージページ機能の詳細はマニュアル「ジョブ運用ソフトウェア エンドユーザ向けガイド HPC拡張機能編」を参照してください。
翻訳例:
clang a.c -L/opt/FJSVxos/mmm/lib64 -lmpg \
Wl,-T/opt/FJSVxos/mmm/util/bss-2mb.lds
注釈
LLVMコンパイラでは、メモリ割り付けの動作が富士通コンパイラと異なる可能性があります。移行時には意図通りに動作するかを、実際のビルドや動作検証を通じて確認することを推奨します。
3.3.2.7. オブジェクト・ソース非互換¶
3.3.2.7.1. オブジェクト非互換¶
富士通コンパイラ(tradモードおよびclangモード)とLLVMコンパイラでは、生成されるファイル(オブジェクトファイル、アセンブラソースファイル、モジュールファイル.modなど)に互換性がありません。そのため、すべてのソースコードをLLVMコンパイラで再翻訳する必要があります。
なお、富士通clangモードはLLVMベースであるものの、富士通独自の拡張が加えられており、純粋なLLVMとは動作が異なります。部分的に互換性があるように見える場合でも、意図しない動作につながる可能性があるため、オブジェクトの再利用は推奨しません。
3.3.2.7.2. ソース非互換¶
LLVMコンパイラは、標準的な言語仕様(C/C++/Fortran)に準拠していますが、富士通コンパイラで利用可能だった独自の組込み関数やサービスルーチンはサポートされていません。これらに依存したソースコードは、LLVMでは修正が必要になる場合があります。
3.3.2.7.3. 実行結果の非互換¶
富士通コンパイラとLLVMコンパイラでは、同一のソースコードであっても実行結果に差異が生じる可能性があります。この非互換は、主に以下の2点に起因します。移行後の検証では、数値的な整合性および出力形式の互換性について確認することを推奨します。
- 数値計算の精度や誤差の違いコンパイラの最適化の違いや、数値計算ライブラリの実装差異により、数値計算の精度や誤差が異なる場合があります。
- 出力仕様の違い浮動小数点の表示形式(桁数、指数表記、空白の扱いなど)など出力結果の見た目やフォーマットが異なる可能性があります。
3.3.2.8. ファイル名のサフィックスについて¶
富士通コンパイラ(tradモード/clangモード)で使用されていたファイル名のサフィックスについて、それらがLLVMコンパイラ(clang, clang++, flang)で利用可能かどうかを示します。
Cコンパイラclangは、下記表のファイルのサフィックスのファイルを入力として翻訳可能です。
ファイルの種別 |
ファイルのサフィックス |
|---|---|
Cソースファイル |
.c |
Cソースファイル |
.i |
アセンブラソースファイル |
.s |
前処理を要するアセンブラソースファイル |
.S |
オブジェクトファイル |
.o |
C++コンパイラclang++は、下記表のファイルのサフィックスのファイルを入力として翻訳可能です。
ファイルの種別 |
ファイルのサフィックス |
|---|---|
C++ソースファイル |
.cc |
C++ソースファイル |
.CC |
C++ソースファイル |
.cpp |
C++ソースファイル |
.CPP |
C++ソースファイル |
.cxx |
C++ソースファイル |
.CXX |
C++ソースファイル |
.c++ |
C++ソースファイル |
.C++ |
C++ソースファイル |
.C |
C++ソースファイル |
.cp |
C++ソースファイル |
.ii |
アセンブラソースファイル |
.s |
前処理を要するアセンブラソースファイル |
.S |
オブジェクトファイル |
.o |
Fortranコンパイラflangは、以下の表に示すファイルサフィックスを持つソースファイルを入力として翻訳可能です。ファイル形式(固定形式/自由形式)は、ファイルの拡張子に基づいて自動的に判別されるため、特別なオプション指定は不要です。
アセンブラソースファイル(拡張子 .s)はflangでの翻訳ができず、翻訳時エラーが発生するため、処理にはclangまたはclang++を使用してください。
ファイルの種別 |
ファイルのサフィックス |
形式 |
|---|---|---|
Fortran原始プログラム |
.f |
固定形式 |
Fortran原始プログラム |
.for |
固定形式 |
Fortran原始プログラム |
.f90 |
自由形式 |
Fortran原始プログラム |
.f95 |
自由形式 |
Fortran原始プログラム |
.f03 |
自由形式 |
Fortran原始プログラム |
.f08 |
自由形式 |
前処理指令Fortran原始プログラム |
.F |
固定形式 |
前処理指令Fortran原始プログラム |
.FOR |
固定形式 |
前処理指令Fortran原始プログラム |
.F90 |
自由形式 |
前処理指令Fortran原始プログラム |
.F95 |
自由形式 |
前処理指令Fortran原始プログラム |
.F03 |
自由形式 |
前処理指令Fortran原始プログラム |
.F08 |
自由形式 |
オブジェクトファイル |
.o |
- |
3.3.2.9. SIMD組込み関数¶
富士通コンパイラ(clangモード)では、”Arm C Language Extensions”バージョン00bet1(First public release)に記載されているSIMD組込み関数が利用可能でした。
LLVMコンパイラ(clang)では、Arm社の公開しているACLE(Arm C Language Extensions)仕様に基づき、SIMD組込み関数への対応が段階的に進められています。ただし、最新のACLE仕様に完全準拠しているわけではなく、仕様変更や実装差異により、期待通りに動作しない可能性があります。そのため、移行にあたっては使用するSIMD組込み関数がLLVM環境でサポートされているかどうかを、実際のビルドや動作検証を通じて確認することを推奨します。
なお、SIMD組込み関数の詳細については、Arm社が開発者向けに公開しているドキュメントを参照してください。仕様はGitHub <https://github.com/ARM-software/acle/releases> にて確認できます。
3.3.2.10. GNU互換機能(C/C++およびFortran)¶
LLVMコンパイラ(clangおよびflang)では、GNU C/C++およびGNU Fortranコンパイラの拡張仕様や互換オプションの一部が利用可能です。富士通コンパイラ(trad/clangモード)で使用されていた機能の多くは、LLVM環境でも利用できると考えられますが、仕様変更や実装の違いにより、動作に影響が出る可能性があります。そのため、移行にあたっては、使用している拡張構文や互換オプションがLLVM環境でも意図通りに動作するかを、実際のビルドや動作検証を通じて確認することを推奨します。
3.3.2.11. 言語仕様¶
3.3.2.11.1. 言語規格¶
以下の表では、富士通コンパイラとLLVMコンパイラが対応している言語規格の違いを示します。「(一部)」と記載されている規格については、該当コンパイラがその規格の全機能をサポートしているわけではなく、部分的な対応にとどまっていることを意味します。
各対応状況の詳細については、以下のドキュメントを参照ください。
- 富士通コンパイラのサポート状況「利用手引書 -言語開発環境編-」
- LLVMコンパイラ(clang/flang)のサポート状況C Support in Clang<https://clang.llvm.org/c_status.html>C++ Support in Clang<https://clang.llvm.org/cxx_status.html>Flang Fortran Standards Support ※C++ Standard Library ※※LLVMのバージョンによって参照すべきドキュメントが異なるため、LLVM Releaseサイト (https://releases.llvm.org/) にアクセスし、使用しているバージョンに対応したドキュメントをご確認ください。
項目 |
富士通コンパイラ tradモード |
富士通コンパイラ clangモード |
LLVMコンパイラ |
|---|---|---|---|
C 言語規格 |
C11規格
C99規格
C89規格
|
C11規格
C99規格
C89規格
|
C23規格(一部)
C17規格(一部)
C11規格(一部)
C99規格
C89規格
|
C++ 言語規格 |
C++17規格(一部)
C++14規格
C++11規格
C++03規格
|
C++17規格
C++14規格
C++11規格
C++03規格
|
C++23規格(一部) ※1
C++20規格(一部) ※1
C++17規格
C++14規格
C++11規格
C++03規格
|
Fortran 言語規格 |
Fortran2018規格(一部)
Fortran2008規格
Fortran2003規格
Fortran95規格
Fortran90規格
Fortran77規格
|
なし |
Fortran2023規格(一部)
Fortran2018規格(一部)
Fortran2008規格(一部)
Fortran2003規格(一部)
Fortran95規格
Fortran90規格
Fortran77規格
|
3.3.2.11.1.1. C++20以上の最新規格を利用する上での注意点¶
最新のC++言語規格の言語仕様に基づいた処理をする場合は、-stdlib=libc++オプションを使用することを推奨します。一方、libstdc++を利用する場合、デフォルトではRHEL8.10標準のGCC8.5に含まれるlibstdc++が使用され、このlibstdc++はC++20規格の一部までしか対応していません。より新しい規格を利用するには、libstdc++で最新規格を利用する方法を参照してください。
以下に、libc++を使用してC++20規格に準拠したC++プログラムミングを翻訳する場合のコマンド例を示します。
clang++ -std=c++20 -stdlib=libc++ samplecxx20.cpp
3.3.2.11.1.2. libstdc++で最新規格を利用する方法¶
libstdc++で最新規格(C++20以上)を利用する場合、その規格に対応したGCCのインストールディレクトリ(GCC_INSTALL_DIR)を、翻訳時と実行時にそれぞれ以下のように設定する必要があります。clang++は設定したインストールディレクトリにあるlibstdc++を使用します。
「富岳」環境では、通常Spackで提供されるGCCを利用します。そのインストールディレクトリについては後述します。
【翻訳時の設定】 翻訳時オプションに以下を追加してください。
ネイティブコンパイラの場合
--gcc-install-dir=${GCC_INSTALL_DIR}
クロスコンパイラの場合
--gcc-install-dir=${GCC_INSTALL_DIR} -L${GCC_INSTALL_DIR}/../../../../lib64
【実行時の設定】 環境変数LD_LIBRARY_PATHに以下を追加してください。
export LD_LIBRARY_PATH=${GCC_INSTALL_DIR}/../../../../lib64:${LD_LIBRARY_PATH}
「富岳」環境ではSpackで提供されているGCCのインストールディレクトリを使用します。 現在「富岳」で利用できるGCCの版数と、それに紐づくインストールディレクトリを下記の表:GCC版数とインストールしたディレクトリに示します。
版数
|
GCCをインストールしたディレクトリ(GCC_INSTALL_DIR)
|
|---|---|
GCC 12.2.0
|
/vol0004/apps/oss/spack-v1.0.1/opt/spack/linux-a64fx/gcc-12.2.0-f57uyl2rzc74cow54td7bdy77xajibir/lib/gcc/aarch64-unknown-linux-gnu/12.2.0
|
GCC 13.4.0
|
/vol0004/apps/oss/spack-v1.0.1/opt/spack/linux-a64fx/gcc-13.4.0-qiftl5lzmfkexynrq6bam2ioglq4v6ex/lib/gcc/aarch64-unknown-linux-gnu/13.4.0
|
GCC 14.3.0
|
/vol0004/apps/oss/spack-v1.0.1/opt/spack/linux-a64fx/gcc-14.3.0-cnjx4mhazorywcmgf6qpzv5y5qfqr4la/lib/gcc/aarch64-unknown-linux-gnu/14.3.0
|
GCC 15.1.0
|
/vol0004/apps/oss/spack-v1.0.1/opt/spack/linux-a64fx/gcc-15.1.0-c3wm4pbp52oyk3h4hzdg4pg43kvcy4bf/lib/gcc/aarch64-unknown-linux-gnu/15.1.0
|
Spack環境において、GCCのバージョンアップなどにより参照するコンパイラ環境が変更された場合は、計算ノード上で対象GCCの環境設定後にgccコマンドのオプション -print-search-dirs を使用することでインストールディレクトリを確認することができます。
このコマンド出力から得られるインストールディレクトリのパスを利用してください。
$ . /vol0004/apps/oss/spack/share/spack/setup-env.sh
$ spack load gcc@12.2.0 # 使用するgccを指定する
$ gcc -print-search-dirs |grep install
install: /vol0004/apps/oss/spack-v1.0.1/opt/spack/linux-a64fx/gcc-12.2.0-f57uyl2rzc74cow54td7bdy77xajibir/lib/gcc/aarch64-unknown-linux-gnu/12.2.0/
3.3.2.11.2. OpenMP API仕様¶
対応しているOpenMP API仕様の違いを下記表に示します。「(一部)」と記載されている規格については、該当コンパイラがその規格の全機能をサポートしているわけではなく、部分的な対応にとどまっていることを意味します。「(一部)」の記載がない規格については、公式ドキュメントに基づき、サポートされている最新バージョンのみを記載しています。
なお、富士通コンパイラでは、製品としての動作保証や技術支援の対象として対応範囲が定義されており、LLVMコンパイラでは、実装されている機能の有無に基づいて対応状況が示されています。
項目 |
富士通コンパイラ tradモード |
富士通コンパイラ clangモード |
LLVMコンパイラ |
|---|---|---|---|
C/C++ OpenMP |
OpenMP 4.5(一部)
OpenMP 4.0(一部)
OpenMP 3.1
|
OpenMP 5.0(一部)
OpenMP 4.5
|
OpenMP 5.1(一部)
OpenMP 5.0(一部)
OpenMP 4.5
|
Fortran OpenMP |
OpenMP 5.0(一部)
OpenMP 4.5
|
なし |
OpenMP 4.0(一部)
OpenMP 3.1
|
- 富士通コンパイラのサポート状況“C言語使用手引書”, “C++言語使用手引書”, "Fortran使用手引書"“利用手引書 -言語開発環境編-“
- LLVMコンパイラ(clang/flang)のサポート状況clang OpenMP Support ※flang OpenMP Support ※※LLVMのバージョンによって参照すべきドキュメントが異なるため、LLVM Releaseサイト (https://releases.llvm.org/) にアクセスし、使用しているバージョンに対応したドキュメントをご確認ください。
3.3.2.12. 事例集¶
3.3.2.13. サポート外の利用方法¶
富士通製コンパイラのBLAS, LAPACKのライブラリを、LLVM環境で試験的にリンクした際の指定例を示します。
富士通製コンパイラのライブラリを他のコンパイラ環境で利用する場合の動作保証はありません。あらかじめご了承ください。
次の二つのライブラリを対象とします。
コンパイル時のライブラリ指定例
次の指定でリンク時にエラーが発生しないことを確認しています。
INCLUDE="-idirafter /opt/FJSVxtclanga/tcsds-latest/include"
LIBS="-L /opt/FJSVxtclanga/tcsds-latest/lib64"
FLIB="-lfjlapacksve -lfj90i -lfj90f -lfjsrcinfo -lfjcrt -lelf" # BLAS, LAPACK 逐次版
FLIB_M="-lfjlapackexsve -lfjomphk -lfjomp -lfj90i -lfj90f -lfjsrcinfo -lfjcrt -lfjompcrt -lelf" # BLAS, LAPACK スレッド並列版
clang++ -O2 sample.cpp ${INCLUDE} ${LIBS} ${FLIB}
clang++ -O2 sample.cpp ${INCLUDE} ${LIBS} ${FLIB_M}
flang -O2 sample.f ${LIBS} ${FLIB}
flang -O2 sample.f ${LIBS} ${FLIB_M}
実行時に不具合が発生した場合は、利用をとりやめてください。