DPC++ Runtime
Runtime libraries for oneAPI DPC++
builtins.hpp
Go to the documentation of this file.
1 //==--- builtins.hpp - SYCL_ONEAPI_CUDA experimental builtins -------------==//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #pragma once
10 
11 #define SYCL_EXT_ONEAPI_CUDA_TEX_CACHE_READ 1
12 
13 #include <sycl/types.hpp>
14 
15 #if defined(_WIN32) || defined(_WIN64)
16 #define ATTRIBUTE_EXT_VEC_TYPE(N) __declspec(ext_vector_type(N))
17 #else
18 #define ATTRIBUTE_EXT_VEC_TYPE(N) __attribute__((ext_vector_type(N)))
19 #endif
20 
21 namespace sycl {
22 inline namespace _V1 {
23 namespace ext {
24 namespace oneapi {
25 namespace experimental {
26 namespace cuda {
27 
28 namespace detail {
47 
48 using ldg_types =
52 } // namespace detail
53 
54 template <typename T>
55 inline __SYCL_ALWAYS_INLINE std::enable_if_t<
58  T>
59 ldg(const T *ptr) {
60 #if defined(__SYCL_DEVICE_ONLY__)
61 #if defined(__NVPTX__)
62  if constexpr (std::is_same_v<T, char>) {
63  return __nvvm_ldg_c(ptr);
64  } else if constexpr (std::is_same_v<T, signed char>) {
65  return __nvvm_ldg_sc(ptr);
66  } else if constexpr (std::is_same_v<T, short>) {
67  return __nvvm_ldg_s(ptr);
68  } else if constexpr (std::is_same_v<T, int>) {
69  return __nvvm_ldg_i(ptr);
70  } else if constexpr (std::is_same_v<T, long>) {
71  return __nvvm_ldg_l(ptr);
72  } else if constexpr (std::is_same_v<T, long long>) {
73  return __nvvm_ldg_ll(ptr);
74  } else if constexpr (std::is_same_v<T, unsigned char>) {
75  return __nvvm_ldg_uc(ptr);
76  } else if constexpr (std::is_same_v<T, unsigned short>) {
77  return __nvvm_ldg_us(ptr);
78  } else if constexpr (std::is_same_v<T, unsigned int>) {
79  return __nvvm_ldg_ui(ptr);
80  } else if constexpr (std::is_same_v<T, unsigned long>) {
81  return __nvvm_ldg_ul(ptr);
82  } else if constexpr (std::is_same_v<T, unsigned long long>) {
83  return __nvvm_ldg_ull(ptr);
84  } else if constexpr (std::is_same_v<T, half>) {
85  auto native = reinterpret_cast<const __fp16 *>(ptr);
86  return __nvvm_ldg_h(native);
87  } else if constexpr (std::is_same_v<T, float>) {
88  return __nvvm_ldg_f(ptr);
89  } else if constexpr (std::is_same_v<T, double>) {
90  return __nvvm_ldg_d(ptr);
91  } else if constexpr (std::is_same_v<T, sycl::vec<char, 2>>) {
92  // We can assume that ptr is aligned at least to char2's alignment, but the
93  // load will assume that ptr is aligned to char2's alignment. This is only
94  // safe if alignof(f2) <= alignof(char2).
95  typedef char c2 ATTRIBUTE_EXT_VEC_TYPE(2);
96  c2 rv = __nvvm_ldg_c2(reinterpret_cast<const c2 *>(ptr));
98  ret.x() = rv[0];
99  ret.y() = rv[1];
100  return ret;
101  } else if constexpr (std::is_same_v<T, sycl::vec<char, 3>>) {
102  typedef char c2 ATTRIBUTE_EXT_VEC_TYPE(2);
103  c2 rv_2 = __nvvm_ldg_c2(reinterpret_cast<const c2 *>(ptr));
104  char rv = __nvvm_ldg_c(reinterpret_cast<const char *>(
105  std::next(reinterpret_cast<const c2 *>(ptr))));
106  sycl::vec<char, 3> ret;
107  ret.x() = rv_2[0];
108  ret.y() = rv_2[1];
109  ret.z() = rv;
110  return ret;
111  } else if constexpr (std::is_same_v<T, sycl::vec<char, 4>>) {
112  typedef char c4 ATTRIBUTE_EXT_VEC_TYPE(4);
113  c4 rv = __nvvm_ldg_c4(reinterpret_cast<const c4 *>(ptr));
114  sycl::vec<char, 4> ret;
115  ret.x() = rv[0];
116  ret.y() = rv[1];
117  ret.z() = rv[2];
118  ret.w() = rv[3];
119  return ret;
120  } else if constexpr (std::is_same_v<T, sycl::vec<signed char, 2>>) {
121  typedef signed char sc2 ATTRIBUTE_EXT_VEC_TYPE(2);
122  sc2 rv = __nvvm_ldg_sc2(reinterpret_cast<const sc2 *>(ptr));
124  ret.x() = rv[0];
125  ret.y() = rv[1];
126  return ret;
127  } else if constexpr (std::is_same_v<T, sycl::vec<signed char, 3>>) {
128  typedef signed char sc2 ATTRIBUTE_EXT_VEC_TYPE(2);
129  sc2 rv_2 = __nvvm_ldg_sc2(reinterpret_cast<const sc2 *>(ptr));
130  signed char rv = __nvvm_ldg_sc(reinterpret_cast<const signed char *>(
131  std::next(reinterpret_cast<const sc2 *>(ptr))));
133  ret.x() = rv_2[0];
134  ret.y() = rv_2[1];
135  ret.z() = rv;
136  return ret;
137  } else if constexpr (std::is_same_v<T, sycl::vec<signed char, 4>>) {
138  typedef signed char sc4 ATTRIBUTE_EXT_VEC_TYPE(4);
139  sc4 rv = __nvvm_ldg_sc4(reinterpret_cast<const sc4 *>(ptr));
141  ret.x() = rv[0];
142  ret.y() = rv[1];
143  ret.z() = rv[2];
144  ret.w() = rv[3];
145  return ret;
146  } else if constexpr (std::is_same_v<T, sycl::vec<short, 2>>) {
147  typedef short s2 ATTRIBUTE_EXT_VEC_TYPE(2);
148  s2 rv = __nvvm_ldg_s2(reinterpret_cast<const s2 *>(ptr));
150  ret.x() = rv[0];
151  ret.y() = rv[1];
152  return ret;
153  } else if constexpr (std::is_same_v<T, sycl::vec<short, 3>>) {
154  typedef short s2 ATTRIBUTE_EXT_VEC_TYPE(2);
155  s2 rv_2 = __nvvm_ldg_s2(reinterpret_cast<const s2 *>(ptr));
156  short rv = __nvvm_ldg_s(reinterpret_cast<const short *>(
157  std::next(reinterpret_cast<const s2 *>(ptr))));
159  ret.x() = rv_2[0];
160  ret.y() = rv_2[1];
161  ret.z() = rv;
162  return ret;
163  } else if constexpr (std::is_same_v<T, sycl::vec<short, 4>>) {
164  typedef short s4 ATTRIBUTE_EXT_VEC_TYPE(4);
165  s4 rv = __nvvm_ldg_s4(reinterpret_cast<const s4 *>(ptr));
167  ret.x() = rv[0];
168  ret.y() = rv[1];
169  ret.z() = rv[2];
170  ret.w() = rv[3];
171  return ret;
172  } else if constexpr (std::is_same_v<T, sycl::vec<int, 2>>) {
173  typedef int i2 ATTRIBUTE_EXT_VEC_TYPE(2);
174  i2 rv = __nvvm_ldg_i2(reinterpret_cast<const i2 *>(ptr));
175  sycl::vec<int, 2> ret;
176  ret.x() = rv[0];
177  ret.y() = rv[1];
178  return ret;
179  } else if constexpr (std::is_same_v<T, sycl::vec<int, 3>>) {
180  typedef int i2 ATTRIBUTE_EXT_VEC_TYPE(2);
181  i2 rv_2 = __nvvm_ldg_i2(reinterpret_cast<const i2 *>(ptr));
182  int rv = __nvvm_ldg_i(reinterpret_cast<const int *>(
183  std::next(reinterpret_cast<const i2 *>(ptr))));
184  sycl::vec<int, 3> ret;
185  ret.x() = rv_2[0];
186  ret.y() = rv_2[1];
187  ret.z() = rv;
188  return ret;
189  } else if constexpr (std::is_same_v<T, sycl::vec<int, 4>>) {
190  typedef int i4 ATTRIBUTE_EXT_VEC_TYPE(4);
191  i4 rv = __nvvm_ldg_i4(reinterpret_cast<const i4 *>(ptr));
192  sycl::vec<int, 4> ret;
193  ret.x() = rv[0];
194  ret.y() = rv[1];
195  ret.z() = rv[2];
196  ret.w() = rv[3];
197  return ret;
198  } else if constexpr (std::is_same_v<T, sycl::vec<long, 2>>) {
199  typedef long l2 ATTRIBUTE_EXT_VEC_TYPE(2);
200  l2 rv = __nvvm_ldg_l2(reinterpret_cast<const l2 *>(ptr));
201  sycl::vec<long, 2> ret;
202  ret.x() = rv[0];
203  ret.y() = rv[1];
204  return ret;
205  } else if constexpr (std::is_same_v<T, sycl::vec<long, 3>>) {
206  typedef long l2 ATTRIBUTE_EXT_VEC_TYPE(2);
207  l2 rv_2 = __nvvm_ldg_l2(reinterpret_cast<const l2 *>(ptr));
208  long rv = __nvvm_ldg_l(reinterpret_cast<const long *>(
209  std::next(reinterpret_cast<const l2 *>(ptr))));
210  sycl::vec<long, 3> ret;
211  ret.x() = rv_2[0];
212  ret.y() = rv_2[1];
213  ret.z() = rv;
214  return ret;
215  } else if constexpr (std::is_same_v<T, sycl::vec<long, 4>>) {
216  typedef long l2 ATTRIBUTE_EXT_VEC_TYPE(2);
217  l2 rv1 = __nvvm_ldg_l2(reinterpret_cast<const l2 *>(ptr));
218  l2 rv2 = __nvvm_ldg_l2(std::next(reinterpret_cast<const l2 *>(ptr)));
219  sycl::vec<long, 4> ret;
220  ret.x() = rv1[0];
221  ret.y() = rv1[1];
222  ret.z() = rv2[0];
223  ret.w() = rv2[1];
224  return ret;
225  } else if constexpr (std::is_same_v<T, sycl::vec<long long, 2>>) {
226  typedef long long ll2 ATTRIBUTE_EXT_VEC_TYPE(2);
227  ll2 rv = __nvvm_ldg_ll2(reinterpret_cast<const ll2 *>(ptr));
229  ret.x() = rv[0];
230  ret.y() = rv[1];
231  return ret;
232  } else if constexpr (std::is_same_v<T, sycl::vec<long long, 3>>) {
233  typedef long long ll2 ATTRIBUTE_EXT_VEC_TYPE(2);
234  ll2 rv_2 = __nvvm_ldg_ll2(reinterpret_cast<const ll2 *>(ptr));
235  long long rv = __nvvm_ldg_ll(reinterpret_cast<const long long *>(
236  std::next(reinterpret_cast<const ll2 *>(ptr))));
238  ret.x() = rv_2[0];
239  ret.y() = rv_2[1];
240  ret.z() = rv;
241  return ret;
242  } else if constexpr (std::is_same_v<T, sycl::vec<long long, 4>>) {
243  typedef long long ll2 ATTRIBUTE_EXT_VEC_TYPE(2);
244  ll2 rv1 = __nvvm_ldg_ll2(reinterpret_cast<const ll2 *>(ptr));
245  ll2 rv2 = __nvvm_ldg_ll2(std::next(reinterpret_cast<const ll2 *>(ptr)));
247  ret.x() = rv1[0];
248  ret.y() = rv1[1];
249  ret.z() = rv2[0];
250  ret.w() = rv2[1];
251  return ret;
252  } else if constexpr (std::is_same_v<T, sycl::vec<unsigned char, 2>>) {
253  typedef unsigned char uc2 ATTRIBUTE_EXT_VEC_TYPE(2);
254  uc2 rv = __nvvm_ldg_uc2(reinterpret_cast<const uc2 *>(ptr));
256  ret.x() = rv[0];
257  ret.y() = rv[1];
258  return ret;
259  } else if constexpr (std::is_same_v<T, sycl::vec<unsigned char, 3>>) {
260  typedef unsigned char uc2 ATTRIBUTE_EXT_VEC_TYPE(2);
261  uc2 rv_2 = __nvvm_ldg_uc2(reinterpret_cast<const uc2 *>(ptr));
262  unsigned char rv = __nvvm_ldg_uc(reinterpret_cast<const unsigned char *>(
263  std::next(reinterpret_cast<const uc2 *>(ptr))));
265  ret.x() = rv_2[0];
266  ret.y() = rv_2[1];
267  ret.z() = rv;
268  return ret;
269  } else if constexpr (std::is_same_v<T, sycl::vec<unsigned char, 4>>) {
270  typedef unsigned char uc4 ATTRIBUTE_EXT_VEC_TYPE(4);
271  uc4 rv = __nvvm_ldg_uc4(reinterpret_cast<const uc4 *>(ptr));
273  ret.x() = rv[0];
274  ret.y() = rv[1];
275  ret.z() = rv[2];
276  ret.w() = rv[3];
277  return ret;
278  } else if constexpr (std::is_same_v<T, sycl::vec<unsigned short, 2>>) {
279  typedef unsigned short us2 ATTRIBUTE_EXT_VEC_TYPE(2);
280  us2 rv = __nvvm_ldg_us2(reinterpret_cast<const us2 *>(ptr));
282  ret.x() = rv[0];
283  ret.y() = rv[1];
284  return ret;
285  } else if constexpr (std::is_same_v<T, sycl::vec<unsigned short, 3>>) {
286  typedef unsigned short us2 ATTRIBUTE_EXT_VEC_TYPE(2);
287  us2 rv_2 = __nvvm_ldg_us2(reinterpret_cast<const us2 *>(ptr));
288  unsigned short rv = __nvvm_ldg_us(reinterpret_cast<const unsigned short *>(
289  std::next(reinterpret_cast<const us2 *>(ptr))));
291  ret.x() = rv_2[0];
292  ret.y() = rv_2[1];
293  ret.z() = rv;
294  return ret;
295  } else if constexpr (std::is_same_v<T, sycl::vec<unsigned short, 4>>) {
296  typedef unsigned short us4 ATTRIBUTE_EXT_VEC_TYPE(4);
297  us4 rv = __nvvm_ldg_us4(reinterpret_cast<const us4 *>(ptr));
299  ret.x() = rv[0];
300  ret.y() = rv[1];
301  ret.z() = rv[2];
302  ret.w() = rv[3];
303  return ret;
304  } else if constexpr (std::is_same_v<T, sycl::vec<unsigned int, 2>>) {
305  typedef unsigned int ui2 ATTRIBUTE_EXT_VEC_TYPE(2);
306  ui2 rv = __nvvm_ldg_ui2(reinterpret_cast<const ui2 *>(ptr));
308  ret.x() = rv[0];
309  ret.y() = rv[1];
310  return ret;
311  } else if constexpr (std::is_same_v<T, sycl::vec<unsigned int, 3>>) {
312  typedef unsigned int ui2 ATTRIBUTE_EXT_VEC_TYPE(2);
313  ui2 rv_2 = __nvvm_ldg_ui2(reinterpret_cast<const ui2 *>(ptr));
314  unsigned int rv = __nvvm_ldg_ui(reinterpret_cast<const unsigned int *>(
315  std::next(reinterpret_cast<const ui2 *>(ptr))));
317  ret.x() = rv_2[0];
318  ret.y() = rv_2[1];
319  ret.z() = rv;
320  return ret;
321  } else if constexpr (std::is_same_v<T, sycl::vec<unsigned int, 4>>) {
322  typedef unsigned int ui4 ATTRIBUTE_EXT_VEC_TYPE(4);
323  ui4 rv = __nvvm_ldg_ui4(reinterpret_cast<const ui4 *>(ptr));
325  ret.x() = rv[0];
326  ret.y() = rv[1];
327  ret.z() = rv[2];
328  ret.w() = rv[3];
329  return ret;
330  } else if constexpr (std::is_same_v<T, sycl::vec<unsigned long, 2>>) {
331  typedef unsigned long ul2 ATTRIBUTE_EXT_VEC_TYPE(2);
332  ul2 rv = __nvvm_ldg_ul2(reinterpret_cast<const ul2 *>(ptr));
334  ret.x() = rv[0];
335  ret.y() = rv[1];
336  return ret;
337  } else if constexpr (std::is_same_v<T, sycl::vec<unsigned long, 3>>) {
338  typedef unsigned long ul2 ATTRIBUTE_EXT_VEC_TYPE(2);
339  ul2 rv_2 = __nvvm_ldg_ul2(reinterpret_cast<const ul2 *>(ptr));
340  unsigned long rv = __nvvm_ldg_ul(reinterpret_cast<const unsigned long *>(
341  std::next(reinterpret_cast<const ul2 *>(ptr))));
343  ret.x() = rv_2[0];
344  ret.y() = rv_2[1];
345  ret.z() = rv;
346  return ret;
347  } else if constexpr (std::is_same_v<T, sycl::vec<unsigned long, 4>>) {
348  typedef unsigned long ul2 ATTRIBUTE_EXT_VEC_TYPE(2);
349  ul2 rv1 = __nvvm_ldg_ul2(reinterpret_cast<const ul2 *>(ptr));
350  ul2 rv2 = __nvvm_ldg_ul2(std::next(reinterpret_cast<const ul2 *>(ptr)));
352  ret.x() = rv1[0];
353  ret.y() = rv1[1];
354  ret.z() = rv2[0];
355  ret.w() = rv2[1];
356  return ret;
357  } else if constexpr (std::is_same_v<T, sycl::vec<unsigned long long, 2>>) {
358  typedef unsigned long long ull2 ATTRIBUTE_EXT_VEC_TYPE(2);
359  ull2 rv = __nvvm_ldg_ull2(reinterpret_cast<const ull2 *>(ptr));
361  ret.x() = rv[0];
362  ret.y() = rv[1];
363  return ret;
364  } else if constexpr (std::is_same_v<T, sycl::vec<unsigned long long, 3>>) {
365  typedef unsigned long long ull2 ATTRIBUTE_EXT_VEC_TYPE(2);
366  ull2 rv_2 = __nvvm_ldg_ull2(reinterpret_cast<const ull2 *>(ptr));
367  unsigned long long rv =
368  __nvvm_ldg_ull(reinterpret_cast<const unsigned long long *>(
369  std::next(reinterpret_cast<const ull2 *>(ptr))));
371  ret.x() = rv_2[0];
372  ret.y() = rv_2[1];
373  ret.z() = rv;
374  return ret;
375  } else if constexpr (std::is_same_v<T, sycl::vec<unsigned long long, 4>>) {
376  typedef unsigned long long ull2 ATTRIBUTE_EXT_VEC_TYPE(2);
377  ull2 rv1 = __nvvm_ldg_ull2(reinterpret_cast<const ull2 *>(ptr));
378  ull2 rv2 = __nvvm_ldg_ull2(std::next(reinterpret_cast<const ull2 *>(ptr)));
380  ret.x() = rv1[0];
381  ret.y() = rv1[1];
382  ret.z() = rv2[0];
383  ret.w() = rv2[1];
384  return ret;
385  } else if constexpr (std::is_same_v<T, sycl::vec<half, 2>>) {
386  typedef __fp16 h2 ATTRIBUTE_EXT_VEC_TYPE(2);
387  auto rv = __nvvm_ldg_h2(reinterpret_cast<const h2 *>(ptr));
388  sycl::vec<half, 2> ret;
389  ret.x() = rv[0];
390  ret.y() = rv[1];
391  return ret;
392  } else if constexpr (std::is_same_v<T, sycl::vec<half, 3>>) {
393  typedef __fp16 h2 ATTRIBUTE_EXT_VEC_TYPE(2);
394  h2 rv_2 = __nvvm_ldg_h2(reinterpret_cast<const h2 *>(ptr));
395  auto rv = __nvvm_ldg_h(reinterpret_cast<const __fp16 *>(
396  std::next(reinterpret_cast<const h2 *>(ptr))));
397  sycl::vec<half, 3> ret;
398  ret.x() = rv_2[0];
399  ret.y() = rv_2[1];
400  ret.z() = rv;
401  return ret;
402  } else if constexpr (std::is_same_v<T, sycl::vec<half, 4>>) {
403  typedef __fp16 h2 ATTRIBUTE_EXT_VEC_TYPE(2);
404  auto rv1 = __nvvm_ldg_h2(reinterpret_cast<const h2 *>(ptr));
405  auto rv2 = __nvvm_ldg_h2(std::next(reinterpret_cast<const h2 *>(ptr)));
406  sycl::vec<half, 4> ret;
407  ret.x() = rv1[0];
408  ret.y() = rv1[1];
409  ret.z() = rv2[0];
410  ret.w() = rv2[1];
411  return ret;
412  } else if constexpr (std::is_same_v<T, sycl::vec<float, 2>>) {
413  typedef float f2 ATTRIBUTE_EXT_VEC_TYPE(2);
414  f2 rv = __nvvm_ldg_f2(reinterpret_cast<const f2 *>(ptr));
416  ret.x() = rv[0];
417  ret.y() = rv[1];
418  return ret;
419  } else if constexpr (std::is_same_v<T, sycl::vec<float, 3>>) {
420  typedef float f2 ATTRIBUTE_EXT_VEC_TYPE(2);
421  f2 rv_2 = __nvvm_ldg_f2(reinterpret_cast<const f2 *>(ptr));
422  float rv = __nvvm_ldg_f(reinterpret_cast<const float *>(
423  std::next(reinterpret_cast<const f2 *>(ptr))));
425  ret.x() = rv_2[0];
426  ret.y() = rv_2[1];
427  ret.z() = rv;
428  return ret;
429  } else if constexpr (std::is_same_v<T, sycl::vec<float, 4>>) {
430  typedef float f4 ATTRIBUTE_EXT_VEC_TYPE(4);
431  f4 rv = __nvvm_ldg_f4(reinterpret_cast<const f4 *>(ptr));
433  ret.x() = rv[0];
434  ret.y() = rv[1];
435  ret.z() = rv[2];
436  ret.w() = rv[3];
437  return ret;
438  } else if constexpr (std::is_same_v<T, sycl::vec<double, 2>>) {
439  typedef double d2 ATTRIBUTE_EXT_VEC_TYPE(2);
440  d2 rv = __nvvm_ldg_d2(reinterpret_cast<const d2 *>(ptr));
442  ret.x() = rv[0];
443  ret.y() = rv[1];
444  return ret;
445  } else if constexpr (std::is_same_v<T, sycl::vec<double, 3>>) {
446  typedef double d2 ATTRIBUTE_EXT_VEC_TYPE(2);
447  d2 rv_2 = __nvvm_ldg_d2(reinterpret_cast<const d2 *>(ptr));
448  double rv = __nvvm_ldg_d(reinterpret_cast<const double *>(
449  std::next(reinterpret_cast<const d2 *>(ptr))));
451  ret.x() = rv_2[0];
452  ret.y() = rv_2[1];
453  ret.z() = rv;
454  return ret;
455  } else if constexpr (std::is_same_v<T, sycl::vec<double, 4>>) {
456  typedef double d2 ATTRIBUTE_EXT_VEC_TYPE(2);
457  d2 rv1 = __nvvm_ldg_d2(reinterpret_cast<const d2 *>(ptr));
458  d2 rv2 = __nvvm_ldg_d2(std::next(reinterpret_cast<const d2 *>(ptr)));
460  ret.x() = rv1[0];
461  ret.y() = rv1[1];
462  ret.z() = rv2[0];
463  ret.w() = rv2[1];
464  return ret;
465  }
466 #else
467  return *ptr;
468 #endif
469 #else
470  throw runtime_error("ldg is not supported on host.", PI_ERROR_INVALID_DEVICE);
471 #endif
472 }
473 
474 #undef ATTRIBUTE_EXT_VEC_TYPE
475 
476 } // namespace cuda
477 } // namespace experimental
478 } // namespace oneapi
479 } // namespace ext
480 } // namespace _V1
481 } // namespace sycl
Provides a cross-patform vector class template that works efficiently on SYCL devices as well as in h...
Definition: types.hpp:285
#define __SYCL_ALWAYS_INLINE
#define ATTRIBUTE_EXT_VEC_TYPE(N)
Definition: builtins.hpp:18
tl_append< scalar_unsigned_integer_list > scalar_unsigned_basic_list
tl_append< scalar_floating_list, scalar_signed_integer_list > scalar_signed_basic_list
boost::mp11::mp_append< L... > tl_append
Definition: type_list.hpp:37
boost::mp11::mp_set_contains< TypeList, std::remove_cv_t< T > > is_contained
Definition: type_list.hpp:32
boost::mp11::mp_list< T... > type_list
Definition: type_list.hpp:22
sycl::detail::tl_append< ldg_vector_types, sycl::detail::gtl::scalar_signed_basic_list, sycl::detail::gtl::scalar_unsigned_basic_list > ldg_types
Definition: builtins.hpp:51
sycl::detail::type_list< sycl::vec< char, 2 >, sycl::vec< char, 3 >, sycl::vec< char, 4 >, sycl::vec< signed char, 2 >, sycl::vec< signed char, 3 >, sycl::vec< signed char, 4 >, sycl::vec< short, 2 >, sycl::vec< short, 3 >, sycl::vec< short, 4 >, sycl::vec< int, 2 >, sycl::vec< int, 3 >, sycl::vec< int, 4 >, sycl::vec< long, 2 >, sycl::vec< long, 3 >, sycl::vec< long, 4 >, sycl::vec< long long, 2 >, sycl::vec< long long, 3 >, sycl::vec< long long, 4 >, sycl::vec< unsigned char, 2 >, sycl::vec< unsigned char, 3 >, sycl::vec< unsigned char, 4 >, sycl::vec< unsigned short, 2 >, sycl::vec< unsigned short, 3 >, sycl::vec< unsigned short, 4 >, sycl::vec< unsigned int, 2 >, sycl::vec< unsigned int, 3 >, sycl::vec< unsigned int, 4 >, sycl::vec< unsigned long, 2 >, sycl::vec< unsigned long, 3 >, sycl::vec< unsigned long, 4 >, sycl::vec< unsigned long long, 2 >, sycl::vec< unsigned long long, 3 >, sycl::vec< unsigned long long, 4 >, sycl::vec< half, 2 >, sycl::vec< half, 3 >, sycl::vec< half, 4 >, sycl::vec< float, 2 >, sycl::vec< float, 3 >, sycl::vec< float, 4 >, sycl::vec< double, 2 >, sycl::vec< double, 3 >, sycl::vec< double, 4 > > ldg_vector_types
Definition: builtins.hpp:46
__SYCL_ALWAYS_INLINE std::enable_if_t< sycl::detail::is_contained< T, sycl::ext::oneapi::experimental::cuda::detail::ldg_types >::value, T > ldg(const T *ptr)
Definition: builtins.hpp:59
Definition: access.hpp:18