HPCシステムズではエンジニアを募集しています。詳しくはこちらをご覧ください。
HPCシステムズのエンジニア達による技術ブログ

Tech Blog

新しい Intel Compiler 、icx の clang version 調査方法とCUDAとの連携について

以前の記事で、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 によるビルドを考えられている方は、ダウンロードしておいた方が良いかもしれません。