この記事は、インテル社の許可を得て iSUS (IA Software User Society) が翻訳した、https://github.com/intel/llvm/blob/sycl/sycl/doc/FAQ.md で公開されている 2022年10月14日現在の『Frequently Asked Questions』の日本語参考訳です。原文は更新される可能性があります。原文と翻訳文の内容が異なる場合は原文を優先してください。
目次
DPC++ による開発
Q: DPC++で開発を始めるには何が必要ですか?
A: DPC++ をフルに活用するには、oneAPI DPC++ コンパイラーが必要です。DPC++ コンパイラーは、ホスト側とデバイス側の両方のコンパイル機能を提供します。また、専用デバイスにコードをオフロードするには、互換性のある OpenCL* ランタイムが必要です。適切な環境のセットアップについては、導入ガイドを参照してください。DPC++ コンパイラーの使用方法については、ユーザーマニュアル (英語) を参照してください。
Q: DPC++ のコンパイルフェーズは、通常の C++ コンパイラーとどのように違いますか? また、このフローを特定のアプリケーション向けにカスタマイズすることは可能ですか?
A: ホストとデバイスの両方のコードをコンパイルして最終的なバイナリーにリンクする必要があるため、コンパイル手順は通常の C++ フローよりも複雑です。
一般に、すべてのコンパイルフェーズを DPC++ コンパイラーに任せることを推奨しています。しかし、ホスト側のコンパイルにサードパーティー製コンパイラーを使用するユースケースもあります。-fsycl-host-compiler=<compiler_name>
コンパイラー・オプションでサードパーティー製コンパイラーを指定できます。以下に使用例を示します。
clang++ -fsycl -fsycl-host-compiler=g++ -fsycl-host-compiler-options="-g" test.cpp
上記のコマンドは以下の処理を実行します。
- DPC++ コンパイラーを使用して、必要なターゲット用のデバイスコードをコンパイルし、ホスト側の依存ファイル (「統合ファイル」) を生成します。
- ホスト側のコンパイラー (この場合は
g++
) を検出し、それを使用してホストコードとステップ 1 の依存ファイルをホスト・オブジェクト・ファイルにコンパイルします。 - ステップ 1 のデバイスイメージとステップ 2 のホスト・オブジェクトをリンクして、最終的な実行ファイルを生成します。
コンパイラーのオプションや DPC++ コンパイラーのコマンドライン・インターフェイスについては、DPC++ コンパイラーのユーザーマニュアル (英語) を参照してください。このフローに関する概念や DPC++ コンパイラー内部の詳細については、「DPC++ コンパイラーおよびランタイムのアーキテクチャー設計」を参照してください。
DPC++ で開発されたアプリケーションの使用
Q: バックエンドがサポートされていないマシンで SYCL* アプリケーションを実行するとどうなりますか?
A: SYCL* アプリケーションが適切なデバイスを見つけられない場合、SYCL* オブジェクト (sycl::context
、sycl::queue
など) または SYCL* デバイスセレクター (SYCL* 2020 仕様の 4.6.1.1 [英語 | 日本語参考訳] を参照) は errc::runtime
エラーコードで sycl::exception
をスローします。
一般的な問題
Q: DPC++ アプリケーションが libsycl.so (または sycl.dll) ライブラリーが見つからないというメッセージを出力します。
Linux*:
$ ./app $ ./app: error while loading shared libraries: libsycl.so: cannot open shared object file: No such file or directory
Windows*:
sycl.dll が見つからないため、コードの実行を続行できません。プログラムを再インストールすると問題が解決する場合があります。
A: DPC++ アプリケーションを実行するには、DPC++ ランタイム・ライブラリーが必要です。コンパイラー・ドライバーはこのライブラリーを見つけてリンクすることができますが、オペレーティング・システムは見つけられない可能性があります。DPC++ ランタイム・ライブラリーの場所が適切な環境変数で指定されていることを確認します: LD_LIBRARY_PATH
(Linux*) または LIB
(Windows*)。
Q: DPC++ コンパイラーが STD 関数を使用するデバイスコードのコンパイルに失敗します。
次のようなエラーメッセージが出力されます。
In file included from example.cpp:1: In file included from C:\compiler\lib\clang\10.0.0\include\sycl/sycl.hpp:11: In file included from C:\compiler\lib\clang\10.0.0\include\sycl/accessor.hpp:13: In file included from C:\compiler\lib\clang\10.0.0\include\sycl/buffer.hpp:10: In file included from C:\compiler\lib\clang\10.0.0\include\sycl/detail/buffer_impl.hpp:14: In file included from C:\compiler\lib\clang\10.0.0\include\sycl/detail/aligned_allocator.hpp:16: C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.22.27905\include\algorithm(4493,9): error: SYCL kernel cannot call a dllimport function _STL_ASSERT(!(_Left < _Right), "invalid comparator"); ^ C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.22.27905\include\yvals.h(193,33): note: expanded from macro '_STL_ASSERT' #define _STL_ASSERT(cond, mesg) _STL_VERIFY(cond, mesg) ^ C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.22.27905\include\yvals.h(186,13): note: expanded from macro '_STL_VERIFY' _STL_REPORT_ERROR(mesg); \ ^ C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.22.27905\include\yvals.h(178,9): note: expanded from macro '_STL_REPORT_ERROR' _RPTF0(_CRT_ASSERT, mesg); \ ^ C:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\ucrt\crtdbg.h(760,37): note: expanded from macro '_RPTF0' #define _RPTF0(rptno, msg) _RPT_BASE(rptno, __FILE__, __LINE__, NULL, "%s", msg) ^ C:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\ucrt\crtdbg.h(747,23): note: expanded from macro '_RPT_BASE' (void) ((1 != _CrtDbgReport(__VA_ARGS__)) || \ ^ C:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\ucrt\crtdbg.h(607,26): note: '_CrtDbgReport' declared here _ACRTIMP int __cdecl _CrtDbgReport(
A: SYCL* 仕様のセクション 6.3 に以下の説明があります。
Implementations are not required to support any library routines in kernels beyond those explicitly mentioned as usable in kernels in this spec. (仕様においてカーネルで使用可能であると明示的に言及されているもの以外のライブラリー・ルーチンを、カーネルでサポートすることは実装上要求されません。)
STD ビルトイン関数を SYCL* 定義の数学ビルトイン関数で置き換えます。ビルトイン名前空間 (sycl::fmin
) を明示的に指定する必要があることに注意してください。SYCL* 数学ビルトイン関数の一覧は、SYCL* 仕様のセクション 4.17.5 [英語 | 日本語参考訳] にあります。
デバイス固有の質問と問題
Q: DPC++ コンパイラーでサポートされているデバイスは何ですか?
A: 設計上、DPC++ と SYCL* は、専用デバイスにコードをオフロードする OpenCL* と密接に関係しています。DPC++ コンパイラーは現在、移植可能な中間表現フォーマットである SPIR-V* を使用しています。これは OpenCL* 2.1のコア機能であるため、OpenCL* 2.1 に対応したデバイスであればサポートされるはずです。そうでない場合は、OpenCL* デバイスが cl_khr_il_program
拡張をサポートしている必要があります。
さらに、開発者は対応するプラグインを記述することで、DPC++ ランタイムの機能を OpenCL* 以外のデバイスに拡張できます。詳細は、「DPC++ ランタイム・プラグイン・インターフェイス」 (https://github.com/intel/llvm/blob/sycl/sycl/doc/design/PluginInterface.md) を参照してください。
Q: ほかのデバイスでは正常に動作するのに、インテル® GPU で DPC++ アプリケーションがハングアップします。
A: 一般的な理由の 1 つは、インテル® GPUの「ハングチェック」と呼ばれる機能です。ワークロードが一定時間以上実行されると、ハードウェアによって強制終了されます。アプリケーションから見ると、これはハングアップしているように見えます。重いカーネルを実行できるようにするには、ハングチェックを無効にしてください。システムのほかのアプリケーションにバグがある場合、「ハングチェック」を無効にすると実際にハングアップする可能性があることに注意してください。
ハングチェックの詳細と無効にする方法については、https://www.intel.com/content/www/us/en/develop/documentation/installation-guide-for-intel-oneapi-toolkits-hpc-cluster/top/step-4-set-up-user-permissions.html を参照してください。