3.3. LLVM¶
LLVMを基盤にもつ、C/C++/Fortran用コンパイラの利用方法を示します。 計算ノード向けバイナリを出力するLLVMはログインノード(Intel)、計算ノードの双方で利用可能です。
3.3.1. LLVMの利用方法¶
3.3.1.1. コンパイル環境設定¶
LLVMコンパイラは、
ログインノード(クロス環境)では/vol0004/apps/r/OSS_CN/llvm-21.1.0/cross_clangfxにあります。 計算ノード(ネイティブ環境)では/vol0004/apps/r/OSS_CN/llvm-21.1.0/own_clangfxにあります。
(今までのバージョンを利用したい方は、'lvm-v19.1.4' をご利用ください。)
コンパイルを実行する前に以下を実行して利用環境を設定してください。
ログインノード
[_LNIlogin]$ module load LLVM/llvmorg-21.1.0
計算ノード
[_CNlogin]$ module load LLVM/llvmorg-21.1.0
利用できる環境は、以下のとおりです。
ソフトウェア名
言語
バージョン
コマンド
Clang
C
21.1.0
clang
Clang++
C++
21.1.0
clang++
Flang
Fortran
21.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) の場合も同様の方法となります。
ジョブスクリプトによるコンパイル例
計算ノードにジョブを割り当てる際には、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-21.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-21.1.0 llio_transfer `find ${LLVM_BASEDIR}/lib64 -type f -name \*.so\*` llio_transfer `find ${MPI_HOME}/lib64 -type f -name \*.so\*` llio_transfer sample1.out mpiexec ./sample1.out
参考
C++, Fortranプログラムの実行も同様の方法となります。
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を指定してください
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)。
FFTWを利用するを利用するプログラムを翻訳する場合は、富岳LLVMを使用するための環境設定を行った上で、 リンク時のオプションに以下のライブラリを追加してください。
単精度の逐次ライブラリ : -lfftw3f -lm
単精度のスレッド並列ライブラリ : -lfftw3f_omp -lfftw3f -lm
倍精度の逐次ライブラリ : -lfftw3 -lm
倍精度のスレッド並列ライブラリ : -lfftw3_omp -lfftw3 -lm
またスレッド並列ライブラリを利用する場合は、オプションに-fopenmpを追加してください。
さらに言語に応じて、以下のオプションを追加してください。
C/C++の場合:
-Lオプションおよび-IオプションでFFTWをインストールしたディレクトリ(${FFTW_DIR})のライブラリおよびヘッダを指定してください
-lflang_rt.runtimeを指定してください
Fortranの場合:
-LオプションでFFTWをインストールしたディレクトリ(${FFTW_DIR})のライブラリを指定してください
3.3.1.4.2.1. プログラム実行方法¶
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++を指定してください。- Fortranオブジェクトをリンクする場合
コマンドclangまたはclang++を使用してリンクする際は、以下のオプションを指定してください。
L${LLVM_BASEDIR}/lib64 -lflang_rt.runtime
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. 翻訳時オプション¶
富士通コンパイラ(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 21 clang/clang++の オプション名 |
|---|---|---|
-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} |
-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} |
富士通コンパイラ tradモードのオプション名 |
LLVM 21 flangのオプション名 |
|---|---|
-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.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)
3.3.2.4. 代替手段¶
3.3.2.4.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.5. オブジェクト・ソース非互換¶
3.3.2.5.1. オブジェクト非互換¶
富士通コンパイラ(tradモードおよびclangモード)とLLVMコンパイラでは、生成されるファイル(オブジェクトファイル、アセンブラソースファイル、モジュールファイル.modなど)に互換性がありません。そのため、すべてのソースコードをLLVMコンパイラで再翻訳する必要があります。
なお、富士通clangモードはLLVMベースであるものの、富士通独自の拡張が加えられており、純粋なLLVMとは動作が異なります。部分的に互換性があるように見える場合でも、意図しない動作につながる可能性があるため、オブジェクトの再利用は推奨しません。
3.3.2.5.2. ソース非互換¶
LLVMコンパイラは、標準的な言語仕様(C/C++/Fortran)に準拠していますが、富士通コンパイラで利用可能だった独自の組込み関数やサービスルーチンはサポートされていません。これらに依存したソースコードは、LLVMでは修正が必要になる場合があります。
3.3.2.5.3. 実行結果の非互換¶
富士通コンパイラとLLVMコンパイラでは、同一のソースコードであっても実行結果に差異が生じる可能性があります。この非互換は、主に以下の2点に起因します。移行後の検証では、数値的な整合性および出力形式の互換性について確認することを推奨します。
- 数値計算の精度や誤差の違いコンパイラの最適化の違いや、数値計算ライブラリの実装差異により、数値計算の精度や誤差が異なる場合があります。
- 出力仕様の違い浮動小数点の表示形式(桁数、指数表記、空白の扱いなど)など出力結果の見た目やフォーマットが異なる可能性があります。
3.3.2.6. ファイル名のサフィックスについて¶
富士通コンパイラ(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.7. 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.8. GNU互換機能(C/C++およびFortran)¶
LLVMコンパイラ(clangおよびflang)では、GNU C/C++およびGNU Fortranコンパイラの拡張仕様や互換オプションの一部が利用可能です。富士通コンパイラ(trad/clangモード)で使用されていた機能の多くは、LLVM環境でも利用できると考えられますが、仕様変更や実装の違いにより、動作に影響が出る可能性があります。そのため、移行にあたっては、使用している拡張構文や互換オプションがLLVM環境でも意図通りに動作するかを、実際のビルドや動作検証を通じて確認することを推奨します。
3.3.2.9. 言語仕様¶
3.3.2.9.1. 言語規格¶
以下の表では、富士通コンパイラとLLVMコンパイラが対応している言語規格の違いを示します。「(一部)」と記載されている規格については、該当コンパイラがその規格の全機能をサポートしているわけではなく、部分的な対応にとどまっていることを意味します。
なお、富士通コンパイラでは、製品としての動作保証や技術支援の対象として対応範囲が定義されており、LLVMコンパイラでは、実装されている機能の有無に基づいて対応状況が示されています。
各対応状況の詳細については、以下のドキュメント・ページを参照ください。(2025年9月時点の情報に基づく)
- 富士通コンパイラのサポート状況「利用手引書 -言語開発環境編-」
- LLVMコンパイラ(clang/flang)のサポート状況
項目 |
富士通コンパイラ 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規格(一部)
C++20規格(一部)
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.9.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
|
※clang/flangのサポート状況については、下記ページを参照しています。表は、2025年9月時点の情報です。
- clangのOpenMPサポート
- flangのOpenMPサポート