Skip to content

[SPIRV] Add convergent attribute to SPIR-V built-ins #1373

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Mar 24, 2020
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
122 changes: 59 additions & 63 deletions sycl/include/CL/__spirv/spirv_ops.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,13 @@
#include <cstdint>
#include <type_traits>

// Convergent attribute
#ifdef __SYCL_DEVICE_ONLY__
#define __SYCL_CONVERGENT__ __attribute__((convergent))
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wonder, why SYCL? AFAIK convergent is a non-sycl-specific clang attribute.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Clang attribute is not SYCL specific, but macro is.
Do you have better name in mind?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not sure. I'd probably just named it as CONVERGENT. I also don't see why this macro is SYCL specific. We, for example, have ALWAYS_INLINE macro which somehow is not SYCL specific. So, I'll leave final naming up to you.

#else
#define __SYCL_CONVERGENT__
#endif

#ifdef __SYCL_DEVICE_ONLY__

template <typename RetT, typename ImageT>
Expand Down Expand Up @@ -45,11 +52,10 @@ extern SYCL_EXTERNAL TempRetT __spirv_ImageSampleExplicitLod(SampledType,
//

template <typename dataT>
__ocl_event_t __spirv_GroupAsyncCopy(__spv::Scope Execution,
__attribute__((opencl_local)) dataT *Dest,
__attribute__((opencl_global)) dataT *Src,
size_t NumElements, size_t Stride,
__ocl_event_t E) noexcept {
__SYCL_CONVERGENT__ __ocl_event_t __spirv_GroupAsyncCopy(
__spv::Scope Execution, __attribute__((opencl_local)) dataT *Dest,
__attribute__((opencl_global)) dataT *Src, size_t NumElements,
size_t Stride, __ocl_event_t E) noexcept {
for (int i = 0; i < NumElements; i++) {
Dest[i] = Src[i * Stride];
}
Expand All @@ -58,11 +64,10 @@ __ocl_event_t __spirv_GroupAsyncCopy(__spv::Scope Execution,
}

template <typename dataT>
__ocl_event_t __spirv_GroupAsyncCopy(__spv::Scope Execution,
__attribute__((opencl_global)) dataT *Dest,
__attribute__((opencl_local)) dataT *Src,
size_t NumElements, size_t Stride,
__ocl_event_t E) noexcept {
__SYCL_CONVERGENT__ __ocl_event_t __spirv_GroupAsyncCopy(
__spv::Scope Execution, __attribute__((opencl_global)) dataT *Dest,
__attribute__((opencl_local)) dataT *Src, size_t NumElements, size_t Stride,
__ocl_event_t E) noexcept {
for (int i = 0; i < NumElements; i++) {
Dest[i * Stride] = Src[i];
}
Expand All @@ -71,13 +76,13 @@ __ocl_event_t __spirv_GroupAsyncCopy(__spv::Scope Execution,
}
#else
template <typename dataT>
extern SYCL_EXTERNAL __ocl_event_t __spirv_GroupAsyncCopy(
__SYCL_CONVERGENT__ extern SYCL_EXTERNAL __ocl_event_t __spirv_GroupAsyncCopy(
__spv::Scope Execution, __attribute__((opencl_local)) dataT *Dest,
__attribute__((opencl_global)) dataT *Src, size_t NumElements,
size_t Stride, __ocl_event_t E) noexcept;

template <typename dataT>
extern SYCL_EXTERNAL __ocl_event_t __spirv_GroupAsyncCopy(
__SYCL_CONVERGENT__ extern SYCL_EXTERNAL __ocl_event_t __spirv_GroupAsyncCopy(
__spv::Scope Execution, __attribute__((opencl_global)) dataT *Dest,
__attribute__((opencl_local)) dataT *Src, size_t NumElements, size_t Stride,
__ocl_event_t E) noexcept;
Expand Down Expand Up @@ -182,95 +187,86 @@ __SPIRV_ATOMICS(__SPIRV_ATOMIC_UNSIGNED, unsigned long long)
__SPIRV_ATOMICS(__SPIRV_ATOMIC_MINMAX, Min)
__SPIRV_ATOMICS(__SPIRV_ATOMIC_MINMAX, Max)

extern SYCL_EXTERNAL bool __spirv_GroupAll(__spv::Scope Execution,
bool Predicate) noexcept;
__SYCL_CONVERGENT__ extern SYCL_EXTERNAL bool
__spirv_GroupAll(__spv::Scope Execution, bool Predicate) noexcept;

extern SYCL_EXTERNAL bool __spirv_GroupAny(__spv::Scope Execution,
bool Predicate) noexcept;
__SYCL_CONVERGENT__ extern SYCL_EXTERNAL bool
__spirv_GroupAny(__spv::Scope Execution, bool Predicate) noexcept;

template <typename dataT>
extern SYCL_EXTERNAL dataT __spirv_GroupBroadcast(__spv::Scope Execution,
dataT Value,
size_t LocalId) noexcept;
__SYCL_CONVERGENT__ extern SYCL_EXTERNAL dataT __spirv_GroupBroadcast(
__spv::Scope Execution, dataT Value, size_t LocalId) noexcept;

template <typename dataT>
extern SYCL_EXTERNAL dataT
__SYCL_CONVERGENT__ extern SYCL_EXTERNAL dataT
__spirv_GroupBroadcast(__spv::Scope Execution, dataT Value,
__ocl_vec_t<size_t, 2> LocalId) noexcept;
template <typename dataT>
extern SYCL_EXTERNAL dataT
__SYCL_CONVERGENT__ extern SYCL_EXTERNAL dataT
__spirv_GroupBroadcast(__spv::Scope Execution, dataT Value,
__ocl_vec_t<size_t, 3> LocalId) noexcept;

template <typename dataT>
extern SYCL_EXTERNAL dataT __spirv_GroupIAdd(__spv::Scope Execution,
__spv::GroupOperation Op,
dataT Value) noexcept;
__SYCL_CONVERGENT__ extern SYCL_EXTERNAL dataT __spirv_GroupIAdd(
__spv::Scope Execution, __spv::GroupOperation Op, dataT Value) noexcept;
template <typename dataT>
extern SYCL_EXTERNAL dataT __spirv_GroupFAdd(__spv::Scope Execution,
__spv::GroupOperation Op,
dataT Value) noexcept;
__SYCL_CONVERGENT__ extern SYCL_EXTERNAL dataT __spirv_GroupFAdd(
__spv::Scope Execution, __spv::GroupOperation Op, dataT Value) noexcept;
template <typename dataT>
extern SYCL_EXTERNAL dataT __spirv_GroupUMin(__spv::Scope Execution,
__spv::GroupOperation Op,
dataT Value) noexcept;
__SYCL_CONVERGENT__ extern SYCL_EXTERNAL dataT __spirv_GroupUMin(
__spv::Scope Execution, __spv::GroupOperation Op, dataT Value) noexcept;
template <typename dataT>
extern SYCL_EXTERNAL dataT __spirv_GroupSMin(__spv::Scope Execution,
__spv::GroupOperation Op,
dataT Value) noexcept;
__SYCL_CONVERGENT__ extern SYCL_EXTERNAL dataT __spirv_GroupSMin(
__spv::Scope Execution, __spv::GroupOperation Op, dataT Value) noexcept;
template <typename dataT>
extern SYCL_EXTERNAL dataT __spirv_GroupFMin(__spv::Scope Execution,
__spv::GroupOperation Op,
dataT Value) noexcept;
__SYCL_CONVERGENT__ extern SYCL_EXTERNAL dataT __spirv_GroupFMin(
__spv::Scope Execution, __spv::GroupOperation Op, dataT Value) noexcept;
template <typename dataT>
extern SYCL_EXTERNAL dataT __spirv_GroupUMax(__spv::Scope Execution,
__spv::GroupOperation Op,
dataT Value) noexcept;
__SYCL_CONVERGENT__ extern SYCL_EXTERNAL dataT __spirv_GroupUMax(
__spv::Scope Execution, __spv::GroupOperation Op, dataT Value) noexcept;
template <typename dataT>
extern SYCL_EXTERNAL dataT __spirv_GroupSMax(__spv::Scope Execution,
__spv::GroupOperation Op,
dataT Value) noexcept;
__SYCL_CONVERGENT__ extern SYCL_EXTERNAL dataT __spirv_GroupSMax(
__spv::Scope Execution, __spv::GroupOperation Op, dataT Value) noexcept;
template <typename dataT>
extern SYCL_EXTERNAL dataT __spirv_GroupFMax(__spv::Scope Execution,
__spv::GroupOperation Op,
dataT Value) noexcept;
__SYCL_CONVERGENT__ extern SYCL_EXTERNAL dataT __spirv_GroupFMax(
__spv::Scope Execution, __spv::GroupOperation Op, dataT Value) noexcept;
template <typename dataT>
extern SYCL_EXTERNAL dataT
__SYCL_CONVERGENT__ extern SYCL_EXTERNAL dataT
__spirv_SubgroupShuffleINTEL(dataT Data, uint32_t InvocationId) noexcept;
template <typename dataT>
extern SYCL_EXTERNAL dataT __spirv_SubgroupShuffleDownINTEL(
__SYCL_CONVERGENT__ extern SYCL_EXTERNAL dataT __spirv_SubgroupShuffleDownINTEL(
dataT Current, dataT Next, uint32_t Delta) noexcept;
template <typename dataT>
extern SYCL_EXTERNAL dataT __spirv_SubgroupShuffleUpINTEL(
__SYCL_CONVERGENT__ extern SYCL_EXTERNAL dataT __spirv_SubgroupShuffleUpINTEL(
dataT Previous, dataT Current, uint32_t Delta) noexcept;
template <typename dataT>
extern SYCL_EXTERNAL dataT
__SYCL_CONVERGENT__ extern SYCL_EXTERNAL dataT
__spirv_SubgroupShuffleXorINTEL(dataT Data, uint32_t Value) noexcept;

template <typename dataT>
extern SYCL_EXTERNAL dataT __spirv_SubgroupBlockReadINTEL(
__SYCL_CONVERGENT__ extern SYCL_EXTERNAL dataT __spirv_SubgroupBlockReadINTEL(
const __attribute__((opencl_global)) uint8_t *Ptr) noexcept;

template <typename dataT>
extern SYCL_EXTERNAL void
__SYCL_CONVERGENT__ extern SYCL_EXTERNAL void
__spirv_SubgroupBlockWriteINTEL(__attribute__((opencl_global)) uint8_t *Ptr,
dataT Data) noexcept;

template <typename dataT>
extern SYCL_EXTERNAL dataT __spirv_SubgroupBlockReadINTEL(
__SYCL_CONVERGENT__ extern SYCL_EXTERNAL dataT __spirv_SubgroupBlockReadINTEL(
const __attribute__((opencl_global)) uint16_t *Ptr) noexcept;

template <typename dataT>
extern SYCL_EXTERNAL void
__SYCL_CONVERGENT__ extern SYCL_EXTERNAL void
__spirv_SubgroupBlockWriteINTEL(__attribute__((opencl_global)) uint16_t *Ptr,
dataT Data) noexcept;

template <typename dataT>
extern SYCL_EXTERNAL dataT __spirv_SubgroupBlockReadINTEL(
__SYCL_CONVERGENT__ extern SYCL_EXTERNAL dataT __spirv_SubgroupBlockReadINTEL(
const __attribute__((opencl_global)) uint32_t *Ptr) noexcept;

template <typename dataT>
extern SYCL_EXTERNAL void
__SYCL_CONVERGENT__ extern SYCL_EXTERNAL void
__spirv_SubgroupBlockWriteINTEL(__attribute__((opencl_global)) uint32_t *Ptr,
dataT Data) noexcept;

Expand Down Expand Up @@ -538,7 +534,7 @@ __SPIRV_DECLARE_OCL3(select) // select
#else // if !__SYCL_DEVICE_ONLY__

template <typename dataT>
extern __ocl_event_t
__SYCL_CONVERGENT__ extern __ocl_event_t
OpGroupAsyncCopyGlobalToLocal(__spv::Scope Execution, dataT *Dest, dataT *Src,
size_t NumElements, size_t Stride,
__ocl_event_t E) noexcept {
Expand All @@ -550,7 +546,7 @@ OpGroupAsyncCopyGlobalToLocal(__spv::Scope Execution, dataT *Dest, dataT *Src,
}

template <typename dataT>
extern __ocl_event_t
__SYCL_CONVERGENT__ extern __ocl_event_t
OpGroupAsyncCopyLocalToGlobal(__spv::Scope Execution, dataT *Dest, dataT *Src,
size_t NumElements, size_t Stride,
__ocl_event_t E) noexcept {
Expand All @@ -565,13 +561,13 @@ extern void __spirv_ocl_prefetch(const char *Ptr, size_t NumBytes) noexcept;

#endif // !__SYCL_DEVICE_ONLY__

extern SYCL_EXTERNAL void __spirv_ControlBarrier(__spv::Scope Execution,
__spv::Scope Memory,
uint32_t Semantics) noexcept;
__SYCL_CONVERGENT__ extern SYCL_EXTERNAL void
__spirv_ControlBarrier(__spv::Scope Execution, __spv::Scope Memory,
uint32_t Semantics) noexcept;

extern SYCL_EXTERNAL void __spirv_MemoryBarrier(__spv::Scope Memory,
uint32_t Semantics) noexcept;
__SYCL_CONVERGENT__ extern SYCL_EXTERNAL void
__spirv_MemoryBarrier(__spv::Scope Memory, uint32_t Semantics) noexcept;

extern SYCL_EXTERNAL void
__SYCL_CONVERGENT__ extern SYCL_EXTERNAL void
__spirv_GroupWaitEvents(__spv::Scope Execution, uint32_t NumEvents,
__ocl_event_t *WaitEvents) noexcept;