以前の記事で、C/C++言語の Intel Compiler について解説しました。
新しいコンパイラ、icx は LLVMというコンパイラ基盤を元に開発されています。
LLVMとは何か、という解説は、簡単に説明することはなかなか難しいのですが、
コンパイラを作成する際に、いわば土台となるようなものであり
(このため、コンパイラ基盤という表現をされます)、
この土台を利用することで、コンパイラの開発・最適化が効率よく行えます。
近年、この有用性が評価されたためか、LLVMを利用したコンパイラは増加傾向にあります。
LLVMはあくまでコンパイラの土台にあたるものですが、LLVMと同時に、clang という C/C++言語用のコンパイラ(実行バイナリ)が開発されています。
この clang についても普及がすすんでおり、例えば、現在のMacOSにおいては、デフォルトの C/C++言語用のコンパイラはclang になっています。
そして、新しい Intel Compiler の icx は、この clang をベースに改良・拡張したもの、となります。
icx は、clangを拡張したものですから、ベースとなる clang のVersionが存在します。
しかし、このclang の Version と、Intel oneAPI のVersion は一致していません。
clang のVersionについては、icx が実行できる環境で
icx -x c /dev/null -dM -E | grep clang_version
と入力すると、調べることができます。
例えば、最新の Intel oneAPI 2023.2.0 に含まれる icx の場合には、
> icx -x c /dev/null -dM -E | grep clang_version
#define __clang_version__ "17.0.0 (icx 2023.2.0.20230721)"
と出力されますので、clang の Version は 17.0.0 となります。
clang は Version によって仕様や機能が異なる場合があり、ビルド時に影響を及ぼすことがあります。今後、ビルドを行う場合には、oneAPI や clang のVersion に気を付ける必要があるでしょう。
clang の Version について公式に言及がなされているアプリケーションの一例として、 Nividi社が開発・公開されているGPGPU向け開発・実行環境であるCUDAについて調べてみます。
本文章執筆時点での最新のCUDAは v12.2 update2 ( v12.2.2 )のようです。
このVersionのオンラインドキュメント、” Installation Guide for Linux ” 中、
” 1.3. Host Compiler Support Policy ” によると、対応コンパイラは以下のようになっています。
Distribution |
GCC |
Clang |
NVHPC |
XLC |
ArmC/C++ |
ICC |
---|---|---|---|---|---|---|
x86_64 |
6.x – 12.2 |
7.x – 16.0 |
23.x |
No |
No |
2021.7 |
ICCの項目は以前のコンパイラ ( Intel Compiler Classic )の対応なので、clangの項目を見る必要があります。clang の対応は ” 7.X – 16.0 ” となっているので、最新の Intel oneAPI同梱の v2023.2.0 では対応外のようです。
ここで、少し前にリリースされた Intel oneAPI v2023.0.0 を調べてみると、
> icx -dM -E -x c /dev/null |grep clang_version
#define __clang_version__ "16.0.0 (icx 2023.0.0.20221201)"
となっており、これなら CUDAの Compiler 要件を満たすのではないかと思われます。
ということで、実際に oneAPI v2023.0.0 + CUDA v22.2.2 を用いてアプリケーションのビルドを試みたのですが、以下のようなメッセージが出ました。
#error -- unsupported Intel ICX compiler! The nvcc flag
'-allow-unsupported-compiler' can be used to override this version check" "
however, using an unsupported host compiler may cause compilation failure
or incorrect run time execution. Use at your own risk.
#error -- unsupported clang version! clang version must be less than 16 and
greater than 3.2 . The nvcc flag '-allow-unsupported-compiler' can be used
to override this version check" " however, using an unsupported host
compiler may cause compilation failure or incorrect run time execution.
Use at your own risk.
気になるメッセージが出ました。
最初のエラーメッセージで、そもそもCUDAは icx コンパイラをサポートしていないと言っています。調査の結果、このエラーメッセージは CUDA v12.2.0 以降に出るようになったようです。
2つめのエラーメッセージは、clang のVersionがサポート範囲外である、という内容で、先ほど記載した表の内容とズレがあるように見えます。このメッセージについて調査した所、展開された cuda-12.2 ディレクトリ以下のファイル、 include/crt/host_config.h で出力されていました。このファイル内容を調べたところ、使用できる clang の Version は v16.0 未満 のようです。
以上より、現時点では、 icx と CUDAの組み合わせは、公式の動作保証はされていない状況にあると考えられます。
現時点で CUDA と Intel Compiler の連携を行う場合には、従来のIntel Compiler ( icc )を使用する方が無難であると考えられます。
なお、この記事を執筆している 2023/9/19 時点での Intel oneAPI ( Basekit & HPC Toolkit ) の
最新Version 2023.2.0 において、icc/icpc というコマンドで実行される
従来の Intel Compiler はまだ同梱されています。
以前の記事のとおり、icc/icpc は oneAPIから無くなる事が intel社よりアナウンスがされていますので、今後 Intel Compiler + CUDA によるビルドを考えられている方は、ダウンロードしておいた方が良いかもしれません。