16 #ifdef __SYCL_DEVICE_ONLY__
23 #include <type_traits>
28 inline namespace _V1 {
31 template <
int Dims,
bool WithOffset>
class item;
32 template <
int Dims>
class group;
33 template <
int Dims>
class range;
34 template <
int Dims>
class id;
35 template <
int Dims>
class nd_item;
36 template <
int Dims>
class h_item;
37 template <
typename Type, std::
size_t NumElements>
class marray;
48 __SYCL_EXPORT
void waitEvents(std::vector<sycl::event> DepEvents);
53 template <
typename T> T *
declptr() {
return static_cast<T *
>(
nullptr); }
58 static thread_local
auto stored = *
obj;
80 return group<Dims>(Global, Local, Global / Local, Index);
83 template <
class ResType,
typename BitsType>
85 return ResType(Bits, BitsNum);
88 template <
int Dims,
bool WithOffset>
89 static std::enable_if_t<WithOffset, item<Dims, WithOffset>>
95 template <
int Dims,
bool WithOffset>
96 static std::enable_if_t<!WithOffset, item<Dims, WithOffset>>
121 template <
int Dims,
bool WithOffset>
124 Item.MImpl.MIndex = NextIndex;
127 #ifdef __SYCL_DEVICE_ONLY__
130 using is_valid_dimensions = std::integral_constant<bool, (N > 0) && (N < 4)>;
133 static_assert(is_valid_dimensions<Dims>::value,
"invalid dimensions");
134 return __spirv::initGlobalInvocationId<Dims, id<Dims>>();
138 static_assert(is_valid_dimensions<Dims>::value,
"invalid dimensions");
139 range<Dims> GlobalSize{__spirv::initGlobalSize<Dims, range<Dims>>()};
140 range<Dims> LocalSize{__spirv::initWorkgroupSize<Dims, range<Dims>>()};
141 range<Dims> GroupRange{__spirv::initNumWorkgroups<Dims, range<Dims>>()};
142 id<Dims> GroupId{__spirv::initWorkgroupId<Dims, id<Dims>>()};
143 return createGroup<Dims>(GlobalSize, LocalSize, GroupRange, GroupId);
146 template <
int Dims,
bool WithOffset>
147 static std::enable_if_t<WithOffset, const item<Dims, WithOffset>> getItem() {
148 static_assert(is_valid_dimensions<Dims>::value,
"invalid dimensions");
149 id<Dims> GlobalId{__spirv::initGlobalInvocationId<Dims, id<Dims>>()};
150 range<Dims> GlobalSize{__spirv::initGlobalSize<Dims, range<Dims>>()};
151 id<Dims> GlobalOffset{__spirv::initGlobalOffset<Dims, id<Dims>>()};
152 return createItem<Dims, true>(GlobalSize, GlobalId, GlobalOffset);
155 template <
int Dims,
bool WithOffset>
156 static std::enable_if_t<!WithOffset, const item<Dims, WithOffset>> getItem() {
157 static_assert(is_valid_dimensions<Dims>::value,
"invalid dimensions");
158 id<Dims> GlobalId{__spirv::initGlobalInvocationId<Dims, id<Dims>>()};
159 range<Dims> GlobalSize{__spirv::initGlobalSize<Dims, range<Dims>>()};
160 return createItem<Dims, false>(GlobalSize, GlobalId);
163 template <
int Dims>
static const nd_item<Dims> getElement(nd_item<Dims> *) {
164 static_assert(is_valid_dimensions<Dims>::value,
"invalid dimensions");
165 range<Dims> GlobalSize{__spirv::initGlobalSize<Dims, range<Dims>>()};
166 range<Dims> LocalSize{__spirv::initWorkgroupSize<Dims, range<Dims>>()};
167 range<Dims> GroupRange{__spirv::initNumWorkgroups<Dims, range<Dims>>()};
168 id<Dims> GroupId{__spirv::initWorkgroupId<Dims, id<Dims>>()};
169 id<Dims> GlobalId{__spirv::initGlobalInvocationId<Dims, id<Dims>>()};
170 id<Dims> LocalId{__spirv::initLocalInvocationId<Dims, id<Dims>>()};
171 id<Dims> GlobalOffset{__spirv::initGlobalOffset<Dims, id<Dims>>()};
173 createGroup<Dims>(GlobalSize, LocalSize, GroupRange, GroupId);
174 item<Dims, true> GlobalItem =
175 createItem<Dims, true>(GlobalSize, GlobalId, GlobalOffset);
176 item<Dims, false> LocalItem = createItem<Dims, false>(LocalSize, LocalId);
177 return createNDItem<Dims>(GlobalItem, LocalItem, Group);
180 template <
int Dims,
bool WithOffset>
181 static auto getElement(item<Dims, WithOffset> *)
182 -> decltype(getItem<Dims, WithOffset>()) {
183 return getItem<Dims, WithOffset>();
187 static auto getNDItem() -> decltype(getElement(
declptr<nd_item<Dims>>())) {
188 return getElement(
declptr<nd_item<Dims>>());
199 inline constexpr uint32_t
229 ?
static_cast<uint32_t
>(
233 ?
static_cast<uint32_t
>(
238 static_cast<uint32_t
>(
245 template <
size_t... Inds,
class F>
246 void loop_impl(std::integer_sequence<size_t, Inds...>, F &&f) {
247 (f(std::integral_constant<size_t, Inds>{}), ...);
250 template <
size_t count,
class F>
void loop(F &&f) {
251 loop_impl(std::make_index_sequence<count>{}, std::forward<F>(f));
255 std::tuple<const RTDeviceBinaryImage *, ur_program_handle_t>
257 CGExecKernel *CGKernel =
nullptr);
static std::enable_if_t< WithOffset, item< Dims, WithOffset > > createItem(const range< Dims > &Extent, const id< Dims > &Index, const id< Dims > &Offset)
static group< Dims > createGroup(const range< Dims > &Global, const range< Dims > &Local, const range< Dims > &Group, const id< Dims > &Index)
static ResType createSubGroupMask(BitsType Bits, size_t BitsNum)
static h_item< Dims > createHItem(const item< Dims, false > &Global, const item< Dims, false > &Local, const range< Dims > &Flex)
static group< Dims > createGroup(const range< Dims > &Global, const range< Dims > &Local, const id< Dims > &Index)
static void updateItemIndex(sycl::item< Dims, WithOffset > &Item, const id< Dims > &NextIndex)
static std::enable_if_t<!WithOffset, item< Dims, WithOffset > > createItem(const range< Dims > &Extent, const id< Dims > &Index)
static h_item< Dims > createHItem(const item< Dims, false > &Global, const item< Dims, false > &Local)
static nd_item< Dims > createNDItem(const item< Dims, true > &Global, const item< Dims, false > &Local, const group< Dims > &Group)
Identifies an instance of a group::parallel_for_work_item function object executing at each point in ...
A unique identifier of an item in an index space.
Identifies an instance of the function object executing at each point in a range.
Provides a cross-platform math array class template that works on SYCL devices as well as in host C++...
Identifies an instance of the function object executing at each point in an nd_range.
Defines the iteration domain of either a single work-group in a parallel dispatch,...
constexpr bool is_power_of_two(int x)
T get_or_store(const T *obj)
void markBufferAsInternal(const std::shared_ptr< buffer_impl > &BufImpl)
constexpr __spv::MemorySemanticsMask::Flag getSPIRVMemorySemanticsMask(memory_order)
void loop_impl(std::integer_sequence< size_t, Inds... >, F &&f)
void waitEvents(std::vector< sycl::event > DepEvents)
std::shared_ptr< sycl::detail::queue_impl > QueueImplPtr
std::tuple< const RTDeviceBinaryImage *, ur_program_handle_t > retrieveKernelBinary(const QueueImplPtr &, const char *KernelName, CGExecKernel *CGKernel=nullptr)