DPC++ Runtime
Runtime libraries for oneAPI DPC++
nd_item.hpp
Go to the documentation of this file.
1 //==--------- nd_item.hpp --- SYCL iteration nd_item -----------------------==//
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 #include <CL/__spirv/spirv_ops.hpp> // for __spirv_ControlBarrier
12 #include <CL/__spirv/spirv_types.hpp> // for Scope
13 #include <CL/__spirv/spirv_vars.hpp> // for initLocalInvocationId
14 #include <sycl/access/access.hpp> // for mode, fence_space
15 #include <sycl/detail/defines.hpp> // for __SYCL_ASSUME_INT
16 #include <sycl/detail/defines_elementary.hpp> // for __SYCL2020_DEPRECATED, __SY...
17 #include <sycl/detail/generic_type_traits.hpp> // for ConvertToOpenCLType_t
18 #include <sycl/detail/helpers.hpp> // for getSPIRVMemorySemanticsMask
19 #include <sycl/detail/type_traits.hpp> // for is_bool, change_base_...
20 #include <sycl/device_event.hpp> // for device_event
21 #include <sycl/exception.hpp> // for make_error_code, errc, exce...
22 #include <sycl/group.hpp> // for group
23 #include <sycl/id.hpp> // for id
24 #include <sycl/item.hpp> // for item
25 #include <sycl/nd_range.hpp> // for nd_range
26 #include <sycl/pointers.hpp> // for decorated_global_ptr, decor...
27 #include <sycl/range.hpp> // for range
28 #include <sycl/sub_group.hpp> // for sub_group
29 
30 #include <cstddef> // for size_t
31 #include <stdint.h> // for uint32_t
32 #include <type_traits> // for enable_if_t, remove_const_t
33 
34 namespace sycl {
35 inline namespace _V1 {
36 namespace detail {
37 class Builder;
38 }
39 
40 namespace ext::oneapi::experimental {
41 template <int Dimensions> class root_group;
42 }
43 
48 template <int Dimensions = 1> class nd_item {
49 public:
50  static constexpr int dimensions = Dimensions;
51 
53 #ifdef __SYCL_DEVICE_ONLY__
54  return __spirv::initGlobalInvocationId<Dimensions, id<Dimensions>>();
55 #else
56  throw sycl::exception(sycl::make_error_code(sycl::errc::invalid),
57  "nd_item methods can't be invoked on the host");
58  return {};
59 #endif
60  }
61 
62  size_t __SYCL_ALWAYS_INLINE get_global_id(int Dimension) const {
63  size_t Id = get_global_id()[Dimension];
65  return Id;
66  }
67 
69  size_t LinId = 0;
70  id<Dimensions> Index = get_global_id();
72  id<Dimensions> Offset = get_offset();
73  if (1 == Dimensions) {
74  LinId = Index[0] - Offset[0];
75  } else if (2 == Dimensions) {
76  LinId = (Index[0] - Offset[0]) * Extent[1] + Index[1] - Offset[1];
77  } else {
78  LinId = (Index[0] - Offset[0]) * Extent[1] * Extent[2] +
79  (Index[1] - Offset[1]) * Extent[2] + Index[2] - Offset[2];
80  }
81  __SYCL_ASSUME_INT(LinId);
82  return LinId;
83  }
84 
86 #ifdef __SYCL_DEVICE_ONLY__
87  return __spirv::initLocalInvocationId<Dimensions, id<Dimensions>>();
88 #else
89  throw sycl::exception(sycl::make_error_code(sycl::errc::invalid),
90  "nd_item methods can't be invoked on the host");
91  return {};
92 #endif
93  }
94 
95  size_t __SYCL_ALWAYS_INLINE get_local_id(int Dimension) const {
96  size_t Id = get_local_id()[Dimension];
98  return Id;
99  }
100 
101  size_t get_local_linear_id() const {
102  size_t LinId = 0;
103  id<Dimensions> Index = get_local_id();
105  if (1 == Dimensions) {
106  LinId = Index[0];
107  } else if (2 == Dimensions) {
108  LinId = Index[0] * Extent[1] + Index[1];
109  } else {
110  LinId =
111  Index[0] * Extent[1] * Extent[2] + Index[1] * Extent[2] + Index[2];
112  }
113  __SYCL_ASSUME_INT(LinId);
114  return LinId;
115  }
116 
118  // TODO: ideally Group object should be stateless and have a contructor with
119  // no arguments.
122  }
123 
124  sub_group get_sub_group() const { return sub_group(); }
125 
126  size_t __SYCL_ALWAYS_INLINE get_group(int Dimension) const {
127  size_t Id = get_group_id()[Dimension];
128  __SYCL_ASSUME_INT(Id);
129  return Id;
130  }
131 
133  size_t LinId = 0;
134  id<Dimensions> Index = get_group_id();
136  if (1 == Dimensions) {
137  LinId = Index[0];
138  } else if (2 == Dimensions) {
139  LinId = Index[0] * Extent[1] + Index[1];
140  } else {
141  LinId =
142  Index[0] * Extent[1] * Extent[2] + Index[1] * Extent[2] + Index[2];
143  }
144  __SYCL_ASSUME_INT(LinId);
145  return LinId;
146  }
147 
149 #ifdef __SYCL_DEVICE_ONLY__
150  return __spirv::initNumWorkgroups<Dimensions, range<Dimensions>>();
151 #else
152  throw sycl::exception(sycl::make_error_code(sycl::errc::invalid),
153  "nd_item methods can't be invoked on the host");
154  return {};
155 #endif
156  }
157 
158  size_t __SYCL_ALWAYS_INLINE get_group_range(int Dimension) const {
159  size_t Range = get_group_range()[Dimension];
160  __SYCL_ASSUME_INT(Range);
161  return Range;
162  }
163 
165 #ifdef __SYCL_DEVICE_ONLY__
166  return __spirv::initGlobalSize<Dimensions, range<Dimensions>>();
167 #else
168  throw sycl::exception(sycl::make_error_code(sycl::errc::invalid),
169  "nd_item methods can't be invoked on the host");
170  return {};
171 #endif
172  }
173 
174  size_t get_global_range(int Dimension) const {
175  size_t Val = get_global_range()[Dimension];
176  __SYCL_ASSUME_INT(Val);
177  return Val;
178  }
179 
181 #ifdef __SYCL_DEVICE_ONLY__
182  return __spirv::initWorkgroupSize<Dimensions, range<Dimensions>>();
183 #else
184  throw sycl::exception(sycl::make_error_code(sycl::errc::invalid),
185  "nd_item methods can't be invoked on the host");
186  return {};
187 #endif
188  }
189 
190  size_t get_local_range(int Dimension) const {
191  size_t Id = get_local_range()[Dimension];
192  __SYCL_ASSUME_INT(Id);
193  return Id;
194  }
195 
196  __SYCL2020_DEPRECATED("offsets are deprecated in SYCL 2020")
198 #ifdef __SYCL_DEVICE_ONLY__
199  return __spirv::initGlobalOffset<Dimensions, id<Dimensions>>();
200 #else
201  throw sycl::exception(sycl::make_error_code(sycl::errc::invalid),
202  "nd_item methods can't be invoked on the host");
203  return {};
204 #endif
205  }
206 
209  get_offset());
210  }
211 
212  void barrier(access::fence_space accessSpace =
214  uint32_t flags = _V1::detail::getSPIRVMemorySemanticsMask(accessSpace);
216  flags);
217  }
218 
221  template <access::mode accessMode = access::mode::read_write>
222  __SYCL2020_DEPRECATED("use sycl::atomic_fence() free function instead")
223  void mem_fence(
224  typename std::enable_if_t<accessMode == access::mode::read ||
225  accessMode == access::mode::write ||
226  accessMode == access::mode::read_write,
227  access::fence_space>
228  accessSpace = access::fence_space::global_and_local) const {
229  uint32_t flags = detail::getSPIRVMemorySemanticsMask(accessSpace);
230  // TODO: currently, there is no good way in SPIR-V to set the memory
231  // barrier only for load operations or only for store operations.
232  // The full read-and-write barrier is used and the template parameter
233  // 'accessMode' is ignored for now. Either SPIR-V or SYCL spec may be
234  // changed to address this discrepancy between SPIR-V and SYCL,
235  // or if we decide that 'accessMode' is the important feature then
236  // we can fix this later, for example, by using OpenCL 1.2 functions
237  // read_mem_fence() and write_mem_fence().
239  }
240 
246  template <typename dataT>
247  __SYCL2020_DEPRECATED("Use decorated multi_ptr arguments instead")
248  std::enable_if_t<!detail::is_bool<dataT>::value,
250  global_ptr<dataT> src,
251  size_t numElements,
252  size_t srcStride) const {
253  using DestT = detail::ConvertToOpenCLType_t<decltype(dest)>;
254  using SrcT = detail::ConvertToOpenCLType_t<decltype(src)>;
255 
257  __spv::Scope::Workgroup, DestT(dest.get()), SrcT(src.get()),
258  numElements, srcStride, 0);
259  return device_event(E);
260  }
261 
267  template <typename dataT>
268  __SYCL2020_DEPRECATED("Use decorated multi_ptr arguments instead")
269  std::enable_if_t<!detail::is_bool<dataT>::value,
271  local_ptr<dataT> src,
272  size_t numElements,
273  size_t destStride)
274  const {
275  using DestT = detail::ConvertToOpenCLType_t<decltype(dest)>;
276  using SrcT = detail::ConvertToOpenCLType_t<decltype(src)>;
277 
279  __spv::Scope::Workgroup, DestT(dest.get()), SrcT(src.get()),
280  numElements, destStride, 0);
281  return device_event(E);
282  }
283 
290  template <typename DestDataT, typename SrcDataT>
291  std::enable_if_t<!detail::is_bool<DestDataT>::value &&
292  std::is_same_v<std::remove_const_t<SrcDataT>, DestDataT>,
293  device_event>
295  decorated_global_ptr<SrcDataT> src, size_t numElements,
296  size_t srcStride) const {
297  using DestT = detail::ConvertToOpenCLType_t<decltype(dest)>;
298  using SrcT = detail::ConvertToOpenCLType_t<decltype(src)>;
299 
301  __spv::Scope::Workgroup, DestT(dest.get()), SrcT(src.get()),
302  numElements, srcStride, 0);
303  return device_event(E);
304  }
305 
312  template <typename DestDataT, typename SrcDataT>
313  std::enable_if_t<!detail::is_bool<DestDataT>::value &&
314  std::is_same_v<std::remove_const_t<SrcDataT>, DestDataT>,
315  device_event>
317  decorated_local_ptr<SrcDataT> src, size_t numElements,
318  size_t destStride) const {
319  using DestT = detail::ConvertToOpenCLType_t<decltype(dest)>;
320  using SrcT = detail::ConvertToOpenCLType_t<decltype(src)>;
321 
323  __spv::Scope::Workgroup, DestT(dest.get()), SrcT(src.get()),
324  numElements, destStride, 0);
325  return device_event(E);
326  }
327 
333  template <typename T, access::address_space DestS, access::address_space SrcS>
334  __SYCL2020_DEPRECATED("Use decorated multi_ptr arguments instead")
335  std::enable_if_t<
336  detail::is_scalar_bool<T>::value,
338  access::decorated::legacy>
339  Dest,
340  multi_ptr<T, SrcS,
341  access::decorated::legacy>
342  Src,
343  size_t NumElements,
344  size_t Stride) const {
345  static_assert(sizeof(bool) == sizeof(uint8_t),
346  "Async copy to/from bool memory is not supported.");
348  reinterpret_cast<uint8_t *>(Dest.get()));
350  reinterpret_cast<uint8_t *>(Src.get()));
351  return async_work_group_copy(DestP, SrcP, NumElements, Stride);
352  }
353 
359  template <typename T, access::address_space DestS, access::address_space SrcS>
360  __SYCL2020_DEPRECATED("Use decorated multi_ptr arguments instead")
361  std::enable_if_t<
362  detail::is_vector_bool<T>::value,
364  access::decorated::legacy>
365  Dest,
366  multi_ptr<T, SrcS,
367  access::decorated::legacy>
368  Src,
369  size_t NumElements,
370  size_t Stride) const {
371  static_assert(sizeof(bool) == sizeof(uint8_t),
372  "Async copy to/from bool memory is not supported.");
374  auto DestP = address_space_cast<DestS, access::decorated::legacy>(
375  reinterpret_cast<VecT *>(Dest.get()));
376  auto SrcP = address_space_cast<SrcS, access::decorated::legacy>(
377  reinterpret_cast<VecT *>(Src.get()));
378  return async_work_group_copy(DestP, SrcP, NumElements, Stride);
379  }
380 
386  template <typename DestT, access::address_space DestS, typename SrcT,
388  std::enable_if_t<detail::is_scalar_bool<DestT>::value &&
389  std::is_same_v<std::remove_const_t<SrcT>, DestT>,
390  device_event>
393  size_t NumElements, size_t Stride) const {
394  static_assert(sizeof(bool) == sizeof(uint8_t),
395  "Async copy to/from bool memory is not supported.");
396  using QualSrcT =
397  std::conditional_t<std::is_const_v<SrcT>, const uint8_t, uint8_t>;
399  detail::cast_AS<typename multi_ptr<uint8_t, DestS,
401  Dest.get_decorated()));
403  detail::cast_AS<typename multi_ptr<QualSrcT, SrcS,
405  Src.get_decorated()));
406  return async_work_group_copy(DestP, SrcP, NumElements, Stride);
407  }
408 
414  template <typename DestT, access::address_space DestS, typename SrcT,
416  std::enable_if_t<detail::is_vector_bool<DestT>::value &&
417  std::is_same_v<std::remove_const_t<SrcT>, DestT>,
418  device_event>
421  size_t NumElements, size_t Stride) const {
422  static_assert(sizeof(bool) == sizeof(uint8_t),
423  "Async copy to/from bool memory is not supported.");
425  using QualSrcVecT =
426  std::conditional_t<std::is_const_v<SrcT>, std::add_const_t<VecT>, VecT>;
430  Dest.get_decorated()));
432  detail::cast_AS<typename multi_ptr<QualSrcVecT, SrcS,
434  Src.get_decorated()));
435  return async_work_group_copy(DestP, SrcP, NumElements, Stride);
436  }
437 
443  template <typename dataT>
444  __SYCL2020_DEPRECATED("Use decorated multi_ptr arguments instead")
446  async_work_group_copy(local_ptr<dataT> dest, global_ptr<dataT> src,
447  size_t numElements) const {
448  return async_work_group_copy(dest, src, numElements, 1);
449  }
450 
456  template <typename dataT>
457  __SYCL2020_DEPRECATED("Use decorated multi_ptr arguments instead")
459  async_work_group_copy(global_ptr<dataT> dest, local_ptr<dataT> src,
460  size_t numElements) const {
461  return async_work_group_copy(dest, src, numElements, 1);
462  }
463 
470  template <typename DestDataT, typename SrcDataT>
471  typename std::enable_if_t<
472  std::is_same_v<DestDataT, std::remove_const_t<SrcDataT>>, device_event>
475  size_t numElements) const {
476  return async_work_group_copy(dest, src, numElements, 1);
477  }
478 
485  template <typename DestDataT, typename SrcDataT>
486  typename std::enable_if_t<
487  std::is_same_v<DestDataT, std::remove_const_t<SrcDataT>>, device_event>
490  size_t numElements) const {
491  return async_work_group_copy(dest, src, numElements, 1);
492  }
493 
494  template <typename... eventTN> void wait_for(eventTN... events) const {
495  waitForHelper(events...);
496  }
497 
501  }
502 
503  nd_item(const nd_item &rhs) = default;
504  nd_item(nd_item &&rhs) = default;
505 
506  nd_item &operator=(const nd_item &rhs) = default;
507  nd_item &operator=(nd_item &&rhs) = default;
508 
509  bool operator==(const nd_item &) const { return true; }
510  bool operator!=(const nd_item &rhs) const { return !((*this) == rhs); }
511 
512 protected:
513  friend class detail::Builder;
514  nd_item() {}
516  const group<Dimensions> &) {}
517 
518  void waitForHelper() const {}
519 
520  void waitForHelper(device_event Event) const { Event.wait(); }
521 
522  template <typename T, typename... Ts>
523  void waitForHelper(T E, Ts... Es) const {
524  waitForHelper(E);
525  waitForHelper(Es...);
526  }
527 
529 #ifdef __SYCL_DEVICE_ONLY__
530  return __spirv::initWorkgroupId<Dimensions, id<Dimensions>>();
531 #else
532  throw sycl::exception(sycl::make_error_code(sycl::errc::invalid),
533  "nd_item methods can't be invoked on the host");
534  return {};
535 #endif
536  }
537 };
538 } // namespace _V1
539 } // namespace sycl
static group< Dims > createGroup(const range< Dims > &Global, const range< Dims > &Local, const range< Dims > &Group, const id< Dims > &Index)
Definition: helpers.hpp:74
Encapsulates a single SYCL device event which is available only within SYCL kernel functions and can ...
A unique identifier of an item in an index space.
Definition: id.hpp:36
Identifies an instance of the function object executing at each point in a range.
Definition: item.hpp:37
Identifies an instance of the function object executing at each point in an nd_range.
Definition: nd_item.hpp:48
id< Dimensions > get_group_id() const
Definition: nd_item.hpp:528
std::enable_if_t<!detail::is_bool< DestDataT >::value &&std::is_same_v< std::remove_const_t< SrcDataT >, DestDataT >, device_event > async_work_group_copy(decorated_local_ptr< DestDataT > dest, decorated_global_ptr< SrcDataT > src, size_t numElements, size_t srcStride) const
Asynchronously copies a number of elements specified by numElements from the source pointed by src to...
Definition: nd_item.hpp:294
size_t get_local_linear_id() const
Definition: nd_item.hpp:101
size_t get_local_range(int Dimension) const
Definition: nd_item.hpp:190
void waitForHelper(T E, Ts... Es) const
Definition: nd_item.hpp:523
std::enable_if_t< detail::is_scalar_bool< DestT >::value &&std::is_same_v< std::remove_const_t< SrcT >, DestT >, device_event > async_work_group_copy(multi_ptr< DestT, DestS, access::decorated::yes > Dest, multi_ptr< SrcT, SrcS, access::decorated::yes > Src, size_t NumElements, size_t Stride) const
Specialization for scalar bool type.
Definition: nd_item.hpp:391
size_t __SYCL_ALWAYS_INLINE get_group_linear_id() const
Definition: nd_item.hpp:132
nd_item(const nd_item &rhs)=default
size_t get_global_range(int Dimension) const
Definition: nd_item.hpp:174
sycl::ext::oneapi::experimental::root_group< Dimensions > ext_oneapi_get_root_group() const
Definition: nd_item.hpp:499
id< Dimensions > get_local_id() const
Definition: nd_item.hpp:85
nd_item(const item< Dimensions, true > &, const item< Dimensions, false > &, const group< Dimensions > &)
Definition: nd_item.hpp:515
range< Dimensions > get_local_range() const
Definition: nd_item.hpp:180
id< Dimensions > get_global_id() const
Definition: nd_item.hpp:52
sub_group get_sub_group() const
Definition: nd_item.hpp:124
void wait_for(eventTN... events) const
Definition: nd_item.hpp:494
nd_item & operator=(const nd_item &rhs)=default
std::enable_if_t< detail::is_vector_bool< DestT >::value &&std::is_same_v< std::remove_const_t< SrcT >, DestT >, device_event > async_work_group_copy(multi_ptr< DestT, DestS, access::decorated::yes > Dest, multi_ptr< SrcT, SrcS, access::decorated::yes > Src, size_t NumElements, size_t Stride) const
Specialization for vector bool type.
Definition: nd_item.hpp:419
std::enable_if_t<!detail::is_bool< dataT >::value, device_event > async_work_group_copy(local_ptr< dataT > dest, global_ptr< dataT > src, size_t numElements, size_t srcStride) const
Asynchronously copies a number of elements specified by numElements from the source pointed by src to...
Definition: nd_item.hpp:249
std::enable_if_t< std::is_same_v< DestDataT, std::remove_const_t< SrcDataT > >, device_event > async_work_group_copy(decorated_global_ptr< DestDataT > dest, decorated_local_ptr< SrcDataT > src, size_t numElements) const
Asynchronously copies a number of elements specified by numElements from the source pointed by src to...
Definition: nd_item.hpp:488
std::enable_if_t<!detail::is_bool< DestDataT >::value &&std::is_same_v< std::remove_const_t< SrcDataT >, DestDataT >, device_event > async_work_group_copy(decorated_global_ptr< DestDataT > dest, decorated_local_ptr< SrcDataT > src, size_t numElements, size_t destStride) const
Asynchronously copies a number of elements specified by numElements from the source pointed by src to...
Definition: nd_item.hpp:316
nd_range< Dimensions > get_nd_range() const
Definition: nd_item.hpp:207
size_t __SYCL_ALWAYS_INLINE get_global_id(int Dimension) const
Definition: nd_item.hpp:62
void waitForHelper() const
Definition: nd_item.hpp:518
bool operator==(const nd_item &) const
Definition: nd_item.hpp:509
size_t __SYCL_ALWAYS_INLINE get_global_linear_id() const
Definition: nd_item.hpp:68
bool operator!=(const nd_item &rhs) const
Definition: nd_item.hpp:510
nd_item(nd_item &&rhs)=default
void waitForHelper(device_event Event) const
Definition: nd_item.hpp:520
size_t __SYCL_ALWAYS_INLINE get_group_range(int Dimension) const
Definition: nd_item.hpp:158
static constexpr int dimensions
Definition: nd_item.hpp:50
void mem_fence(typename std::enable_if_t< accessMode==access::mode::read||accessMode==access::mode::write||accessMode==access::mode::read_write, access::fence_space > accessSpace=access::fence_space::global_and_local) const
Executes a work-group mem-fence with memory ordering on the local address space, global address space...
Definition: nd_item.hpp:223
id< Dimensions > get_offset() const
Definition: nd_item.hpp:197
group< Dimensions > get_group() const
Definition: nd_item.hpp:117
nd_item & operator=(nd_item &&rhs)=default
size_t __SYCL_ALWAYS_INLINE get_local_id(int Dimension) const
Definition: nd_item.hpp:95
range< Dimensions > get_global_range() const
Definition: nd_item.hpp:164
range< Dimensions > get_group_range() const
Definition: nd_item.hpp:148
size_t __SYCL_ALWAYS_INLINE get_group(int Dimension) const
Definition: nd_item.hpp:126
std::enable_if_t< std::is_same_v< DestDataT, std::remove_const_t< SrcDataT > >, device_event > async_work_group_copy(decorated_local_ptr< DestDataT > dest, decorated_global_ptr< SrcDataT > src, size_t numElements) const
Asynchronously copies a number of elements specified by numElements from the source pointed by src to...
Definition: nd_item.hpp:473
void barrier(access::fence_space accessSpace=access::fence_space::global_and_local) const
Definition: nd_item.hpp:212
Defines the iteration domain of both the work-groups and the overall dispatch.
Definition: nd_range.hpp:22
#define __SYCL_ASSUME_INT(x)
Definition: defines.hpp:17
#define __SYCL_ALWAYS_INLINE
typename change_base_type< T, B >::type change_base_type_t
ToT cast_AS(FromT from)
Definition: access.hpp:330
constexpr __spv::MemorySemanticsMask::Flag getSPIRVMemorySemanticsMask(memory_order)
Definition: helpers.hpp:198
decltype(convertToOpenCLType(std::declval< T >())) ConvertToOpenCLType_t
class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE(local_accessor) local_accessor class __SYCL_EBO __SYCL_SPECIAL_CLASS Dimensions
Definition: accessor.hpp:3233
signed char __SYCL2020_DEPRECATED
Definition: aliases.hpp:94
constexpr mode_tag_t< access_mode::read_write > read_write
Definition: access.hpp:85
std::conditional_t< is_decorated, decorated_type *, std::add_pointer_t< value_type > > pointer
Definition: multi_ptr.hpp:459
std::error_code make_error_code(sycl::errc E) noexcept
Constructs an error code using e and sycl_category()
Definition: exception.cpp:87
Definition: access.hpp:18
__SYCL_CONVERGENT__ __ocl_event_t __SYCL_OpGroupAsyncCopyGlobalToLocal(__spv::Scope::Flag, dataT *Dest, const dataT *Src, size_t NumElements, size_t Stride, __ocl_event_t) noexcept
Definition: spirv_ops.hpp:1296
__SYCL_CONVERGENT__ __DPCPP_SYCL_EXTERNAL void __spirv_ControlBarrier(__spv::Scope Execution, __spv::Scope Memory, uint32_t Semantics) noexcept
Definition: spirv_ops.cpp:26
__SYCL_CONVERGENT__ __DPCPP_SYCL_EXTERNAL void __spirv_MemoryBarrier(__spv::Scope Memory, uint32_t Semantics) noexcept
Definition: spirv_ops.cpp:36
__SYCL_CONVERGENT__ __ocl_event_t __SYCL_OpGroupAsyncCopyLocalToGlobal(__spv::Scope::Flag, dataT *Dest, const dataT *Src, size_t NumElements, size_t Stride, __ocl_event_t) noexcept
Definition: spirv_ops.hpp:1308
void * __ocl_event_t