22 #include <type_traits>
29 template <
int Dims,
bool WithOffset>
class item;
30 template <
int Dims>
class group;
31 template <
int Dims>
class range;
32 template <
int Dims>
class id;
35 template <
typename Type, std::
size_t NumElements>
class marray;
43 __SYCL_EXPORT std::vector<RT::PiEvent>
45 std::shared_ptr<sycl::detail::context_impl> Context);
47 __SYCL_EXPORT
void waitEvents(std::vector<sycl::event> DepEvents);
49 template <
typename T> T *
declptr() {
return static_cast<T *
>(
nullptr); }
54 static thread_local
auto stored = *
obj;
76 return group<Dims>(Global, Local, Global / Local, Index);
79 template <
class ResType,
typename BitsType>
81 return ResType(Bits, BitsNum);
84 template <
int Dims,
bool WithOffset>
91 template <
int Dims,
bool WithOffset>
117 template <
int Dims,
bool WithOffset>
120 Item.MImpl.MIndex = NextIndex;
123 #ifdef __SYCL_DEVICE_ONLY__
126 using is_valid_dimensions = std::integral_constant<bool, (N > 0) && (N < 4)>;
129 static_assert(is_valid_dimensions<Dims>::value,
"invalid dimensions");
130 return __spirv::initGlobalInvocationId<Dims, id<Dims>>();
134 static_assert(is_valid_dimensions<Dims>::value,
"invalid dimensions");
135 range<Dims> GlobalSize{__spirv::initGlobalSize<Dims, range<Dims>>()};
136 range<Dims> LocalSize{__spirv::initWorkgroupSize<Dims, range<Dims>>()};
137 range<Dims> GroupRange{__spirv::initNumWorkgroups<Dims, range<Dims>>()};
138 id<Dims> GroupId{__spirv::initWorkgroupId<Dims, id<Dims>>()};
139 return createGroup<Dims>(GlobalSize, LocalSize, GroupRange, GroupId);
142 template <
int Dims,
bool WithOffset>
143 static detail::enable_if_t<WithOffset, const item<Dims, WithOffset>>
145 static_assert(is_valid_dimensions<Dims>::value,
"invalid dimensions");
146 id<Dims> GlobalId{__spirv::initGlobalInvocationId<Dims, id<Dims>>()};
147 range<Dims> GlobalSize{__spirv::initGlobalSize<Dims, range<Dims>>()};
148 id<Dims> GlobalOffset{__spirv::initGlobalOffset<Dims, id<Dims>>()};
149 return createItem<Dims, true>(GlobalSize, GlobalId, GlobalOffset);
152 template <
int Dims,
bool WithOffset>
153 static detail::enable_if_t<!WithOffset, const item<Dims, WithOffset>>
155 static_assert(is_valid_dimensions<Dims>::value,
"invalid dimensions");
156 id<Dims> GlobalId{__spirv::initGlobalInvocationId<Dims, id<Dims>>()};
157 range<Dims> GlobalSize{__spirv::initGlobalSize<Dims, range<Dims>>()};
158 return createItem<Dims, false>(GlobalSize, GlobalId);
161 template <
int Dims>
static const nd_item<Dims> getElement(nd_item<Dims> *) {
162 static_assert(is_valid_dimensions<Dims>::value,
"invalid dimensions");
163 range<Dims> GlobalSize{__spirv::initGlobalSize<Dims, range<Dims>>()};
164 range<Dims> LocalSize{__spirv::initWorkgroupSize<Dims, range<Dims>>()};
165 range<Dims> GroupRange{__spirv::initNumWorkgroups<Dims, range<Dims>>()};
166 id<Dims> GroupId{__spirv::initWorkgroupId<Dims, id<Dims>>()};
167 id<Dims> GlobalId{__spirv::initGlobalInvocationId<Dims, id<Dims>>()};
168 id<Dims> LocalId{__spirv::initLocalInvocationId<Dims, id<Dims>>()};
169 id<Dims> GlobalOffset{__spirv::initGlobalOffset<Dims, id<Dims>>()};
171 createGroup<Dims>(GlobalSize, LocalSize, GroupRange, GroupId);
172 item<Dims, true> GlobalItem =
173 createItem<Dims, true>(GlobalSize, GlobalId, GlobalOffset);
174 item<Dims, false> LocalItem = createItem<Dims, false>(LocalSize, LocalId);
175 return createNDItem<Dims>(GlobalItem, LocalItem, Group);
178 template <
int Dims,
bool WithOffset>
179 static auto getElement(item<Dims, WithOffset> *)
180 -> decltype(getItem<Dims, WithOffset>()) {
181 return getItem<Dims, WithOffset>();
185 static auto getNDItem() -> decltype(getElement(
declptr<nd_item<Dims>>())) {
186 return getElement(
declptr<nd_item<Dims>>());
189 #endif // __SYCL_DEVICE_ONLY__
197 inline constexpr uint32_t
226 return (AccessSpace == access::fence_space::global_space)
227 ?
static_cast<uint32_t
>(
230 : (AccessSpace == access::fence_space::local_space)
231 ?
static_cast<uint32_t
>(
236 static_cast<uint32_t
>(
243 template <
size_t... Inds,
class F>
248 template <
size_t count,
class F>
void dim_loop(F &&f) {
249 dim_loop_impl(std::make_index_sequence<count>{}, std::forward<F>(f));