拡張 API

ここでは、拡張 API アルゴリズムと機能ユーティリティー・クラスの一覧を提供します。

現在、拡張 API にはアルゴリズム、イテレーター、および関数オブジェクト・クラスが含まれます。アルゴリズムには、セグメント化されたレデュース、セグメント化されたスキャン、およびベクトル化された検索アルゴリズムが含まれます。イテレーターは、ほかのイテレーターに対する zip、変換、置換操作を実装し、カウントイテレーターとディスカード・イテレーターを含みます。関数オブジェクト・クラスは、レデュースや変換などのアルゴリズムに渡すことができる minimum、maximum、および identity 操作を提供します。拡張 API には、範囲ベースのアルゴリズムの実験的な実装と、それを使用するために必要な範囲が含まれています。

並列アルゴリズム

拡張 API で提供されるアルゴリズムは、oneapi/dpl/algorithm ヘッダーで定義されています。すべてのアルゴリズムは、oneapi::dpl 名前空間で実装されています。

イテレーター

拡張 API で提供されるイテレーターは、oneapi/dpl/iterator ヘッダーで定義されています。すべてのイテレーターは、oneapi::dpl 名前空間で実装されています。

関数オブジェクト・クラス

拡張 API で提供される関数オブジェクトは、oneapi/dpl/functional で定義されています。すべての関数オブジェクトは、oneapi::dpl 名前空間で実装されています。

範囲ベース API

C++20 では「範囲」ライブラリーが導入されました。С++20 標準は、範囲を「factory (ファクトリー)」と「adaptor (アダプター)」の 2 つのカテゴリーに分割します。範囲ファクトリーにはデータがありません。要素は、成功した場合、インデックスによって、またはイテレーターを逆参照して生成されます。インテル® oneDPL にとって範囲アダプターは、ベース範囲や別の適用範囲をカスタム動作のビューに変換するユーティリティーです。インテル® oneDPL は iota_view 範囲ファクトリーをサポートしています。all_view でラップされた sycl::buffer は範囲として使用できます。インテル® oneDPl は、サポートされているファクトリーと all_view をベース範囲と見なします。範囲アダプターは、ベース範囲を先頭にしてパイプラインに結合することができます。次に例を示します。

cl::sycl::buffer<int> buf(data, cl::sycl::range<1>(10));    
auto range_1 = iota_view(0, 10) | views::reverse();    
auto range_2 = all_view(buf) | views::reverse();

all_view ファクトリー・ベースの範囲では、データアクセスはデバイス上でのみ許可されます。size() および empty() メソッドは、ホストまたはデバイスのいずれかで呼び出すことができます。範囲では次のアルゴリズムを使用できます。

以下は、2 つのイテレーターの代わりに source を使用して入力を表現する範囲ベースのアルゴリズムの特徴的な例です。destination は出力を表します。

template <typename ExecutionPolicy, typename Range1, typename Range2>  
void copy(ExecutionPolicy&& exec, Range1&& source, Range2&& destination);

これらのアルゴリズムは、oneapi::dpl::experimental::ranges 名前空間で宣言されており、DPC++ ポリシー用にのみ実装されています。これらのアルゴリズムを利用できるようにするには、 <oneapi/dpl/ranges> ヘッダーをインクルードする必要があります。範囲ベースの API を使用するには、gcc 8.1 以降または Clang 7 以降に同梱の C++17 および C++ 標準ライブラリーが必要です。

次の表示可能な範囲は、oneapi::dpl::experimental::ranges 名前空間で宣言されています。範囲ベースのアルゴリズムでは、次の値のみ範囲として使用できます。

以下は、範囲ベースの API の使用例です。

using namespace oneapi::dpl::experimental::ranges;
{
   cl::sycl::buffer<int> A(data, cl::sycl::range<1>(max_n));
   cl::sycl::buffer<int> B(data2, cl::sycl::range<1>(max_n));

   auto view = all_view(A) | views::reverse();
   auto range_res = all_view<int, cl::sycl::access::mode::write>(B);

   copy(oneapi::dpl::execution::dpcpp_default, view, range_res);
}