インテル® oneAPI ツールキット 2023 バージョンにおけるコンパイラーの更新

インテル® DPC++/C++ コンパイラーインテル® oneAPI

インテル® oneAPI ツールキットの新しいバージョン 2023 がリリースされました。このバージョンに含まれるインテル® DPC++/C++ コンパイラーは 2023.0.0 にアップデートされており、旧バージョンのコンパイラーと若干振る舞いが異なる点があります。これは、SYCL* 2020 に仕様に従うものです。

インテル® oneAPI ツールキットを 2023 にアップデートして、これまでに作成したソースをコンパイルすると、山のような警告が表示されることがあります。この記事では、とりあえず重要ですが、煩わしい警告への対策をお知らせします。

検証には Windows* 版のツールを使用しました。Linux* 環境では若干異なるかもしれません。

1) dpcpp コンパイラー・ドライバーが非推奨になりました。
これまで、dpcpp test.cpp のように利用できましたが、バージョン 2023 のコンパイラー環境で dpcpp を起動すると、
icpx: warning: use of 'dpcpp' is deprecated and will be removed in a future release. Use 'icpx -fsycl' [-Wdeprecated]
のような警告が出力されます。これを機会に makefile やコンパイル環境のコンパイラーを icpx に更新してください。SYCL* ソースをコンパイルするには -fSYCL オプションを指定する必要があります。

新しい環境でも警告が表示されますが、バイナリーは生成されます。ただし、従来は Windows* 環境では dpcpp test.cpp を指定するとソースコード名が生成されるバイナリーに自動的に展開され、test.exe が生成されましたが、新しいコンパイラーではデフォルトで a.exe になります。-o オプションで出力ファイル名を指定してください。

2) 従来の SYCL* デバイスセレクターが非推奨となり警告が表示されます。
デバイスセレクターを操作する処理を行うと警告が表示されます。

次のソースは、プラットフォームのデバイスリストから host_selector と gpu_selector を検索して、そのデバイス名とベンダー名を表示しています。

#include <CL/sycl.hpp>
#include <iostream>
#include <string>
using namespace sycl;

void output_dev_info(const device& dev, const std::string& selector_name) {
  std::cout << selector_name << ": 選択されたデバイス: " <<
    dev.get_info<info::device::name>() << "\n";
  std::cout <<"                 -> デバイスのベンダー: " <<
    dev.get_info<info::device::vendor>() << "\n";
}

int main() {
  output_dev_info( device{ host_selector{}}, "host_selector" );
  output_dev_info( device{ gpu_selector{}}, "gpu_selector" );

  return 0;
}

2022 バージョンのコンパイラーでは、警告なくコンパイルでき正しく動作しましたが、2023 バージョンのコンパイラーでは、次のような警告が表示されます。これは、SYCL* 2020 仕様にも明記されていますが host_selector や gpu_selector は SYCL* 1.2.1 との互換性用途にのみ使用され、SYCL* 2020 では非推奨になりました。セレクターに関連するマクロに対しても警告が表示されています。以下は警告の一部分です。

dev.cpp:15:28: warning: 'gpu_selector' is deprecated: Use the callable sycl::gpu_selector_v instead. [-Wdeprecated-declarations]
  output_dev_info( device{ gpu_selector{}}, "gpu_selector" );
                         ^

C:\PROGRA~2\Intel\oneAPI\compiler\latest\windows\bin-llvm\..\include\sycl/device_selector.hpp:62:21: note: 'gpu_selector' has been explicitly marked deprecated here
class __SYCL_EXPORT __SYCL2020_DEPRECATED(
                  ^

C:\PROGRA~2\Intel\oneAPI\compiler\latest\windows\bin-llvm\..\include\sycl/detail/defines_elementary.hpp:52:40: note: expanded from macro '__SYCL2020_DEPRECATED'
#define __SYCL2020_DEPRECATED(message) __SYCL_DEPRECATED(message)
                                     ^


C:\PROGRA~2\Intel\oneAPI\compiler\latest\windows\bin-llvm\..\include\sycl/detail/defines_elementary.hpp:43:38: note: expanded from macro '__SYCL_DEPRECATED'

#define __SYCL_DEPRECATED(message) [[deprecated(message)]]

注:
SYCL* 1.2.1 では、事前定義されたデバイスセレクターを使用するにはインスタンス化する必要があるタイプでした。SYCL 2020 ではインスタンスになりました。古いタイプのインス タンス化を使用するコードの移植を簡素化するため、sycl::default_selector などの下位互換 の API が引き続き提供されます。新しい事前定義デバイスセレクターには、競合を回避するため名称に “_v” が追加されており、C++ 標準ライブラリーの特性で使用される命名スタイルと類似しています。

この問題を回避するには、ソースを次のように変更してください。

output_dev_info( device{ host_selector_v}, "host_selector" );
output_dev_info( device{ gpu_selector_v}, "gpu_selector" );

gpu_selector_v のように _v が追加されたセレクターが新しいものになります。これは cpu や accelerator などでも同様です。さて、新しいコンパイラーで再コンパイルしてみます。

oneapi-2023-compiler-image003.png” />

おっと、host_selector_v がエラーになっています。実は、host_selector がデバッグ用途に使用されるもので、SYCL* 2020 では非推奨となりサポートされなくなりました。host_selector_v の行をコメントアウトして再コンパイルしてみます。

これは、一例ですがインテル® DPC++/C++ コンパイラーは SYCL* 2020 に仕様に準拠するため、日々改善が行われています。バージョン 2023 はこれまでで最大の更新といってよいでしょう。これ以外でも警告が表示されたり、エラーとなることがあるかもしれません。興味がある方は、https://www.isus.jp/isus-translated-documents/ から SYCL* 2020 の仕様をご覧ください。現在 SYCL 2020 Rev4 の日本語参考訳が公開されていますが、Rev5 と Rev6 はすでに翻訳済みでまもなく公開予定です。

また、プログラマーが簡単に SYCL* を導入できるよう、SYCL Reference Documentation (https://sycl.readthedocs.io/en/latest/index.html (英語)) が公開されています。こちらのドキュメントはまだ作成途中ですが、サンプルなども示されているので参考になるかと思います。日本語参考訳はこちらをご覧ください。

タイトルとURLをコピーしました