Skip to content

Commit 7cca561

Browse files
authored
[SPIRV] Add convergent attribute to SPIR-V built-ins (#1373)
Optimizations can't preserve SPIR-V built-in semantics w/o additional attribute. Signed-off-by: Alexey Bader <[email protected]>
1 parent 21e4644 commit 7cca561

File tree

1 file changed

+59
-63
lines changed

1 file changed

+59
-63
lines changed

sycl/include/CL/__spirv/spirv_ops.hpp

+59-63
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,13 @@
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

1825
template <typename RetT, typename ImageT>
@@ -45,11 +52,10 @@ extern SYCL_EXTERNAL TempRetT __spirv_ImageSampleExplicitLod(SampledType,
4552
//
4653

4754
template <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

6066
template <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
7378
template <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

7984
template <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

191196
template <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

196200
template <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;
200204
template <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

205209
template <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;
209212
template <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;
213215
template <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;
217218
template <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;
221221
template <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;
225224
template <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;
229227
template <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;
233230
template <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;
237233
template <typename dataT>
238-
extern SYCL_EXTERNAL dataT
234+
__SYCL_CONVERGENT__ extern SYCL_EXTERNAL dataT
239235
__spirv_SubgroupShuffleINTEL(dataT Data, uint32_t InvocationId) noexcept;
240236
template <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;
243239
template <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;
246242
template <typename dataT>
247-
extern SYCL_EXTERNAL dataT
243+
__SYCL_CONVERGENT__ extern SYCL_EXTERNAL dataT
248244
__spirv_SubgroupShuffleXorINTEL(dataT Data, uint32_t Value) noexcept;
249245

250246
template <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

254250
template <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

259255
template <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

263259
template <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

268264
template <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

272268
template <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

540536
template <typename dataT>
541-
extern __ocl_event_t
537+
__SYCL_CONVERGENT__ extern __ocl_event_t
542538
OpGroupAsyncCopyGlobalToLocal(__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

552548
template <typename dataT>
553-
extern __ocl_event_t
549+
__SYCL_CONVERGENT__ extern __ocl_event_t
554550
OpGroupAsyncCopyLocalToGlobal(__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

Comments
 (0)