Skip to content

Commit e7cd86b

Browse files
authored
[SYCL] Make vec and marray constructors constexpr (#4301)
The change is required for specialization constant implementation and was added to the SYCL 2020 specification (KhronosGroup/SYCL-Docs#133)
1 parent c16705a commit e7cd86b

File tree

3 files changed

+38
-25
lines changed

3 files changed

+38
-25
lines changed

sycl/include/CL/sycl/marray.hpp

100755100644
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,9 @@ template <typename Type, std::size_t NumElements> class marray {
4949
conjunction<TypeChecker<ArgTN, DataT>...>::value>::type;
5050

5151
public:
52-
marray() : MData{} {}
52+
constexpr marray() : MData{} {}
5353

54-
explicit marray(const Type &Arg) {
54+
explicit constexpr marray(const Type &Arg) {
5555
for (std::size_t I = 0; I < NumElements; ++I) {
5656
MData[I] = Arg;
5757
}
@@ -60,15 +60,15 @@ template <typename Type, std::size_t NumElements> class marray {
6060
template <
6161
typename... ArgTN, typename = EnableIfSuitableTypes<ArgTN...>,
6262
typename = typename std::enable_if<sizeof...(ArgTN) == NumElements>::type>
63-
marray(const ArgTN &... Args) : MData{Args...} {}
63+
constexpr marray(const ArgTN &... Args) : MData{Args...} {}
6464

65-
marray(const marray<Type, NumElements> &Rhs) {
65+
constexpr marray(const marray<Type, NumElements> &Rhs) {
6666
for (std::size_t I = 0; I < NumElements; ++I) {
6767
MData[I] = Rhs.MData[I];
6868
}
6969
}
7070

71-
marray(marray<Type, NumElements> &&Rhs) {
71+
constexpr marray(marray<Type, NumElements> &&Rhs) {
7272
for (std::size_t I = 0; I < NumElements; ++I) {
7373
MData[I] = Rhs.MData[I];
7474
}

sycl/include/CL/sycl/types.hpp

Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -650,7 +650,7 @@ template <typename Type, int NumElements> class vec {
650650
#ifdef __SYCL_DEVICE_ONLY__
651651
vec(const vec &Rhs) = default;
652652
#else
653-
vec(const vec &Rhs) : m_Data(Rhs.m_Data) {}
653+
constexpr vec(const vec &Rhs) : m_Data(Rhs.m_Data) {}
654654
#endif
655655

656656
vec(vec &&Rhs) = default;
@@ -682,7 +682,7 @@ template <typename Type, int NumElements> class vec {
682682
T>;
683683

684684
template <typename Ty = DataT>
685-
explicit vec(const EnableIfNotHostHalf<Ty> &arg) {
685+
explicit constexpr vec(const EnableIfNotHostHalf<Ty> &arg) {
686686
m_Data = (DataType)arg;
687687
}
688688

@@ -696,7 +696,8 @@ template <typename Type, int NumElements> class vec {
696696
return *this;
697697
}
698698

699-
template <typename Ty = DataT> explicit vec(const EnableIfHostHalf<Ty> &arg) {
699+
template <typename Ty = DataT>
700+
explicit constexpr vec(const EnableIfHostHalf<Ty> &arg) {
700701
for (int i = 0; i < NumElements; ++i) {
701702
setValue(i, arg);
702703
}
@@ -714,7 +715,7 @@ template <typename Type, int NumElements> class vec {
714715
return *this;
715716
}
716717
#else
717-
explicit vec(const DataT &arg) {
718+
explicit constexpr vec(const DataT &arg) {
718719
for (int i = 0; i < NumElements; ++i) {
719720
setValue(i, arg);
720721
}
@@ -743,28 +744,32 @@ template <typename Type, int NumElements> class vec {
743744
using EnableIfMultipleElems = typename detail::enable_if_t<
744745
std::is_convertible<T, DataT>::value && NumElements == IdxNum, DataT>;
745746
template <typename Ty = DataT>
746-
vec(const EnableIfMultipleElems<2, Ty> Arg0,
747-
const EnableIfNotHostHalf<Ty> Arg1)
747+
constexpr vec(const EnableIfMultipleElems<2, Ty> Arg0,
748+
const EnableIfNotHostHalf<Ty> Arg1)
748749
: m_Data{Arg0, Arg1} {}
749750
template <typename Ty = DataT>
750-
vec(const EnableIfMultipleElems<3, Ty> Arg0,
751-
const EnableIfNotHostHalf<Ty> Arg1, const DataT Arg2)
751+
constexpr vec(const EnableIfMultipleElems<3, Ty> Arg0,
752+
const EnableIfNotHostHalf<Ty> Arg1, const DataT Arg2)
752753
: m_Data{Arg0, Arg1, Arg2} {}
753754
template <typename Ty = DataT>
754-
vec(const EnableIfMultipleElems<4, Ty> Arg0,
755-
const EnableIfNotHostHalf<Ty> Arg1, const DataT Arg2, const Ty Arg3)
755+
constexpr vec(const EnableIfMultipleElems<4, Ty> Arg0,
756+
const EnableIfNotHostHalf<Ty> Arg1, const DataT Arg2,
757+
const Ty Arg3)
756758
: m_Data{Arg0, Arg1, Arg2, Arg3} {}
757759
template <typename Ty = DataT>
758-
vec(const EnableIfMultipleElems<8, Ty> Arg0,
759-
const EnableIfNotHostHalf<Ty> Arg1, const DataT Arg2, const DataT Arg3,
760-
const DataT Arg4, const DataT Arg5, const DataT Arg6, const DataT Arg7)
760+
constexpr vec(const EnableIfMultipleElems<8, Ty> Arg0,
761+
const EnableIfNotHostHalf<Ty> Arg1, const DataT Arg2,
762+
const DataT Arg3, const DataT Arg4, const DataT Arg5,
763+
const DataT Arg6, const DataT Arg7)
761764
: m_Data{Arg0, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7} {}
762765
template <typename Ty = DataT>
763-
vec(const EnableIfMultipleElems<16, Ty> Arg0,
764-
const EnableIfNotHostHalf<Ty> Arg1, const DataT Arg2, const DataT Arg3,
765-
const DataT Arg4, const DataT Arg5, const DataT Arg6, const DataT Arg7,
766-
const DataT Arg8, const DataT Arg9, const DataT ArgA, const DataT ArgB,
767-
const DataT ArgC, const DataT ArgD, const DataT ArgE, const DataT ArgF)
766+
constexpr vec(const EnableIfMultipleElems<16, Ty> Arg0,
767+
const EnableIfNotHostHalf<Ty> Arg1, const DataT Arg2,
768+
const DataT Arg3, const DataT Arg4, const DataT Arg5,
769+
const DataT Arg6, const DataT Arg7, const DataT Arg8,
770+
const DataT Arg9, const DataT ArgA, const DataT ArgB,
771+
const DataT ArgC, const DataT ArgD, const DataT ArgE,
772+
const DataT ArgF)
768773
: m_Data{Arg0, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7,
769774
Arg8, Arg9, ArgA, ArgB, ArgC, ArgD, ArgE, ArgF} {}
770775
#endif
@@ -773,7 +778,7 @@ template <typename Type, int NumElements> class vec {
773778
// base types are match and that the NumElements == sum of lengths of args.
774779
template <typename... argTN, typename = EnableIfSuitableTypes<argTN...>,
775780
typename = EnableIfSuitableNumElements<argTN...>>
776-
vec(const argTN &... args) {
781+
constexpr vec(const argTN &... args) {
777782
vaargCtorHelper(0, args...);
778783
}
779784

@@ -792,7 +797,7 @@ template <typename Type, int NumElements> class vec {
792797
typename = typename detail::enable_if_t<
793798
std::is_same<vector_t_, vector_t>::value &&
794799
!std::is_same<vector_t_, DataT>::value>>
795-
vec(vector_t openclVector) : m_Data(openclVector) {}
800+
constexpr vec(vector_t openclVector) : m_Data(openclVector) {}
796801
operator vector_t() const { return m_Data; }
797802
#endif
798803

sycl/test/basic_tests/SYCL-2020-spec-constants.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,14 @@ constexpr sycl::specialization_id<uint64_t> uint64_id(8);
3737
// constexpr sycl::specialization_id<half> half_id(9.0);
3838
constexpr sycl::specialization_id<float> float_id(10.0);
3939
constexpr sycl::specialization_id<double> double_id(11.0);
40+
constexpr sycl::marray<double, 5> ma;
41+
constexpr sycl::specialization_id<sycl::marray<double, 5>> marray_id5(11.0);
42+
constexpr sycl::specialization_id<sycl::marray<double, 1>> marray_id1(11.0);
43+
constexpr sycl::specialization_id<sycl::marray<double, 5>> marray_id_def(ma);
44+
constexpr sycl::vec<double, 4> v{};
45+
constexpr sycl::specialization_id<sycl::vec<double, 4>> vec_id_def(v);
46+
constexpr sycl::specialization_id<sycl::vec<double, 1>> vec_id1(11.0);
47+
constexpr sycl::specialization_id<sycl::vec<double, 4>> vec_id4(11.0);
4048

4149
struct composite {
4250
int a;

0 commit comments

Comments
 (0)