範囲ベース 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() メソッドは、ホストとデバイスの両方で呼び出すことができます。
範囲では次のアルゴリズムを使用できます。
adjacent_find
all_of
any_of
copy
copy_if
count
count_if
equal
exclusive_scan
find
find_if
find_if_not
find_end
find_first_of
for_each
inclusive_scan
is_sorted
is_sorted_until
min_element
max_element
merge
minmax_element
move
none_of
reduce
reduce_by_segment
remove
remove_if
remove_copy
remove_copy_if
replace
replace_if
replace_copy
replace_copy_if
reverse
reverse_copy
rotate_copy
search
sort
stable_sort
swap_ranges
transform
transform_reduce
transform_exclusive_scan
transform_inclusive_scan
unique
unique_copy
範囲ベースのアルゴリズムの特徴的な例を次に示します。
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 のみ範囲として使用できます。
views::iota: 初期値から N-1 までの N 要素のシーケンスを生成する範囲ファクトリー。
views::all: デバイスで読み書きする sycl::buffer のすべてまたは一部の要素のビューを表現するカスタム・ユーティリティー。
views::all_read: デバイスで読み取る sycl::buffer のすべてまたは一部の要素のビューを表現するカスタム・ユーティリティー。
views::all_write: デバイスで書き込む sycl::buffer のすべてまたは一部の要素のビューを表現するカスタム・ユーティリティー。
views::host_all: ホストで読み書きする sycl::buffer のすべてまたは一部の要素のビューを表現するカスタム・ユーティリティー。
views::subrange: 2 つの統合共有メモリー (USM) ポインターで定義された USM データ範囲のビューを表現するユーティリティー。
views::zip: ほかの複数のビューから 1 つの zip_view を生成するカスタム範囲アダプター。
views::transform: 各要素に変換を適用した後のシーケンスのビューを表現する範囲アダプター。
views::reverse: 別のビューによって提供された要素の反転したシーケンスを生成する範囲アダプター。
views::take: 別のビューの最初の N 要素のビューを生成する範囲アダプター。
views::drop: 別のビューの最初の N 要素を除外したビューを生成する範囲アダプター。
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);
}