並列 API は、「C++ 標準実行ポリシー」を使用して、ホスト上での並列処理を有効にします。
インテル® oneAPI DPC++ ライブラリー (インテル® oneDPL) は、「oneDPL 仕様」 (英語) に従って実装されます。
ヘテロジニアスをサポートするため、インテル® oneDPL はデータ並列 C++ (DPC++) API と連携して動作します。詳細は、「DPC++ 仕様」 (英語) を参照してください。
インテル® oneAPI DPC++ ライブラリー (インテル® oneDPL) の「リリースノート」 (英語) の次のセクションを確認します。
リリースの入手方法
概要
新機能
修正された問題
既知の問題と制限事項
インテル® oneDPL を使用するには、インテル® oneAPI ベース・ツールキット (ベースキット) (英語) をインストールします。
すべてのインテル® oneDPL ヘッダーファイルは、oneapi/dpl ディレクトリーにあります。インテル® oneDPL API を使用するには、ソースコードの対応するヘッダーに #include <oneapi/dpl/…> ディレクティブをインクルードします。インテル® oneDPL のほとんどのクラスと関数は、oneapi::dpl 名前空間を使用します。
検証済みの C++ 標準 API を使用するには、対応する C++ 標準ヘッダーファイルをインクルードして、std 名前空間を使用する必要があります。
インテル® oneDPL 2021.6 以降でサポートされる C++ 標準の最小バージョンは C++17 です。つまり、インテル® oneDPL を使用するには、C++17 以降に対応したコンパイラーが必要です。一部の API は古いバージョンの C++ 標準で動作する場合がありますが、動作は保証されていません。
C++ 標準ポリシーで並列 API を呼び出すには、次のソフトウェアをインストールする必要があります。
OpenMP* 4.0 以降の SIMD 構造をサポートする C++ コンパイラー
使用する並列バックエンドに応じて、以下のいずれかをインストールします。
インテル® oneAPI スレッディング・ビルディング・ブロック (インテル® oneTBB) またはインテル® スレッディング・ビルディング・ブロック (インテル® TBB) 2019 以降
OpenMP* 4.5 以降をサポートする C++ コンパイラー
並列バックエンドについては、「実行ポリシー」を参照してください。
DPC++ 標準ポリシーで並列 API を使用するには、次のソフトウェアをインストールする必要があります。
SYCL* 2020 をサポートする C++ コンパイラー
DPC++ 実行ポリシーで呼び出す場合、インテル® oneDPL アルゴリズムは、以下のような DPC++ と同じ制限を適用します (詳細は DPC++ 仕様と SYCL* 仕様を参照)。
ラムダ・キャプチャー・リストへのバッファーの追加は、アルゴリズムに渡されるラムダに対しては許可されていません。
通常の方法でコピーできないデータ型を渡すことは、USM では許可されていますが、バッファーやホスト割り当てコンテナーでは許可されません。
並列アルゴリズムで使用されるラムダ関数の定義は、ホストとデバイスで異なるプリプロセッサー・マクロに依存しないようにする必要があります。そうでない場合の動作は不定です。
DPC++ カーネル内で使用する場合やデバイスとの間で転送する場合、コンテナークラスは、カーネル内やデータ転送に使用するための DPC++ 要件を満たす型のオブジェクトのみ保持できます。
アルゴリズムに渡される呼び出し可能なオブジェクト内では、例外をスローする API を呼び出すことはできません。
transform_exclusive_scan と transform_inclusive_scan アルゴリズムでは、単項演算の結果は、初期値が提供されている場合は初期値の型に、そうでない場合は処理されたデータシーケンスの値の型に変換可能でなければなりません (std::iterator_traits<IteratorType>::value_type)。
exclusive_scan と transform_exclusive_scan アルゴリズムは、GCC 10 で -O0 オプションを使用してプログラムをビルドすると、ベクトル実行ポリシーで正しくない結果を提供する場合があります。
インテル® oneDPL を GNU* C++ 標準ライブラリー (libstdc++) バージョン 9 または 10 とともに使用すると、(インテル® oneTBB API の変更に起因する) コンパイルエラーが発生する場合があります。これらの問題を解決するには、インテル® oneDPL のヘッダーファイルを標準 C++ ヘッダーファイルの前にインクルードするか、標準ライブラリーの並列アルゴリズムのサポートを無効にします。詳細は、「インテル® oneAPI スレッディング・ビルディング・ブロック (インテル® oneTBB) リリースノート」 (英語) を参照してください。
インテル® oneDPL プログラムコードで using namespace oneapi; ディレクティブを使用すると、GCC 7 以前を含む一部のコンパイラーでコンパイルエラーが発生する場合があります。このディレクティブの代わりに、明示的に oneapi::dpl 名前空間を使用するか、名前空間のエイリアスを作成します。
std::array::at メンバー関数は例外をスローするため、カーネル関数では使用できません。代わりに、std::array::operator[] を使用します。
Microsoft* Visual C++* の仕様により、一部の標準浮動小数点数学関数 (std::ldexp、std::frexp、std::sqrt(std::complex<float>) を含む) を使用するには、デバイスで倍精度がサポートされている必要があります。
以下の手順を使用して、インテル® oneDPL でコードをビルドします。
インテル® oneAPI DPC++/C++ コンパイラーでビルドする場合、詳細は「インテル® oneAPI DPC++/C++ コンパイラー導入ガイド」 (英語) を参照してください。
インテル® oneDPL とインテル® oneTBB の環境変数を設定します。
デバイス・ポリシー・オブジェクトの名前を明示的に指定しない場合は、-fsycl-unnamed-lambda オプションを追加します。
以下は、Linux*上でインテル® oneDPL 並列アルゴリズムを含むコードをコンパイルするためのコマンドラインの例です (コードによっては [] 内のパラメーターは不要な場合があります)。
dpcpp [-fsycl-unnamed-lambda] test.cpp [-ltbb|-fopenmp] -o test