Ahead-Of-Time (AOT) コンパイルは、アプリケーションを実行するターゲットデバイスが事前に分かっている場合、開発ライフサイクルや展開時間の短縮に役立つ機能です。AOT 機能には、次のような利点があります。
- アプリケーションの実行時に追加のコンパイル時間が発生しません。
- AOT コンパイルでは、ターゲットデバイス向けにジャストインタイム (JIT) コンパイルが行われないため、JIT 関連の問題が発生しません。
- エンドユーザーに提供する前に、ターゲットデバイス上で実行される最終コードをテストできます。
注
特定のターゲットデバイス向けに AOT コンパイルされたプログラムは、それ以外のデバイスでは動作しません。実行時に適切なターゲットデバイスを検出して、ターゲットデバイスが存在しない場合はエラーを報告する必要があります。非同期例外ハンドラーによる例外処理の使用が推奨されます。
データ並列 C++ (DPC++) は、インテル® CPU、インテル® プロセッサー・グラフィックス (Gen9 以降)、およびインテル® FPGA で AOT コンパイルをサポートします。
必要条件
GPU ターゲット向けに AOT 機能を使用するには、OCLOC ツールがインストールされている必要があります。使用しているオペレーティング・システムにツールをインストールするには、『インテル® oneAPI ツールキット・インストール・ガイド』 (英語) の「OpenCL* オフライン・コンパイラー (OCLOC) のインストール」を参照してください。
インテル® CPU 向けに AOT を使用する方法
次のオプションがサポートされます。
- -fsycl-targets=spir64_x86_64-unknown-unknown-sycldevice
- -Xs "-march=<arch>"。ここで、<arch> は次のいずれかです。
- avx512 (インテル® アーキテクチャー・プロセッサー向けのインテル® アドバンスト・ベクトル・エクステンション 512 (インテル® AVX-512) の基本命令、競合検出命令、ダブルワードおよびクワッドワード命令、バイトおよびワード命令、ベクトル長の拡張、および -march=avx2 で有効になる命令をサポートします。)
- avx2 (インテル® アドバンスト・ベクトル・エクステンション 2 (インテル® AVX2)、インテル® アドバンスト・ベクトル・エクステンション (インテル® AVX)、インテル® ストリーミング SIMD 拡張命令 4.2 (インテル® SSE4.2)、インテル® SSE4.1、インテル® SSE3、インテル® SSE2、インテル® SSE、およびインテル® ストリーミング SIMD 3 補足命令 (インテル® SSSE3) をサポートします。)
- avx (インテル® AVX、インテル® SSE4.2、インテル® SSE4.1、インテル® SSE3、インテル® SSE2、インテル® SSE、およびインテル® SSSE3 をサポートします。)
- sse4.2 (インテル® SSE4.2 高効率および高速な文字列処理命令、インテル® SSE4 ベクトル化コンパイラー命令およびメディア・アクセラレーター命令、インテル® SSE3、インテル® SSE2、インテル® SSE、およびインテル® SSSE3 をサポートします。)
例:
- Linux*: dpcpp -fsycl-targets=spir64_x86_64-unknown-unknown-sycldevice -Xs "-march=avx2" main.cpp
- Windows*: dpcpp /EHsc -fsycl-targets=spir64_x86_64-unknown-unknown-sycldevice -Xs "-march=avx2" test_cpu.cpp
CPU ターゲット向けに複数のソースファイルを持つアプリケーションをビルド
方法 1: 最初に、通常のファイル (DPC++ カーネルなし) をコンパイルしてホスト・オブジェクトを作成します。次に、カーネルコードを含むファイルをコンパイルし、1 つのコマンドラインで残りのアプリケーションとリンクします。
- Linux*
- dpcpp -c main.cpp
- dpcpp -fsycl-targets=spir64_x86_64-unknown-unknown-sycldevice -Xs "-march=avx2" mandel.cpp main.o
- Windows*
- dpcpp -c /EHsc main.cpp
- dpcpp /EHsc -fsycl-targets=spir64_x86_64-unknown-unknown-sycldevice -Xs "-march=avx2" mandel.cpp -link main.obj
方法 2: 最初に、カーネルコードを含むファイルをコンパイルして、FAT オブジェクトを作成します。次に、残りのファイルをコンパイルして、1 つのコマンドラインでリンクして FAT 実行ファイルを作成します。
- Linux*
- dpcpp -c -fsycl-targets=spir64_x86_64-unknown-unknown-sycldevice -Xs "-march=avx2" mandel.cpp
- dpcpp main.cpp mandel.o
- Windows*
- dpcpp -c /EHsc -fsycl-targets=spir64_x86_64-unknown-unknown-sycldevice -Xs "-march=avx2" mandel.cpp
- dpcpp /EHsc main.cpp mandel.obj
注
現在、方法 2 は HOST セレクターでのみ動作します。
インテル® インテグレーテッド・グラフィックス (Gen9 以降) 向けに AOT を使用する方法
次のオプションがサポートされます。
すべてのデバイスタイプを表示するには、次のコマンドを使用します。
ocloc compiler --help
複数のターゲットデバイスがリストされている場合、インテル® oneAPI DPC++/C++ コンパイラーはこれらのターゲットごとにコンパイルし、この方法で作成されたすべてのデバイスバイナリーを含む FAT バイナリーを作成します。
サポートされる -device パターンの例:
- Linux*
- skl を使用して単一のターゲット向けにコンパイルするには、次のコマンドを実行します。
dpcpp -fsycl-targets=spir64_gen-unknown-unknown-sycldevice -Xs '-device skl' vector-add.cpp
- skl と icllp を使用して 2 つのターゲット向けにコンパイルするには、次のコマンドを実行します。
dpcpp -fsycl-targets=spir64_gen-unknown-unknown-sycldevice -Xs '-device skl,icllp' vector-add.cpp
- OCLOC で検出されたすべてのターゲット向けにコンパイルするには、次のコマンドを実行します。
dpcpp -fsycl-targets=spir64_gen-unknown-unknown-sycldevice -Xs '-device *' vector-add.cpp
- Windows*
- skl を使用して単一のターゲット向けにコンパイルするには、次のコマンドを実行します。
dpcpp -fsycl-targets=spir64_gen-unknown-unknown-sycldevice -Xs '-device skl' vector-add.cpp
- skl と icllp を使用して 2 つのターゲット向けにコンパイルするには、次のコマンドを実行します。
dpcpp -fsycl-targets=spir64_gen-unknown-unknown-sycldevice -Xs '-device skl,icllp' vector-add.cpp
- OCLOC で検出されたすべてのターゲット向けにコンパイルするには、次のコマンドを実行します。
dpcpp -fsycl-targets=spir64_gen-unknown-unknown-sycldevice -Xs '-device *' vector-add.cpp