Skip to content

Commit 89b19c0

Browse files
[ESIMD] Allow constructing simd_view from simd (#4514)
* [ESIMD] Allow constructing simd_view from simd The patch allows the following code to work: ``` simd<int, 16> s = 0; simd_view v = s; ``` I added default template parameter for simd_view_impl class and put it as a last template argument. Signed-off-by: Vyacheslav N Klochkov <[email protected]> Co-authored-by: kbobrovs <[email protected]> Co-authored-by: DenisBakhvalov <[email protected]>
1 parent 1d8ceba commit 89b19c0

File tree

3 files changed

+34
-3
lines changed

3 files changed

+34
-3
lines changed

sycl/include/sycl/ext/intel/experimental/esimd/detail/simd_view_impl.hpp

+6-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,10 @@ namespace detail {
2525
/// It is an internal class implementing basic functionality of simd_view.
2626
///
2727
/// \ingroup sycl_esimd
28-
template <typename BaseTy, typename RegionTy> class simd_view_impl {
28+
template <typename BaseTy,
29+
typename RegionTy =
30+
region1d_t<typename BaseTy::element_type, BaseTy::length, 1>>
31+
class simd_view_impl {
2932
using Derived = simd_view<BaseTy, RegionTy>;
3033
template <typename, int, class, class> friend class simd_obj_impl;
3134
template <typename, int> friend class simd;
@@ -65,6 +68,8 @@ template <typename BaseTy, typename RegionTy> class simd_view_impl {
6568
: M_base(Base), M_region(Region) {}
6669
simd_view_impl(BaseTy &&Base, RegionTy Region)
6770
: M_base(Base), M_region(Region) {}
71+
72+
simd_view_impl(BaseTy &Base) : M_base(Base), M_region(RegionTy(0)) {}
6873
/// @}
6974
public:
7075
// Default copy and move constructors.

sycl/include/sycl/ext/intel/experimental/esimd/simd_view.hpp

+10-2
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,9 @@ namespace esimd {
2525
/// via an instance of this class.
2626
///
2727
/// \ingroup sycl_esimd
28-
template <typename BaseTy, typename RegionTy>
28+
template <typename BaseTy,
29+
typename RegionTy =
30+
region1d_t<typename BaseTy::element_type, BaseTy::length, 1>>
2931
class simd_view : public detail::simd_view_impl<BaseTy, RegionTy> {
3032
template <typename, int, class, class> friend class detail::simd_obj_impl;
3133
template <typename, int> friend class detail::simd_mask_impl;
@@ -66,10 +68,13 @@ class simd_view : public detail::simd_view_impl<BaseTy, RegionTy> {
6668
/// @}
6769

6870
public:
69-
// Default copy and move constructors for simd_view.
71+
/// Default copy and move constructors for simd_view.
7072
simd_view(const simd_view &Other) = default;
7173
simd_view(simd_view &&Other) = default;
7274

75+
/// Construct a complete view of a vector
76+
simd_view(BaseTy &Base) : BaseClass(Base) {}
77+
7378
simd_view &operator=(const simd_view &Other) {
7479
BaseClass::operator=(Other);
7580
return *this;
@@ -137,6 +142,9 @@ class simd_view<BaseTy, region1d_scalar_t<T>>
137142
simd_view(BaseTy &&Base, RegionTy Region) : BaseClass(Base, Region) {}
138143

139144
public:
145+
/// Construct a complete view of a vector
146+
simd_view(BaseTy &Base) : BaseClass(Base) {}
147+
140148
operator element_type() const {
141149
const auto v = BaseClass::read();
142150
return v[0];

sycl/test/esimd/simd_view.cpp

+18
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,24 @@ SYCL_ESIMD_FUNCTION void test_simd_view_copy_ctor() {
106106
auto v0_view_copy(v0_view);
107107
}
108108

109+
// test construction from vector.
110+
SYCL_ESIMD_FUNCTION void test_simd_view_from_vector() {
111+
simd<int, 16> v16 = 0;
112+
simd_view sv16a = v16;
113+
simd_view sv16b(v16);
114+
// expected-error@+5 {{no matching constructor for initialization of 'simd_view}}
115+
// expected-note@sycl/ext/intel/experimental/esimd/simd_view.hpp:* 3 {{candidate }}
116+
// expected-note@sycl/ext/intel/experimental/esimd/simd.hpp:* {{candidate }}
117+
// expected-note@sycl/ext/intel/experimental/esimd/detail/simd_obj_impl.hpp:* {{candidate }}
118+
// expected-note@sycl/ext/intel/experimental/esimd/simd_view.hpp:* 2 {{candidate }}
119+
simd_view<simd<int, 16>, region_base<false, int, 1, 1, 16, 1>> sv16c(
120+
(simd<int, 16>()));
121+
122+
simd<int, 1> v1 = 0;
123+
simd_view sv1a = v1;
124+
simd_view sv1b(v1);
125+
}
126+
109127
// move constructor transfers the same view of the underlying data.
110128
SYCL_ESIMD_FUNCTION void test_simd_view_move_ctor() {
111129
simd<int, 16> v0 = 1;

0 commit comments

Comments
 (0)