Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use only C++20 features #1702

Draft
wants to merge 2 commits into
base: distributed-ranges
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -312,12 +312,12 @@ if (ONEDPL_BACKEND MATCHES "^(tbb|dpcpp|dpcpp_only)$")
${ONEDPL_AOT_OPTIONS}
)

# if C++23 or newer, include Distributed Ranges (experimental)
if (CMAKE_CXX_STANDARD GREATER_EQUAL 23)
# if C++20 or newer, include Distributed Ranges (experimental)
if (CMAKE_CXX_STANDARD GREATER_EQUAL 20)
set(ONEDPL_USE_DR TRUE)
message(STATUS "Adding Distributed Ranges to the project")
else()
message(STATUS "C++23 required to use Distributed Ranges in oneDPL")
message(STATUS "C++20 required to use Distributed Ranges in oneDPL")
endif()
endif()

Expand Down
4 changes: 2 additions & 2 deletions include/oneapi/dpl/distributed-ranges
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,10 @@
#include "oneapi/dpl/internal/common_config.h"
#include "oneapi/dpl/pstl/onedpl_config.h"

#if __cplusplus > 202002L
#if __cplusplus >= 202002L
#include "oneapi/dpl/internal/distributed_ranges_impl/shp.hpp"
#else
#error "C++23 required to use Distributed Ranges"
#error "C++20 required to use Distributed Ranges"
#endif

#endif // _ONEDPL_DISTRIBUTED_RANGES
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
#pragma once

#include <oneapi/dpl/internal/distributed_ranges_impl/detail/ranges_shim.hpp>
#include <oneapi/dpl/internal/distributed_ranges_impl/shp/zip_view.hpp>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is common code for mhp and shp. We can't use shp specific code here.


namespace oneapi::dpl::experimental::dr
{
Expand Down Expand Up @@ -57,11 +58,11 @@ class enumerate_adapter_closure
using W = std::conditional_t<std::weakly_incrementable<S>, S, std::size_t>;
if constexpr (rng::sized_range<R>)
{
return rng::views::zip(rng::views::iota(W{0}, W{rng::size(r)}), std::forward<R>(r));
return oneapi::dpl::experimental::dr::shp::views::zip(rng::views::iota(W{0}, W{rng::size(r)}), std::forward<R>(r));
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This code is already in "oneapi::dpl::experimental::dr" namespace, use just "shp::"... Please use shorter namespaces also in other places where full namespace is not needed.

}
else
{
return rng::views::zip(rng::views::iota(W{0}), std::forward<R>(r));
return oneapi::dpl::experimental::dr::shp::views::zip(rng::views::iota(W{0}), std::forward<R>(r));
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,12 @@ drop_segments(R&& segments, std::size_t first_seg, std::size_t local_id)
}
};

return enumerate(segments) | rng::views::drop(first_seg) | rng::views::transform(std::move(drop_partial));
auto segments_dropped = enumerate(segments) | rng::views::drop(first_seg);
auto segments_transformed = segments_dropped | rng::views::transform(std::move(drop_partial));
return segments_transformed;


// return enumerate(segments) | rng::views::drop(first_seg) | rng::views::transform(std::move(drop_partial));
}

// Drop the first n elements
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ sort(R&& r, Compare comp = Compare())

T* medians = sycl::malloc_device<T>(n_segments * n_splitters, shp::devices()[0], shp::context());

for (auto&& [segment_id_, segment] : rng::views::enumerate(segments))
for (auto&& [segment_id_, segment] : views::enumerate(segments))
{
auto const segment_id = static_cast<std::size_t>(segment_id_);
auto&& q = __detail::queue(ranges::rank(segment));
Expand Down Expand Up @@ -160,7 +160,7 @@ sort(R&& r, Compare comp = Compare())
// segments". Simultaneously compute the offsets `push_positions` where each
// segments' corresponding elements will be pushed.

for (auto&& [segment_id, segment] : rng::views::enumerate(segments))
for (auto&& [segment_id, segment] : views::enumerate(segments))
{
auto&& q = __detail::queue(ranges::rank(segment));
auto&& local_policy = __detail::dpl_policy(ranges::rank(segment));
Expand Down Expand Up @@ -196,7 +196,7 @@ sort(R&& r, Compare comp = Compare())
// Allocate new "sorted segments"
std::vector<T*> sorted_segments;

for (auto&& [segment_id, segment] : rng::views::enumerate(segments))
for (auto&& [segment_id, segment] : views::enumerate(segments))
{
auto&& q = __detail::queue(ranges::rank(segment));

Expand All @@ -205,7 +205,7 @@ sort(R&& r, Compare comp = Compare())
}

// Copy corresponding elements to each "sorted segment"
for (auto&& [segment_id_, segment] : rng::views::enumerate(segments))
for (auto&& [segment_id_, segment] : views::enumerate(segments))
{
auto&& local_segment = __detail::local(segment);
const auto segment_id = static_cast<std::size_t>(segment_id_);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,10 @@

#include <oneapi/dpl/internal/distributed_ranges_impl/detail/iterator_adaptor.hpp>
#include <oneapi/dpl/internal/distributed_ranges_impl/detail/owning_view.hpp>
#include <oneapi/dpl/internal/distributed_ranges_impl/detail/ranges_shim.hpp>
#include <oneapi/dpl/internal/distributed_ranges_impl/detail/view_detectors.hpp>
#include <oneapi/dpl/internal/distributed_ranges_impl/detail/ranges.hpp>
#include <oneapi/dpl/internal/distributed_ranges_impl/shp/remote_span.hpp>
#include <oneapi/dpl/internal/distributed_ranges_impl/detail/ranges_shim.hpp>

namespace oneapi::dpl::experimental::dr
{
Expand Down Expand Up @@ -298,7 +299,7 @@ class zip_view : public rng::view_interface<zip_view<Rs...>>
auto
local_impl_(std::index_sequence<Ints...>) const noexcept
{
return rng::views::zip(__detail::local(std::get<Ints>(views_))...);
return zip_view<decltype(oneapi::dpl::experimental::dr::ranges::__detail::local(std::get<Ints>(views_)))...>(oneapi::dpl::experimental::dr::ranges::__detail::local(std::get<Ints>(views_))...);
}

template <std::size_t I, typename R>
Expand Down Expand Up @@ -377,7 +378,7 @@ class zip_view : public rng::view_interface<zip_view<Rs...>>
auto
begin_impl_(std::index_sequence<Is...>) const
{
return zip_iterator<rng::iterator_t<Rs>...>(rng::begin(std::get<Is>(views_))...);
return zip_iterator<rng::iterator_t<decltype(std::get<Is>(views_))>...>(rng::begin(std::get<Is>(views_))...);
}

template <distributed_range T>
Expand Down
4 changes: 2 additions & 2 deletions test/distributed-ranges/common/distributed_vector.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ TYPED_TEST(DistributedVectorAllTypes, Stream) {
TYPED_TEST(DistributedVectorAllTypes, Equality) {
Ops1<TypeParam> ops(10);
iota(ops.dist_vec, 100);
rng::iota(ops.vec, 100);
std::iota(ops.vec.begin(), ops.vec.end(), 100);
EXPECT_TRUE(ops.dist_vec == ops.vec);
EXPECT_EQ(ops.vec, ops.dist_vec);
}
Expand All @@ -83,7 +83,7 @@ TEST(DistributedVector, ConstructorBasic) {
iota(dist_vec, 100);

std::vector<int> local_vec(10);
rng::iota(local_vec, 100);
std::iota(local_vec.begin(), local_vec.end(), 100);

EXPECT_EQ(local_vec, dist_vec);
}
Expand Down
4 changes: 2 additions & 2 deletions test/distributed-ranges/common/enumerate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,13 +25,13 @@ TYPED_TEST_SUITE(Enumerate, AllTypes);
TYPED_TEST(Enumerate, Basic) {
Ops1<TypeParam> ops(10);

EXPECT_TRUE(check_view(rng::views::enumerate(ops.vec),
EXPECT_TRUE(check_view(oneapi::dpl::experimental::dr::__detail::enumerate(ops.vec),
xhp::views::enumerate(ops.dist_vec)));
}

TYPED_TEST(Enumerate, Mutate) {
Ops1<TypeParam> ops(10);
auto local = rng::views::enumerate(ops.vec);
auto local = oneapi::dpl::experimental::dr::__detail::enumerate(ops.vec);
auto dist = xhp::views::enumerate(ops.dist_vec);

auto copy = [](auto &&v) { std::get<1>(v) = std::get<0>(v); };
Expand Down
4 changes: 2 additions & 2 deletions test/distributed-ranges/common/for_each.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ TYPED_TEST(ForEach, RangeAlignedZip) {

auto copy = [](auto v) { std::get<0>(v) = std::get<1>(v); };
auto dist = xhp::views::zip(ops.dist_vec0, ops.dist_vec1);
auto local = rng::views::zip(ops.vec0, ops.vec1);
auto local = xhp::views::zip(ops.vec0, ops.vec1);

xhp::for_each(dist, copy);
rng::for_each(local, copy);
Expand Down Expand Up @@ -109,7 +109,7 @@ TYPED_TEST(ForEach, DISABLED_RangeUnalignedZip) {
auto copy = [](auto v) { std::get<0>(v) = std::get<1>(v); };
auto dist =
xhp::views::zip(xhp::views::drop(ops.dist_vec0, 1), ops.dist_vec1);
auto local = rng::views::zip(rng::views::drop(ops.vec0, 1), ops.vec1);
auto local = xhp::views::zip(rng::views::drop(ops.vec0, 1), ops.vec1);

xhp::for_each(dist, copy);
rng::for_each(local, copy);
Expand Down
2 changes: 1 addition & 1 deletion test/distributed-ranges/common/sort.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ TEST(Sort, Wave) { test_sort2s({1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1}); }

TEST(Sort, LongSorted) {
LV v(100000);
rng::iota(v, 1);
std::iota(v.begin(), v.end(), 1);
test_sort2s(v);

rng::reverse(v);
Expand Down
34 changes: 17 additions & 17 deletions test/distributed-ranges/common/zip.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ TYPED_TEST_SUITE(Zip, AllTypes);
TYPED_TEST(Zip, Dist1) {
Ops1<TypeParam> ops(10);

auto local = rng::views::zip(ops.vec);
auto local = xhp::views::zip(ops.vec);
auto dist = test_zip(ops.dist_vec);
static_assert(compliant_view<decltype(dist)>);
EXPECT_TRUE(check_view(local, dist));
Expand All @@ -38,7 +38,7 @@ TYPED_TEST(Zip, Dist1) {
TYPED_TEST(Zip, Dist2) {
Ops2<TypeParam> ops(10);

auto local = rng::views::zip(ops.vec0, ops.vec1);
auto local = xhp::views::zip(ops.vec0, ops.vec1);
auto dist = test_zip(ops.dist_vec0, ops.dist_vec1);
static_assert(compliant_view<decltype(dist)>);
EXPECT_TRUE(check_view(local, dist));
Expand All @@ -47,7 +47,7 @@ TYPED_TEST(Zip, Dist2) {
TYPED_TEST(Zip, Dist3) {
Ops3<TypeParam> ops(10);

auto local = rng::views::zip(ops.vec0, ops.vec1, ops.vec2);
auto local = xhp::views::zip(ops.vec0, ops.vec1, ops.vec2);
auto dist = test_zip(ops.dist_vec0, ops.dist_vec1, ops.dist_vec2);
static_assert(compliant_view<decltype(dist)>);
EXPECT_TRUE(check_view(local, dist));
Expand All @@ -57,14 +57,14 @@ TYPED_TEST(Zip, Dist3Distance) {
Ops3<TypeParam> ops(10);

EXPECT_EQ(
rng::distance(rng::views::zip(ops.vec0, ops.vec1, ops.vec2)),
rng::distance(xhp::views::zip(ops.vec0, ops.vec1, ops.vec2)),
rng::distance(test_zip(ops.dist_vec0, ops.dist_vec1, ops.dist_vec2)));
}

TYPED_TEST(Zip, RangeSegments) {
Ops1<TypeParam> ops(10);

auto local = rng::views::zip(ops.vec);
auto local = xhp::views::zip(ops.vec);
auto dist = test_zip(ops.dist_vec);
auto flat = rng::views::join(dr::ranges::segments(dist));
EXPECT_TRUE(is_equal(local, flat));
Expand All @@ -75,7 +75,7 @@ TYPED_TEST(Zip, RangeSegments) {
TYPED_TEST(Zip, IterSegments) {
Ops1<TypeParam> ops(10);

auto local = rng::views::zip(ops.vec);
auto local = xhp::views::zip(ops.vec);
auto dist = test_zip(ops.dist_vec);
auto flat = rng::views::join(dr::ranges::segments(dist.begin()));
EXPECT_TRUE(is_equal(local, flat));
Expand All @@ -85,7 +85,7 @@ TYPED_TEST(Zip, IterSegments) {
TYPED_TEST(Zip, Drop) {
Ops1<TypeParam> ops(10);

auto local = rng::views::drop(rng::views::zip(ops.vec), 2);
auto local = rng::views::drop(xhp::views::zip(ops.vec), 2);
auto dist = xhp::views::drop(test_zip(ops.dist_vec), 2);

auto flat = rng::views::join(dr::ranges::segments(dist));
Expand All @@ -96,7 +96,7 @@ TYPED_TEST(Zip, Drop) {
TYPED_TEST(Zip, ConsumingAll) {
Ops1<TypeParam> ops(10);

auto local = rng::views::zip(rng::views::all(ops.vec));
auto local = xhp::views::zip(rng::views::all(ops.vec));
auto dist = test_zip(xhp::views::all(ops.dist_vec));
static_assert(compliant_view<decltype(dist)>);
EXPECT_EQ(local, dist);
Expand All @@ -105,7 +105,7 @@ TYPED_TEST(Zip, ConsumingAll) {
TYPED_TEST(Zip, FeedingAll) {
Ops1<TypeParam> ops(10);

auto local = rng::views::all(rng::views::zip(ops.vec));
auto local = rng::views::all(xhp::views::zip(ops.vec));
auto dist = xhp::views::all(test_zip(ops.dist_vec));
static_assert(compliant_view<decltype(dist)>);
EXPECT_EQ(local, dist);
Expand All @@ -116,7 +116,7 @@ TYPED_TEST(Zip, ForEach) {

auto copy = [](auto &&v) { std::get<1>(v) = std::get<0>(v); };
xhp::for_each(test_zip(ops.dist_vec0, ops.dist_vec1), copy);
rng::for_each(rng::views::zip(ops.vec0, ops.vec1), copy);
rng::for_each(xhp::views::zip(ops.vec0, ops.vec1), copy);

EXPECT_EQ(ops.vec0, ops.dist_vec0);
EXPECT_EQ(ops.vec1, ops.dist_vec1);
Expand All @@ -128,7 +128,7 @@ TYPED_TEST(Zip, ForEachDrop) {
auto copy = [](auto &&v) { std::get<1>(v) = std::get<0>(v); };
xhp::for_each(xhp::views::drop(test_zip(ops.dist_vec0, ops.dist_vec1), 1),
copy);
rng::for_each(xhp::views::drop(rng::views::zip(ops.vec0, ops.vec1), 1), copy);
rng::for_each(xhp::views::drop(xhp::views::zip(ops.vec0, ops.vec1), 1), copy);

EXPECT_EQ(ops.vec0, ops.dist_vec0);
EXPECT_EQ(ops.vec1, ops.dist_vec1);
Expand All @@ -138,7 +138,7 @@ TYPED_TEST(Zip, ConsumingSubrange) {
Ops2<TypeParam> ops(10);

auto local =
rng::views::zip(rng::subrange(ops.vec0.begin() + 1, ops.vec0.end() - 1),
xhp::views::zip(rng::subrange(ops.vec0.begin() + 1, ops.vec0.end() - 1),
rng::subrange(ops.vec1.begin() + 1, ops.vec1.end() - 1));
auto dist = test_zip(
rng::subrange(ops.dist_vec0.begin() + 1, ops.dist_vec0.end() - 1),
Expand All @@ -150,7 +150,7 @@ TEST(Zip, FeedingTransform) {
Ops2<xhp::distributed_vector<int>> ops(10);

auto mul = [](auto v) { return std::get<0>(v) * std::get<1>(v); };
auto local = rng::views::transform(rng::views::zip(ops.vec0, ops.vec1), mul);
auto local = rng::views::transform(xhp::views::zip(ops.vec0, ops.vec1), mul);
auto dist_zip = test_zip(ops.dist_vec0, ops.dist_vec1);
auto dist = xhp::views::transform(dist_zip, mul);
static_assert(compliant_view<decltype(dist)>);
Expand All @@ -170,7 +170,7 @@ TYPED_TEST(Zip, TransformReduce) {

auto mul = [](auto v) { return std::get<0>(v) * std::get<1>(v); };

auto local = rng::views::transform(rng::views::zip(ops.vec0, ops.vec1), mul);
auto local = rng::views::transform(xhp::views::zip(ops.vec0, ops.vec1), mul);
auto local_reduce = std::reduce(local.begin(), local.end());

auto dist =
Expand All @@ -196,7 +196,7 @@ TYPED_TEST(Zip, IotaStaticAssert) {
TYPED_TEST(Zip, Iota) {
Ops1<TypeParam> ops(10);

auto local = rng::views::zip(rng::views::iota(100), ops.vec);
auto local = xhp::views::zip(rng::views::iota(100), ops.vec);
auto dist = test_zip(xhp::views::iota(100), ops.dist_vec);
static_assert(compliant_view<decltype(dist)>);
EXPECT_EQ(local, dist);
Expand All @@ -205,7 +205,7 @@ TYPED_TEST(Zip, Iota) {
TYPED_TEST(Zip, Iota2nd) {
Ops1<TypeParam> ops(10);

EXPECT_TRUE(check_view(rng::views::zip(ops.vec, rng::views::iota(100)),
EXPECT_TRUE(check_view(xhp::views::zip(ops.vec, rng::views::iota(100)),
test_zip(ops.dist_vec, xhp::views::iota(100))));
}

Expand All @@ -214,7 +214,7 @@ TYPED_TEST(Zip, ForEachIota) {

auto copy = [](auto &&v) { std::get<1>(v) = std::get<0>(v); };
xhp::for_each(test_zip(xhp::views::iota(100), ops.dist_vec), copy);
rng::for_each(rng::views::zip(rng::views::iota(100), ops.vec), copy);
rng::for_each(xhp::views::zip(rng::views::iota(100), ops.vec), copy);

EXPECT_EQ(ops.vec, ops.dist_vec);
EXPECT_EQ(ops.vec, ops.dist_vec);
Expand Down
12 changes: 6 additions & 6 deletions test/distributed-ranges/include/common-tests.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ inline std::ostream &operator<<(std::ostream &os, const AOS_Struct &st) {
template <typename T> struct Ops1 {
Ops1(std::size_t n) : dist_vec(n), vec(n) {
iota(dist_vec, 100);
rng::iota(vec, 100);
std::iota(vec.begin(), vec.end(), 100);
}

T dist_vec;
Expand All @@ -68,8 +68,8 @@ template <typename T> struct Ops2 {
Ops2(std::size_t n) : dist_vec0(n), dist_vec1(n), vec0(n), vec1(n) {
iota(dist_vec0, 100);
iota(dist_vec1, 200);
rng::iota(vec0, 100);
rng::iota(vec1, 200);
std::iota(vec0.begin(), vec0.end(), 100);
std::iota(vec1.begin(), vec1.end(), 200);
}

T dist_vec0, dist_vec1;
Expand All @@ -82,9 +82,9 @@ template <typename T> struct Ops3 {
iota(dist_vec0, 100);
iota(dist_vec1, 200);
iota(dist_vec2, 300);
rng::iota(vec0, 100);
rng::iota(vec1, 200);
rng::iota(vec2, 300);
std::iota(vec0.begin(), vec0.end(), 100);
std::iota(vec1.begin(), vec1.end(), 200);
std::iota(vec2.begin(), vec2.end(), 300);
}

T dist_vec0, dist_vec1, dist_vec2;
Expand Down
Loading