1313#include < cstdint>
1414#include < type_traits>
1515
16+ // Convergent attribute
17+ #ifdef __SYCL_DEVICE_ONLY__
18+ #define __SYCL_CONVERGENT__ __attribute__ ((convergent))
19+ #else
20+ #define __SYCL_CONVERGENT__
21+ #endif
22+
1623#ifdef __SYCL_DEVICE_ONLY__
1724
1825template <typename RetT, typename ImageT>
@@ -45,11 +52,10 @@ extern SYCL_EXTERNAL TempRetT __spirv_ImageSampleExplicitLod(SampledType,
4552//
4653
4754template <typename dataT>
48- __ocl_event_t __spirv_GroupAsyncCopy (__spv::Scope Execution,
49- __attribute__ ((opencl_local)) dataT *Dest,
50- __attribute__((opencl_global)) dataT *Src,
51- size_t NumElements, size_t Stride,
52- __ocl_event_t E) noexcept {
55+ __SYCL_CONVERGENT__ __ocl_event_t __spirv_GroupAsyncCopy (
56+ __spv::Scope Execution, __attribute__((opencl_local)) dataT *Dest,
57+ __attribute__((opencl_global)) dataT *Src, size_t NumElements,
58+ size_t Stride, __ocl_event_t E) noexcept {
5359 for (int i = 0 ; i < NumElements; i++) {
5460 Dest[i] = Src[i * Stride];
5561 }
@@ -58,11 +64,10 @@ __ocl_event_t __spirv_GroupAsyncCopy(__spv::Scope Execution,
5864}
5965
6066template <typename dataT>
61- __ocl_event_t __spirv_GroupAsyncCopy (__spv::Scope Execution,
62- __attribute__ ((opencl_global)) dataT *Dest,
63- __attribute__((opencl_local)) dataT *Src,
64- size_t NumElements, size_t Stride,
65- __ocl_event_t E) noexcept {
67+ __SYCL_CONVERGENT__ __ocl_event_t __spirv_GroupAsyncCopy (
68+ __spv::Scope Execution, __attribute__((opencl_global)) dataT *Dest,
69+ __attribute__((opencl_local)) dataT *Src, size_t NumElements, size_t Stride,
70+ __ocl_event_t E) noexcept {
6671 for (int i = 0 ; i < NumElements; i++) {
6772 Dest[i * Stride] = Src[i];
6873 }
@@ -71,13 +76,13 @@ __ocl_event_t __spirv_GroupAsyncCopy(__spv::Scope Execution,
7176}
7277#else
7378template <typename dataT>
74- extern SYCL_EXTERNAL __ocl_event_t __spirv_GroupAsyncCopy (
79+ __SYCL_CONVERGENT__ extern SYCL_EXTERNAL __ocl_event_t __spirv_GroupAsyncCopy (
7580 __spv::Scope Execution, __attribute__((opencl_local)) dataT *Dest,
7681 __attribute__((opencl_global)) dataT *Src, size_t NumElements,
7782 size_t Stride, __ocl_event_t E) noexcept ;
7883
7984template <typename dataT>
80- extern SYCL_EXTERNAL __ocl_event_t __spirv_GroupAsyncCopy (
85+ __SYCL_CONVERGENT__ extern SYCL_EXTERNAL __ocl_event_t __spirv_GroupAsyncCopy (
8186 __spv::Scope Execution, __attribute__((opencl_global)) dataT *Dest,
8287 __attribute__((opencl_local)) dataT *Src, size_t NumElements, size_t Stride,
8388 __ocl_event_t E) noexcept ;
@@ -182,95 +187,86 @@ __SPIRV_ATOMICS(__SPIRV_ATOMIC_UNSIGNED, unsigned long long)
182187__SPIRV_ATOMICS(__SPIRV_ATOMIC_MINMAX, Min)
183188__SPIRV_ATOMICS(__SPIRV_ATOMIC_MINMAX, Max)
184189
185- extern SYCL_EXTERNAL bool __spirv_GroupAll(__spv::Scope Execution,
186- bool Predicate) noexcept ;
190+ __SYCL_CONVERGENT__ extern SYCL_EXTERNAL bool
191+ __spirv_GroupAll(__spv::Scope Execution, bool Predicate) noexcept ;
187192
188- extern SYCL_EXTERNAL bool __spirv_GroupAny (__spv::Scope Execution,
189- bool Predicate) noexcept ;
193+ __SYCL_CONVERGENT__ extern SYCL_EXTERNAL bool
194+ __spirv_GroupAny (__spv::Scope Execution, bool Predicate) noexcept ;
190195
191196template <typename dataT>
192- extern SYCL_EXTERNAL dataT __spirv_GroupBroadcast (__spv::Scope Execution,
193- dataT Value,
194- size_t LocalId) noexcept ;
197+ __SYCL_CONVERGENT__ extern SYCL_EXTERNAL dataT __spirv_GroupBroadcast (
198+ __spv::Scope Execution, dataT Value, size_t LocalId) noexcept ;
195199
196200template <typename dataT>
197- extern SYCL_EXTERNAL dataT
201+ __SYCL_CONVERGENT__ extern SYCL_EXTERNAL dataT
198202__spirv_GroupBroadcast (__spv::Scope Execution, dataT Value,
199203 __ocl_vec_t <size_t , 2 > LocalId) noexcept ;
200204template <typename dataT>
201- extern SYCL_EXTERNAL dataT
205+ __SYCL_CONVERGENT__ extern SYCL_EXTERNAL dataT
202206__spirv_GroupBroadcast (__spv::Scope Execution, dataT Value,
203207 __ocl_vec_t <size_t , 3 > LocalId) noexcept ;
204208
205209template <typename dataT>
206- extern SYCL_EXTERNAL dataT __spirv_GroupIAdd (__spv::Scope Execution,
207- __spv::GroupOperation Op,
208- dataT Value) noexcept ;
210+ __SYCL_CONVERGENT__ extern SYCL_EXTERNAL dataT __spirv_GroupIAdd (
211+ __spv::Scope Execution, __spv::GroupOperation Op, dataT Value) noexcept ;
209212template <typename dataT>
210- extern SYCL_EXTERNAL dataT __spirv_GroupFAdd (__spv::Scope Execution,
211- __spv::GroupOperation Op,
212- dataT Value) noexcept ;
213+ __SYCL_CONVERGENT__ extern SYCL_EXTERNAL dataT __spirv_GroupFAdd (
214+ __spv::Scope Execution, __spv::GroupOperation Op, dataT Value) noexcept ;
213215template <typename dataT>
214- extern SYCL_EXTERNAL dataT __spirv_GroupUMin (__spv::Scope Execution,
215- __spv::GroupOperation Op,
216- dataT Value) noexcept ;
216+ __SYCL_CONVERGENT__ extern SYCL_EXTERNAL dataT __spirv_GroupUMin (
217+ __spv::Scope Execution, __spv::GroupOperation Op, dataT Value) noexcept ;
217218template <typename dataT>
218- extern SYCL_EXTERNAL dataT __spirv_GroupSMin (__spv::Scope Execution,
219- __spv::GroupOperation Op,
220- dataT Value) noexcept ;
219+ __SYCL_CONVERGENT__ extern SYCL_EXTERNAL dataT __spirv_GroupSMin (
220+ __spv::Scope Execution, __spv::GroupOperation Op, dataT Value) noexcept ;
221221template <typename dataT>
222- extern SYCL_EXTERNAL dataT __spirv_GroupFMin (__spv::Scope Execution,
223- __spv::GroupOperation Op,
224- dataT Value) noexcept ;
222+ __SYCL_CONVERGENT__ extern SYCL_EXTERNAL dataT __spirv_GroupFMin (
223+ __spv::Scope Execution, __spv::GroupOperation Op, dataT Value) noexcept ;
225224template <typename dataT>
226- extern SYCL_EXTERNAL dataT __spirv_GroupUMax (__spv::Scope Execution,
227- __spv::GroupOperation Op,
228- dataT Value) noexcept ;
225+ __SYCL_CONVERGENT__ extern SYCL_EXTERNAL dataT __spirv_GroupUMax (
226+ __spv::Scope Execution, __spv::GroupOperation Op, dataT Value) noexcept ;
229227template <typename dataT>
230- extern SYCL_EXTERNAL dataT __spirv_GroupSMax (__spv::Scope Execution,
231- __spv::GroupOperation Op,
232- dataT Value) noexcept ;
228+ __SYCL_CONVERGENT__ extern SYCL_EXTERNAL dataT __spirv_GroupSMax (
229+ __spv::Scope Execution, __spv::GroupOperation Op, dataT Value) noexcept ;
233230template <typename dataT>
234- extern SYCL_EXTERNAL dataT __spirv_GroupFMax (__spv::Scope Execution,
235- __spv::GroupOperation Op,
236- dataT Value) noexcept ;
231+ __SYCL_CONVERGENT__ extern SYCL_EXTERNAL dataT __spirv_GroupFMax (
232+ __spv::Scope Execution, __spv::GroupOperation Op, dataT Value) noexcept ;
237233template <typename dataT>
238- extern SYCL_EXTERNAL dataT
234+ __SYCL_CONVERGENT__ extern SYCL_EXTERNAL dataT
239235__spirv_SubgroupShuffleINTEL (dataT Data, uint32_t InvocationId) noexcept ;
240236template <typename dataT>
241- extern SYCL_EXTERNAL dataT __spirv_SubgroupShuffleDownINTEL (
237+ __SYCL_CONVERGENT__ extern SYCL_EXTERNAL dataT __spirv_SubgroupShuffleDownINTEL (
242238 dataT Current, dataT Next, uint32_t Delta) noexcept ;
243239template <typename dataT>
244- extern SYCL_EXTERNAL dataT __spirv_SubgroupShuffleUpINTEL (
240+ __SYCL_CONVERGENT__ extern SYCL_EXTERNAL dataT __spirv_SubgroupShuffleUpINTEL (
245241 dataT Previous, dataT Current, uint32_t Delta) noexcept ;
246242template <typename dataT>
247- extern SYCL_EXTERNAL dataT
243+ __SYCL_CONVERGENT__ extern SYCL_EXTERNAL dataT
248244__spirv_SubgroupShuffleXorINTEL (dataT Data, uint32_t Value) noexcept ;
249245
250246template <typename dataT>
251- extern SYCL_EXTERNAL dataT __spirv_SubgroupBlockReadINTEL (
247+ __SYCL_CONVERGENT__ extern SYCL_EXTERNAL dataT __spirv_SubgroupBlockReadINTEL (
252248 const __attribute__ ((opencl_global)) uint8_t *Ptr) noexcept ;
253249
254250template <typename dataT>
255- extern SYCL_EXTERNAL void
251+ __SYCL_CONVERGENT__ extern SYCL_EXTERNAL void
256252__spirv_SubgroupBlockWriteINTEL (__attribute__((opencl_global)) uint8_t *Ptr,
257253 dataT Data) noexcept ;
258254
259255template <typename dataT>
260- extern SYCL_EXTERNAL dataT __spirv_SubgroupBlockReadINTEL (
256+ __SYCL_CONVERGENT__ extern SYCL_EXTERNAL dataT __spirv_SubgroupBlockReadINTEL (
261257 const __attribute__ ((opencl_global)) uint16_t *Ptr) noexcept ;
262258
263259template <typename dataT>
264- extern SYCL_EXTERNAL void
260+ __SYCL_CONVERGENT__ extern SYCL_EXTERNAL void
265261__spirv_SubgroupBlockWriteINTEL (__attribute__((opencl_global)) uint16_t *Ptr,
266262 dataT Data) noexcept ;
267263
268264template <typename dataT>
269- extern SYCL_EXTERNAL dataT __spirv_SubgroupBlockReadINTEL (
265+ __SYCL_CONVERGENT__ extern SYCL_EXTERNAL dataT __spirv_SubgroupBlockReadINTEL (
270266 const __attribute__ ((opencl_global)) uint32_t *Ptr) noexcept ;
271267
272268template <typename dataT>
273- extern SYCL_EXTERNAL void
269+ __SYCL_CONVERGENT__ extern SYCL_EXTERNAL void
274270__spirv_SubgroupBlockWriteINTEL (__attribute__((opencl_global)) uint32_t *Ptr,
275271 dataT Data) noexcept ;
276272
@@ -538,7 +534,7 @@ __SPIRV_DECLARE_OCL3(select) // select
538534#else // if !__SYCL_DEVICE_ONLY__
539535
540536template <typename dataT>
541- extern __ocl_event_t
537+ __SYCL_CONVERGENT__ extern __ocl_event_t
542538OpGroupAsyncCopyGlobalToLocal (__spv::Scope Execution, dataT *Dest, dataT *Src,
543539 size_t NumElements, size_t Stride,
544540 __ocl_event_t E) noexcept {
@@ -550,7 +546,7 @@ OpGroupAsyncCopyGlobalToLocal(__spv::Scope Execution, dataT *Dest, dataT *Src,
550546}
551547
552548template <typename dataT>
553- extern __ocl_event_t
549+ __SYCL_CONVERGENT__ extern __ocl_event_t
554550OpGroupAsyncCopyLocalToGlobal (__spv::Scope Execution, dataT *Dest, dataT *Src,
555551 size_t NumElements, size_t Stride,
556552 __ocl_event_t E) noexcept {
@@ -565,13 +561,13 @@ extern void __spirv_ocl_prefetch(const char *Ptr, size_t NumBytes) noexcept;
565561
566562#endif // !__SYCL_DEVICE_ONLY__
567563
568- extern SYCL_EXTERNAL void __spirv_ControlBarrier (__spv::Scope Execution,
569- __spv::Scope Memory,
570- uint32_t Semantics) noexcept ;
564+ __SYCL_CONVERGENT__ extern SYCL_EXTERNAL void
565+ __spirv_ControlBarrier (__spv::Scope Execution, __spv::Scope Memory,
566+ uint32_t Semantics) noexcept ;
571567
572- extern SYCL_EXTERNAL void __spirv_MemoryBarrier (__spv::Scope Memory,
573- uint32_t Semantics) noexcept ;
568+ __SYCL_CONVERGENT__ extern SYCL_EXTERNAL void
569+ __spirv_MemoryBarrier (__spv::Scope Memory, uint32_t Semantics) noexcept ;
574570
575- extern SYCL_EXTERNAL void
571+ __SYCL_CONVERGENT__ extern SYCL_EXTERNAL void
576572__spirv_GroupWaitEvents (__spv::Scope Execution, uint32_t NumEvents,
577573 __ocl_event_t *WaitEvents) noexcept ;
0 commit comments