24 template <
typename Type, std::
size_t NumElements>
class marray {
37 template <
class...>
struct conjunction : std::true_type {};
38 template <
class B1,
class... tail>
39 struct conjunction<B1, tail...>
40 : std::conditional<bool(B1::value), conjunction<tail...>, B1>::type {};
43 template <
typename T,
typename DataT_>
44 struct TypeChecker : std::is_convertible<T, DataT_> {};
47 template <
typename... ArgTN>
48 using EnableIfSuitableTypes =
typename std::enable_if<
49 conjunction<TypeChecker<ArgTN, DataT>...>::value>::type;
51 constexpr
void initialize_data(
const Type &Arg) {
52 for (
size_t i = 0; i < NumElements; ++i) {
60 explicit constexpr
marray(
const Type &Arg) : MData{Arg} {
65 typename... ArgTN,
typename = EnableIfSuitableTypes<ArgTN...>,
66 typename =
typename std::enable_if<
sizeof...(ArgTN) == NumElements>::type>
67 constexpr
marray(
const ArgTN &... Args) : MData{Args...} {}
69 constexpr marray(
const marray<Type, NumElements> &Rhs) =
default;
71 constexpr marray(marray<Type, NumElements> &&Rhs) =
default;
74 template <std::size_t Size = NumElements,
75 typename =
typename std::enable_if<Size == 1>>
76 operator Type()
const {
80 static constexpr std::size_t
size() noexcept {
return NumElements; }
91 for (std::size_t I = 0; I < NumElements; ++I) {
107 #error "Undefine __SYCL_BINOP macro"
110 #ifdef __SYCL_BINOP_INTEGRAL
111 #error "Undefine __SYCL_BINOP_INTEGRAL macro"
114 #define __SYCL_BINOP(BINOP, OPASSIGN) \
115 friend marray operator BINOP(const marray &Lhs, const marray &Rhs) { \
117 for (size_t I = 0; I < NumElements; ++I) { \
118 Ret[I] = Lhs[I] BINOP Rhs[I]; \
122 template <typename T> \
123 friend typename std::enable_if< \
124 std::is_convertible<DataT, T>::value && \
125 (std::is_fundamental<T>::value || \
126 std::is_same<typename std::remove_const<T>::type, half>::value), \
128 operator BINOP(const marray &Lhs, const T &Rhs) { \
129 return Lhs BINOP marray(static_cast<DataT>(Rhs)); \
131 friend marray &operator OPASSIGN(marray &Lhs, const marray &Rhs) { \
132 Lhs = Lhs BINOP Rhs; \
135 template <std::size_t Num = NumElements> \
136 friend typename std::enable_if<Num != 1, marray &>::type operator OPASSIGN( \
137 marray &Lhs, const DataT &Rhs) { \
138 Lhs = Lhs BINOP marray(Rhs); \
142 #define __SYCL_BINOP_INTEGRAL(BINOP, OPASSIGN) \
143 template <typename T = DataT, \
144 typename = std::enable_if<std::is_integral<T>::value, marray>> \
145 friend marray operator BINOP(const marray &Lhs, const marray &Rhs) { \
147 for (size_t I = 0; I < NumElements; ++I) { \
148 Ret[I] = Lhs[I] BINOP Rhs[I]; \
152 template <typename T, typename BaseT = DataT> \
153 friend typename std::enable_if<std::is_convertible<T, DataT>::value && \
154 std::is_integral<T>::value && \
155 std::is_integral<BaseT>::value, \
157 operator BINOP(const marray &Lhs, const T &Rhs) { \
158 return Lhs BINOP marray(static_cast<DataT>(Rhs)); \
160 template <typename T = DataT, \
161 typename = std::enable_if<std::is_integral<T>::value, marray>> \
162 friend marray &operator OPASSIGN(marray &Lhs, const marray &Rhs) { \
163 Lhs = Lhs BINOP Rhs; \
166 template <std::size_t Num = NumElements, typename T = DataT> \
167 friend typename std::enable_if<Num != 1 && std::is_integral<T>::value, \
169 operator OPASSIGN(marray &Lhs, const DataT &Rhs) { \
170 Lhs = Lhs BINOP marray(Rhs); \
186 #undef __SYCL_BINOP_INTEGRAL
188 #ifdef __SYCL_RELLOGOP
189 #error "Undefine __SYCL_RELLOGOP macro"
192 #ifdef __SYCL_RELLOGOP_INTEGRAL
193 #error "Undefine __SYCL_RELLOGOP_INTEGRAL macro"
196 #define __SYCL_RELLOGOP(RELLOGOP) \
197 friend marray<bool, NumElements> operator RELLOGOP(const marray &Lhs, \
198 const marray &Rhs) { \
199 marray<bool, NumElements> Ret; \
200 for (size_t I = 0; I < NumElements; ++I) { \
201 Ret[I] = Lhs[I] RELLOGOP Rhs[I]; \
205 template <typename T> \
206 friend typename std::enable_if<std::is_convertible<T, DataT>::value && \
207 (std::is_fundamental<T>::value || \
208 std::is_same<T, half>::value), \
209 marray<bool, NumElements>>::type \
210 operator RELLOGOP(const marray &Lhs, const T &Rhs) { \
211 return Lhs RELLOGOP marray(static_cast<const DataT &>(Rhs)); \
214 #define __SYCL_RELLOGOP_INTEGRAL(RELLOGOP) \
215 template <typename T = DataT> \
216 friend typename std::enable_if<std::is_integral<T>::value, \
217 marray<bool, NumElements>>::type \
218 operator RELLOGOP(const marray &Lhs, const marray &Rhs) { \
219 marray<bool, NumElements> Ret; \
220 for (size_t I = 0; I < NumElements; ++I) { \
221 Ret[I] = Lhs[I] RELLOGOP Rhs[I]; \
225 template <typename T, typename BaseT = DataT> \
226 friend typename std::enable_if<std::is_convertible<T, DataT>::value && \
227 std::is_integral<T>::value && \
228 std::is_integral<BaseT>::value, \
229 marray<bool, NumElements>>::type \
230 operator RELLOGOP(const marray &Lhs, const T &Rhs) { \
231 return Lhs RELLOGOP marray(static_cast<const DataT &>(Rhs)); \
244 #undef __SYCL_RELLOGOP
245 #undef __SYCL_RELLOGOP_INTEGRAL
248 #error "Undefine __SYCL_UOP macro"
251 #define __SYCL_UOP(UOP, OPASSIGN) \
252 friend marray &operator UOP(marray &Lhs) { \
256 friend marray operator UOP(marray &Lhs, int) { \
268 template <
typename T = DataT>
269 friend typename std::enable_if<std::is_integral<T>::value, marray>::type
272 for (
size_t I = 0; I < NumElements; ++I) {
280 for (
size_t I = 0; I < NumElements; ++I) {
288 for (
size_t I = 0; I < NumElements; ++I) {
296 for (
size_t I = 0; I < NumElements; ++I) {
303 #define __SYCL_MAKE_MARRAY_ALIAS(ALIAS, TYPE, N) \
304 using ALIAS##N = cl::sycl::marray<TYPE, N>;
306 #define __SYCL_MAKE_MARRAY_ALIASES_FOR_ARITHMETIC_TYPES(N) \
307 __SYCL_MAKE_MARRAY_ALIAS(mchar, char, N) \
308 __SYCL_MAKE_MARRAY_ALIAS(mshort, short, N) \
309 __SYCL_MAKE_MARRAY_ALIAS(mint, int, N) \
310 __SYCL_MAKE_MARRAY_ALIAS(mlong, long, N) \
311 __SYCL_MAKE_MARRAY_ALIAS(mfloat, float, N) \
312 __SYCL_MAKE_MARRAY_ALIAS(mdouble, double, N) \
313 __SYCL_MAKE_MARRAY_ALIAS(mhalf, half, N)
315 #define __SYCL_MAKE_MARRAY_ALIASES_FOR_SIGNED_AND_UNSIGNED_TYPES(N) \
316 __SYCL_MAKE_MARRAY_ALIAS(mschar, signed char, N) \
317 __SYCL_MAKE_MARRAY_ALIAS(muchar, unsigned char, N) \
318 __SYCL_MAKE_MARRAY_ALIAS(mushort, unsigned short, N) \
319 __SYCL_MAKE_MARRAY_ALIAS(muint, unsigned int, N) \
320 __SYCL_MAKE_MARRAY_ALIAS(mulong, unsigned long, N) \
321 __SYCL_MAKE_MARRAY_ALIAS(mlonglong, long long, N) \
322 __SYCL_MAKE_MARRAY_ALIAS(mulonglong, unsigned long long, N)
324 #define __SYCL_MAKE_MARRAY_ALIASES_FOR_MARRAY_LENGTH(N) \
325 __SYCL_MAKE_MARRAY_ALIASES_FOR_ARITHMETIC_TYPES(N) \
326 __SYCL_MAKE_MARRAY_ALIASES_FOR_SIGNED_AND_UNSIGNED_TYPES(N)
334 #undef __SYCL_MAKE_MARRAY_ALIAS
335 #undef __SYCL_MAKE_MARRAY_ALIASES_FOR_ARITHMETIC_TYPES
336 #undef __SYCL_MAKE_MARRAY_ALIASES_FOR_SIGNED_AND_UNSIGNED_TYPES
337 #undef __SYCL_MAKE_MARRAY_ALIASES_FOR_MARRAY_LENGTH