diff --git a/sycl/include/sycl/ext/intel/experimental/esimd/detail/simd_view_impl.hpp b/sycl/include/sycl/ext/intel/experimental/esimd/detail/simd_view_impl.hpp index 72f9b9381ad70..d87f64e464909 100644 --- a/sycl/include/sycl/ext/intel/experimental/esimd/detail/simd_view_impl.hpp +++ b/sycl/include/sycl/ext/intel/experimental/esimd/detail/simd_view_impl.hpp @@ -25,7 +25,10 @@ namespace detail { /// It is an internal class implementing basic functionality of simd_view. /// /// \ingroup sycl_esimd -template class simd_view_impl { +template > +class simd_view_impl { using Derived = simd_view; template friend class simd_obj_impl; template friend class simd; @@ -65,6 +68,8 @@ template 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. diff --git a/sycl/include/sycl/ext/intel/experimental/esimd/simd_view.hpp b/sycl/include/sycl/ext/intel/experimental/esimd/simd_view.hpp index a6d18fcde31a4..9000f8fee80f7 100644 --- a/sycl/include/sycl/ext/intel/experimental/esimd/simd_view.hpp +++ b/sycl/include/sycl/ext/intel/experimental/esimd/simd_view.hpp @@ -25,7 +25,9 @@ namespace esimd { /// via an instance of this class. /// /// \ingroup sycl_esimd -template +template > class simd_view : public detail::simd_view_impl { template friend class detail::simd_obj_impl; template friend class detail::simd_mask_impl; @@ -66,10 +68,13 @@ class simd_view : public detail::simd_view_impl { /// @} public: - // Default copy and move constructors for simd_view. + /// Default copy and move constructors for simd_view. simd_view(const simd_view &Other) = default; simd_view(simd_view &&Other) = default; + /// Construct a complete view of a vector + simd_view(BaseTy &Base) : BaseClass(Base) {} + simd_view &operator=(const simd_view &Other) { BaseClass::operator=(Other); return *this; @@ -137,6 +142,9 @@ class simd_view> simd_view(BaseTy &&Base, RegionTy Region) : BaseClass(Base, Region) {} public: + /// Construct a complete view of a vector + simd_view(BaseTy &Base) : BaseClass(Base) {} + operator element_type() const { const auto v = BaseClass::read(); return v[0]; diff --git a/sycl/test/esimd/simd_view.cpp b/sycl/test/esimd/simd_view.cpp index d7cbb2ed2c35a..602dd8fa48c20 100644 --- a/sycl/test/esimd/simd_view.cpp +++ b/sycl/test/esimd/simd_view.cpp @@ -106,6 +106,24 @@ 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 v16 = 0; + simd_view sv16a = v16; + simd_view sv16b(v16); + // expected-error@+5 {{no matching constructor for initialization of 'simd_view}} + // expected-note@sycl/ext/intel/experimental/esimd/simd_view.hpp:* 3 {{candidate }} + // expected-note@sycl/ext/intel/experimental/esimd/simd.hpp:* {{candidate }} + // expected-note@sycl/ext/intel/experimental/esimd/detail/simd_obj_impl.hpp:* {{candidate }} + // expected-note@sycl/ext/intel/experimental/esimd/simd_view.hpp:* 2 {{candidate }} + simd_view, region_base> sv16c( + (simd())); + + simd v1 = 0; + simd_view sv1a = v1; + simd_view sv1b(v1); +} + // move constructor transfers the same view of the underlying data. SYCL_ESIMD_FUNCTION void test_simd_view_move_ctor() { simd v0 = 1;