範囲ベース API のアルゴリズム

範囲ベース API を使用するには、gcc 8.1 以降または Clang 7 以降に同梱の C++17 および C++ 標準ライブラリーが必要です。

C++20 では「範囲」ライブラリーが導入されました。С++20 標準は、範囲を「factory (ファクトリー)」と「adaptor (アダプター)」の 2 つのカテゴリーに分割します。範囲ファクトリーにはデータがありません。要素は、成功した場合、インデックスによって、またはイテレーターを逆参照して生成されます。インテル® oneAPI DPC++ ライブラリー (インテル® oneDPL) にとって範囲アダプターは、ベース範囲や別の適用範囲をカスタム動作のビューに変換するユーティリティーです。

インテル® oneDPL は iota_view 範囲ファクトリーをサポートしています。

all_view でラップされた sycl::buffer は範囲として使用できます。

インテル® oneDPl は、サポートされているファクトリーと all_view をベース範囲と見なします。範囲アダプターは、base 範囲を先頭にしてパイプラインに結合することができます。次に例を示します。

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() メソッドは、ホストとデバイスの両方で呼び出すことができます。

範囲では次のアルゴリズムを使用できます。

範囲ベースのアルゴリズムの特徴的な例を次に示します。

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

2 つのイテレーターの代わりに source を使用して入力を表現し、destination を使用して出力を表現しています。

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

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

範囲ベース 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);
}