14 #ifdef __SYCL_DEVICE_ONLY__
16 #define __SPIRV_VAR_QUALIFIERS extern "C" const
18 #if defined(__NVPTX__) || defined(__AMDGCN__)
54 #else // defined(__NVPTX__) || defined(__AMDGCN__)
56 typedef size_t size_t_vec
__attribute__((ext_vector_type(3)));
57 __SPIRV_VAR_QUALIFIERS size_t_vec __spirv_BuiltInGlobalSize;
58 __SPIRV_VAR_QUALIFIERS size_t_vec __spirv_BuiltInGlobalInvocationId;
59 __SPIRV_VAR_QUALIFIERS size_t_vec __spirv_BuiltInWorkgroupSize;
60 __SPIRV_VAR_QUALIFIERS size_t_vec __spirv_BuiltInNumWorkgroups;
61 __SPIRV_VAR_QUALIFIERS size_t_vec __spirv_BuiltInLocalInvocationId;
62 __SPIRV_VAR_QUALIFIERS size_t_vec __spirv_BuiltInWorkgroupId;
63 __SPIRV_VAR_QUALIFIERS size_t_vec __spirv_BuiltInGlobalOffset;
65 __SPIRV_VAR_QUALIFIERS uint32_t __spirv_BuiltInSubgroupSize;
66 __SPIRV_VAR_QUALIFIERS uint32_t __spirv_BuiltInSubgroupMaxSize;
67 __SPIRV_VAR_QUALIFIERS uint32_t __spirv_BuiltInNumSubgroups;
68 __SPIRV_VAR_QUALIFIERS uint32_t __spirv_BuiltInSubgroupId;
69 __SPIRV_VAR_QUALIFIERS uint32_t __spirv_BuiltInSubgroupLocalInvocationId;
72 return __spirv_BuiltInGlobalInvocationId.x;
75 return __spirv_BuiltInGlobalInvocationId.y;
78 return __spirv_BuiltInGlobalInvocationId.z;
82 return __spirv_BuiltInGlobalSize.x;
85 return __spirv_BuiltInGlobalSize.y;
88 return __spirv_BuiltInGlobalSize.z;
92 return __spirv_BuiltInGlobalOffset.x;
95 return __spirv_BuiltInGlobalOffset.y;
98 return __spirv_BuiltInGlobalOffset.z;
102 return __spirv_BuiltInNumWorkgroups.x;
105 return __spirv_BuiltInNumWorkgroups.y;
108 return __spirv_BuiltInNumWorkgroups.z;
112 return __spirv_BuiltInWorkgroupSize.x;
115 return __spirv_BuiltInWorkgroupSize.y;
118 return __spirv_BuiltInWorkgroupSize.z;
122 return __spirv_BuiltInWorkgroupId.x;
125 return __spirv_BuiltInWorkgroupId.y;
128 return __spirv_BuiltInWorkgroupId.z;
132 return __spirv_BuiltInLocalInvocationId.x;
135 return __spirv_BuiltInLocalInvocationId.y;
138 return __spirv_BuiltInLocalInvocationId.z;
142 return __spirv_BuiltInSubgroupSize;
145 return __spirv_BuiltInSubgroupMaxSize;
148 return __spirv_BuiltInNumSubgroups;
151 return __spirv_BuiltInSubgroupId;
153 SYCL_EXTERNAL inline uint32_t __spirv_SubgroupLocalInvocationId() {
154 return __spirv_BuiltInSubgroupLocalInvocationId;
157 #endif // defined(__NVPTX__) || defined(__AMDGCN__)
159 #undef __SPIRV_VAR_QUALIFIERS
165 #define __SPIRV_DEFINE_INIT_AND_GET_HELPERS(POSTFIX) \
166 template <int ID> static size_t get##POSTFIX(); \
167 template <> size_t get##POSTFIX<0>() { return __spirv_##POSTFIX##_x(); } \
168 template <> size_t get##POSTFIX<1>() { return __spirv_##POSTFIX##_y(); } \
169 template <> size_t get##POSTFIX<2>() { return __spirv_##POSTFIX##_z(); } \
171 template <int Dim, class DstT> struct InitSizesST##POSTFIX; \
173 template <class DstT> struct InitSizesST##POSTFIX<1, DstT> { \
174 static DstT initSize() { return {get##POSTFIX<0>()}; } \
177 template <class DstT> struct InitSizesST##POSTFIX<2, DstT> { \
178 static DstT initSize() { return {get##POSTFIX<1>(), get##POSTFIX<0>()}; } \
181 template <class DstT> struct InitSizesST##POSTFIX<3, DstT> { \
182 static DstT initSize() { \
183 return {get##POSTFIX<2>(), get##POSTFIX<1>(), get##POSTFIX<0>()}; \
187 template <int Dims, class DstT> static DstT init##POSTFIX() { \
188 return InitSizesST##POSTFIX<Dims, DstT>::initSize(); \
191 __SPIRV_DEFINE_INIT_AND_GET_HELPERS(GlobalSize);
192 __SPIRV_DEFINE_INIT_AND_GET_HELPERS(GlobalInvocationId)
193 __SPIRV_DEFINE_INIT_AND_GET_HELPERS(WorkgroupSize)
194 __SPIRV_DEFINE_INIT_AND_GET_HELPERS(NumWorkgroups)
195 __SPIRV_DEFINE_INIT_AND_GET_HELPERS(LocalInvocationId)
196 __SPIRV_DEFINE_INIT_AND_GET_HELPERS(WorkgroupId)
197 __SPIRV_DEFINE_INIT_AND_GET_HELPERS(GlobalOffset)
199 #undef __SPIRV_DEFINE_INIT_AND_GET_HELPERS
203 #endif // __SYCL_DEVICE_ONLY__