インテル® 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 (英語)) が公開されています。こちらのドキュメントはまだ作成途中ですが、サンプルなども示されているので参考になるかと思います。日本語参考訳はこちらをご覧ください。