Skip to content

[ESIMD] Allow constructing simd_view from simd #4514

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

Merged
merged 8 commits into from
Nov 2, 2021
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,9 @@ namespace detail {
/// It is an internal class implementing basic functionality of simd_view.
///
/// \ingroup sycl_esimd
template <typename BaseTy, typename RegionTy, typename Derived>
template <typename BaseTy, typename Derived,
typename RegionTy =
region1d_t<typename BaseTy::element_type, BaseTy::length, 1>>
class simd_view_impl {
template <typename, int> friend class simd;
template <typename, typename, typename> friend class simd_view_impl;
Expand Down Expand Up @@ -61,6 +63,7 @@ class simd_view_impl {
: M_base(Base), M_region(Region) {}
simd_view_impl(BaseTy &&Base, RegionTy Region)
: M_base(Base), M_region(Region) {}
simd_view_impl(BaseTy &Base) : M_base(Base), M_region(RegionTy(0)) {}

public:
// Default copy and move constructors.
Expand Down
26 changes: 16 additions & 10 deletions sycl/include/sycl/ext/intel/experimental/esimd/simd_view.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,15 +24,18 @@ namespace esimd {
/// via an instance of this class.
///
/// \ingroup sycl_esimd
template <typename BaseTy, typename RegionTy>
class simd_view : public detail::simd_view_impl<BaseTy, RegionTy,
simd_view<BaseTy, RegionTy>> {
template <typename BaseTy,
typename RegionTy =
region1d_t<typename BaseTy::element_type, BaseTy::length, 1>>
class simd_view
: public detail::simd_view_impl<BaseTy, simd_view<BaseTy, RegionTy>,
RegionTy> {
template <typename, int> friend class simd;
template <typename, typename, typename> friend class detail::simd_view_impl;

public:
using BaseClass =
detail::simd_view_impl<BaseTy, RegionTy, simd_view<BaseTy, RegionTy>>;
detail::simd_view_impl<BaseTy, simd_view<BaseTy, RegionTy>, RegionTy>;
using ShapeTy = typename shape_type<RegionTy>::type;
static constexpr int length = ShapeTy::Size_x * ShapeTy::Size_y;

Expand All @@ -41,6 +44,9 @@ class simd_view : public detail::simd_view_impl<BaseTy, RegionTy,
/// The simd type if reading this simd_view object.
using value_type = simd<element_type, length>;

// Construct a complete view of a vector
simd_view(BaseTy &Base) : BaseClass(Base) {}

private:
simd_view(BaseTy &Base, RegionTy Region) : BaseClass(Base, Region) {}
simd_view(BaseTy &&Base, RegionTy Region) : BaseClass(Base, Region) {}
Expand Down Expand Up @@ -173,15 +179,15 @@ class simd_view : public detail::simd_view_impl<BaseTy, RegionTy,
template <typename BaseTy, typename T, int StrideY, int StrideX>
class simd_view<BaseTy, region1d_scalar_t<T, StrideY, StrideX>>
: public detail::simd_view_impl<
BaseTy, region1d_scalar_t<T, StrideY, StrideX>,
simd_view<BaseTy, region1d_scalar_t<T, StrideY, StrideX>>> {
BaseTy, simd_view<BaseTy, region1d_scalar_t<T, StrideY, StrideX>>,
region1d_scalar_t<T, StrideY, StrideX>> {
template <typename, int> friend class simd;
template <typename, typename, typename> friend class detail::simd_view_impl;

public:
using RegionTy = region1d_scalar_t<T, StrideY, StrideX>;
using BaseClass =
detail::simd_view_impl<BaseTy, RegionTy, simd_view<BaseTy, RegionTy>>;
detail::simd_view_impl<BaseTy, simd_view<BaseTy, RegionTy>, RegionTy>;
using ShapeTy = typename shape_type<RegionTy>::type;
static constexpr int length = ShapeTy::Size_x * ShapeTy::Size_y;
static_assert(1 == length, "length of this view is not equal to 1");
Expand Down Expand Up @@ -237,17 +243,17 @@ class simd_view<BaseTy,
std::pair<region1d_scalar_t<T, StrideY, StrideX>, NestedRegion>>
: public detail::simd_view_impl<
BaseTy,
std::pair<region1d_scalar_t<T, StrideY, StrideX>, NestedRegion>,
simd_view<BaseTy, std::pair<region1d_scalar_t<T, StrideY, StrideX>,
NestedRegion>>> {
NestedRegion>>,
std::pair<region1d_scalar_t<T, StrideY, StrideX>, NestedRegion>> {
template <typename, int> friend class simd;
template <typename, typename, typename> friend class detail::simd_view_impl;

public:
using RegionTy =
std::pair<region1d_scalar_t<T, StrideY, StrideX>, NestedRegion>;
using BaseClass =
detail::simd_view_impl<BaseTy, RegionTy, simd_view<BaseTy, RegionTy>>;
detail::simd_view_impl<BaseTy, simd_view<BaseTy, RegionTy>, RegionTy>;
using ShapeTy = typename shape_type<RegionTy>::type;
static constexpr int length = ShapeTy::Size_x * ShapeTy::Size_y;
static_assert(1 == length, "length of this view is not equal to 1");
Expand Down
13 changes: 13 additions & 0 deletions sycl/test/esimd/simd_view.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,19 @@ SYCL_ESIMD_FUNCTION void test_simd_view_copy_ctor() {
auto v0_view_copy(v0_view);
}

// test construction from vector.
SYCL_ESIMD_FUNCTION void test_simd_view_from_vector() {
simd<int, 16> s = 0;
Copy link
Contributor

Choose a reason for hiding this comment

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

please a test case for length 1

Copy link
Contributor

Choose a reason for hiding this comment

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

Added here: 33eede7

simd_view v1 = s;
simd_view v2(s);
// expected-error@+4 {{no matching constructor for initialization of 'simd_view}}
// expected-note@sycl/ext/intel/experimental/esimd/simd_view.hpp:* {{candidate constructor not viable: expects an lvalue for 1st argument}}
// expected-note@sycl/ext/intel/experimental/esimd/simd_view.hpp:* 4+ {{candidate constructor not viable:}}
// expected-note@sycl/ext/intel/experimental/esimd/simd.hpp:* {{candidate template ignored:}}
simd_view<simd<int, 16>, region_base<false, int, 1, 0, 16, 1>> v3(
(simd<int, 16>()));
}

// move constructor transfers the same view of the underlying data.
SYCL_ESIMD_FUNCTION void test_simd_view_move_ctor() {
simd<int, 16> v0 = 1;
Expand Down