デバイスの選択
デバイス (CPU、GPU または FPGA など) へのコードのオフロードは、DPC++ アプリケーションと OpenMP* アプリケーションの両方で利用できます。
ホストコードでの DPC++ デバイス選択
ホストコードは明示的にデバイスタイプを選択できます。デバイスを選択には、キューを選択して次のいずれかのデバイスを初期化します。
default_selectorcpu_selectorgpu_selectoraccelerator_selector
default_selector が使用されると、カーネルは利用可能な計算デバイス (すべて、または ONEAPI_DEVICE_SELECTOR 環境変数の値に基づくサブセット)から選択するヒューリスティックに基づいて実行されます。
注: SYCL_DEVICE_FILTER は oneAPI ツールキット 2023.1 で非推奨になりました。
特定のデバイスタイプ (cpu_selector や gpu_selector) を使用する場合、指定されたデバイスタイプがプラットフォームで利用可能であるか、ONEAPI_DEVICE_SELECTOR で指定されるフィルターに含まれていなければなりません。指定したデバイスが利用できない場合、ランタイムシステムはデバイスが利用できないことを示す例外をスローします。このエラーは、事前コンパイル (AOT) したバイナリーが、指定するデバイスタイプを含まないプラットフォームで実行されるとスローされることがあります。
注
DPC++ アプリケーションは、サポートされる任意のターゲット・ハードウェアで実行できますが、特定のターゲット・ハードウェアで最高のパフォーマンスを引き出すにはチューニングが必要です。例えば、CPU 向けにチューニングされたコードは、変更なしでは GPU アクセラレーターでは高速に実行できない可能性があります。
ONEAPI_DEVICE_SELECTOR は、DPC++ ランタイムで使用されるランタイム、計算デバイスタイプ、計算デバイス ID を利用可能なすべての組み合わせのサブセットに制御できる複雑な環境変数です。計算デバイス ID は、SYCL* API、clinfo または sycl-ls (0 から始まる番号)によって返されるID に対応し、その ID を持つデバイスが特定のタイプであるか、特定のランタイムをサポートするかは関係ありません。プログラムが特定のセレクター (gpu_selector など) を使用して、フィルターで除外されたデバイスを要求すると、例外がスローされます。使い方と設定可能な値の例については、GitHub* の環境変数の説明をご覧ください:
https://github.com/intel/llvm/blob/sycl/sycl/doc/EnvironmentVariables.md (英語)
sycl-ls ツールを使用して、システムで利用可能なデバイスを確認できます。SYCL* や DPC++ プログラムを実行する前に、このツールでデバイスを確認することを推奨します。sycl-ls は、ONEAPI_DEVICE_SELECTOR に設定されている文字列を各デバイスのプリフィクスとして出力します。Sycl-ls の出力形式は次のようになります:
[ONEAPI_DEVICE_SELECTOR] Platform_name, Device_name, Device_version [driver_version]次の例で各行の先頭の角かっこ ([ ]) で囲まれた文字列は、プログラムが実行される特定のデバイスを指定する ONEAPI_DEVICE_SELECTOR 文字列です。
デバイス選択の例
$ sycl-ls
[opencl:acc:0] Intel® FPGA Emulation Platform for OpenCL™ software, Intel® FPGA Emulation Device 1.2 [2021.12.9.0.24_005321]
[opencl:gpu:1] Intel® OpenCL HD Graphics, Intel® UHD Graphics 630 [0x3e92] 3.0 [21.37.20939]
[opencl:cpu:2] Intel® OpenCL, Intel® Core™ i7-8700 CPU @ 3.20GHz 3.0 [2021.12.9.0.24_005321]
[level_zero:gpu:0] Intel® oneAPI Level Zero, Intel® UHD Graphics 630 [0x3e92] 1.1 [1.2.20939]
[host:host:0] SYCL host platform, SYCL host device 1.2 [1.2]デバイス選択に関する追加情報は、Khronos* SYCL* リファレンス (英語) から入手できます。
ホストコードでの OpenMP* デバイスの確認と選択
OpenMP* では、開発者がデバイス上でコードを実行できるか確認および設定する API が用意されています。ホストコードはデバイス番号を明示的に選択および設定できます。開発者は、オフロード領域ごとに device 句を使用して、オフロード領域を実行するターゲットデバイスを指定できます。
int omp_get_num_procs (void)ルーチンは、デバイスで利用できるプロセッサー数を決定します。void omp_set_default_device(int device_num)ルーチンは、コードまたはデータをオフロードするデフォルトのターゲットデバイスを制御します。int omp_get_default_device(void)ルーチンは、デフォルトのターゲットデバイスを返します。int omp_get_num_devices(void)ルーチンは、コードまたはデータをオフロードできるホスト以外のデバイスの数を返します。int omp_get_device_num(void)ルーチンは、呼び出したスレッドが実行されているデバイスのデバイス番号を返します。int omp_is_initial_device(int device_num)ルーチンは、現在のタスクがホストデバイスで実行されている場合は true を返します。そうでない場合は、false を返します。int omp_get_initial_device(void)ルーチンは、ホストデバイスを表すデバイス番号を返します。
開発者は、環境変数 LIBOMPTARGET_DEVICETYPE = [ CPU | GPU ] で実行するデバイスタイプを選択できます。CPU や GPU のように特定のデバイスが指定される場合、そのデバイスがプラットフォームで利用可能であることが求められます。指定するデバイスが利用できない場合、ランタイムシステムは環境変数 OMP_TARGET_OFFLOAD が =mandatory の場合、要求されたデバイスが利用できないという意味のメッセージを出力します。それ以外の場合はベースデバイス (通常は CPU) へフォールバック実行されます。デバイスの選択に関する追加機能は、OpenMP* 5.2 仕様:で確認できます。環境変数に関する詳細は、以下の GitHub* ページから入手できます:
https://github.com/intel/llvm/blob/sycl/sycl/doc/EnvironmentVariables.md (英語)