9#ifndef __CLANG_GPU_INTRINSICS_H__
10#define __CLANG_GPU_INTRINSICS_H__
12#if defined(__HIP__) || defined(__CUDA__)
18 __attribute__((device, always_inline,
const)) operator
int() const noexcept {
23#pragma push_macro("__GPU_DEVICE__")
24#define __GPU_DEVICE__ static __inline__ __attribute__((device, always_inline))
25#pragma push_macro("MAYBE_UNDEF")
26#define MAYBE_UNDEF __attribute__((maybe_undef))
28template <
typename __T>
29__GPU_DEVICE__ __T __gpu_shuffle_idx_impl(__T
__v,
unsigned int __idx,
31 if constexpr (
sizeof(__T) ==
sizeof(
unsigned long long)) {
32 return __builtin_bit_cast(
34 __builtin_bit_cast(
unsigned long long,
__v),
37 return __builtin_bit_cast(
39 __builtin_bit_cast(
unsigned int,
__v),
44template <
typename __T>
45__GPU_DEVICE__ __T __shfl(MAYBE_UNDEF __T __var,
int __src_lane,
46 int __width = warpSize) {
47 return __gpu_shuffle_idx_impl(
48 __var, (
unsigned int)(__src_lane & (__width - 1)), __width);
50template <
typename __T>
51__GPU_DEVICE__ __T __shfl_up(MAYBE_UNDEF __T __var,
unsigned int __delta,
52 int __width = warpSize) {
54 int __tgt = __rel -
int(__delta);
55 return __gpu_shuffle_idx_impl(
56 __var, (
unsigned int)(__tgt < 0 ? __rel : __tgt), __width);
58template <
typename __T>
59__GPU_DEVICE__ __T __shfl_down(MAYBE_UNDEF __T __var,
unsigned int __delta,
60 int __width = warpSize) {
62 int __tgt = __rel +
int(__delta);
63 return __gpu_shuffle_idx_impl(
64 __var, (
unsigned int)(__tgt >= __width ? __rel : __tgt), __width);
66template <
typename __T>
67__GPU_DEVICE__ __T __shfl_xor(MAYBE_UNDEF __T __var,
int __lane_mask,
68 int __width = warpSize) {
70 int __tgt = __rel ^ __lane_mask;
71 return __gpu_shuffle_idx_impl(
72 __var, (
unsigned int)(__tgt >= __width ? __rel : __tgt), __width);
75__GPU_DEVICE__
void __syncwarp(
unsigned long long __mask = -1) {
76 __scoped_atomic_thread_fence(__ATOMIC_RELEASE, __MEMORY_SCOPE_WVFRNT);
78 __scoped_atomic_thread_fence(__ATOMIC_ACQUIRE, __MEMORY_SCOPE_WVFRNT);
81template <
typename __MaskT>
82__GPU_DEVICE__
unsigned long long __ballot_sync(__MaskT __mask,
int __pred) {
83 return __ballot(__pred) & (
unsigned long long)__mask;
85template <
typename __MaskT>
86__GPU_DEVICE__
int __all_sync(__MaskT __mask,
int __pred) {
87 return __ballot_sync(__mask, __pred) == (
unsigned long long)__mask;
89template <
typename __MaskT>
90__GPU_DEVICE__
int __any_sync(__MaskT __mask,
int __pred) {
91 return __ballot_sync(__mask, __pred) != 0ull;
94template <
typename __MaskT,
typename __T>
95__GPU_DEVICE__ __T __shfl_sync(__MaskT __mask, MAYBE_UNDEF __T __var,
96 int __src_lane,
int __width = warpSize) {
98 return __shfl(__var, __src_lane, __width);
100template <
typename __MaskT,
typename __T>
101__GPU_DEVICE__ __T __shfl_up_sync(__MaskT __mask, MAYBE_UNDEF __T __var,
102 unsigned int __delta,
103 int __width = warpSize) {
105 return __shfl_up(__var, __delta, __width);
107template <
typename __MaskT,
typename __T>
108__GPU_DEVICE__ __T __shfl_down_sync(__MaskT __mask, MAYBE_UNDEF __T __var,
109 unsigned int __delta,
110 int __width = warpSize) {
112 return __shfl_down(__var, __delta, __width);
114template <
typename __MaskT,
typename __T>
115__GPU_DEVICE__ __T __shfl_xor_sync(__MaskT __mask, MAYBE_UNDEF __T __var,
116 int __lane_mask,
int __width = warpSize) {
118 return __shfl_xor(__var, __lane_mask, __width);
121template <
typename __T>
122__GPU_DEVICE__
unsigned long long __match_any(__T
__value) {
123 if constexpr (
sizeof(__T) ==
sizeof(
unsigned long long)) {
125 __builtin_bit_cast(
unsigned long long,
__value));
128 __builtin_bit_cast(
unsigned int,
__value));
131template <
typename __MaskT,
typename __T>
132__GPU_DEVICE__
unsigned long long __match_any_sync(__MaskT __mask,
134 return __match_any(
__value) & (
unsigned long long)__mask;
137template <
typename __T>
138__GPU_DEVICE__
unsigned long long __match_all(__T
__value,
int *__pred) {
139 unsigned long long __r;
140 if constexpr (
sizeof(__T) ==
sizeof(
unsigned long long)) {
142 __builtin_bit_cast(
unsigned long long,
__value));
145 __builtin_bit_cast(
unsigned int,
__value));
150template <
typename __MaskT,
typename __T>
151__GPU_DEVICE__
unsigned long long __match_all_sync(__MaskT __mask, __T
__value,
154 return __match_all(
__value, __pred);
157template <
typename __MaskT>
158__GPU_DEVICE__
unsigned int __reduce_add_sync(__MaskT __mask,
159 unsigned int __val) {
160 return __gpu_lane_add_u32((
unsigned long long)__mask, __val);
162template <
typename __MaskT>
163__GPU_DEVICE__
int __reduce_add_sync(__MaskT __mask,
int __val) {
165 __gpu_lane_add_u32((
unsigned long long)__mask, (
unsigned int)__val));
167template <
typename __MaskT>
168__GPU_DEVICE__
unsigned int __reduce_min_sync(__MaskT __mask,
169 unsigned int __val) {
170 return __gpu_lane_min_u32((
unsigned long long)__mask, __val);
172template <
typename __MaskT>
173__GPU_DEVICE__
int __reduce_min_sync(__MaskT __mask,
int __val) {
174 unsigned int __r = __gpu_lane_min_u32((
unsigned long long)__mask,
175 (
unsigned int)__val ^ 0x80000000u);
176 return int(__r ^ 0x80000000u);
178template <
typename __MaskT>
179__GPU_DEVICE__
unsigned int __reduce_max_sync(__MaskT __mask,
180 unsigned int __val) {
181 return __gpu_lane_max_u32((
unsigned long long)__mask, __val);
183template <
typename __MaskT>
184__GPU_DEVICE__
int __reduce_max_sync(__MaskT __mask,
int __val) {
185 unsigned int __r = __gpu_lane_max_u32((
unsigned long long)__mask,
186 (
unsigned int)__val ^ 0x80000000u);
187 return int(__r ^ 0x80000000u);
189template <
typename __MaskT>
190__GPU_DEVICE__
unsigned int __reduce_and_sync(__MaskT __mask,
191 unsigned int __val) {
192 return __gpu_lane_and_u32((
unsigned long long)__mask, __val);
194template <
typename __MaskT>
195__GPU_DEVICE__
unsigned int __reduce_or_sync(__MaskT __mask,
196 unsigned int __val) {
197 return __gpu_lane_or_u32((
unsigned long long)__mask, __val);
199template <
typename __MaskT>
200__GPU_DEVICE__
unsigned int __reduce_xor_sync(__MaskT __mask,
201 unsigned int __val) {
202 return __gpu_lane_xor_u32((
unsigned long long)__mask, __val);
205__GPU_DEVICE__
unsigned int
206__funnelshift_l(
unsigned int __lo,
unsigned int __hi,
unsigned int __shift) {
207 unsigned int __s = __shift & 31u;
208 return (
unsigned int)((((
unsigned long long)__hi << 32 | __lo) << __s) >> 32);
210__GPU_DEVICE__
unsigned int
211__funnelshift_lc(
unsigned int __lo,
unsigned int __hi,
unsigned int __shift) {
212 unsigned int __s = __shift >= 32u ? 32u : __shift;
213 return (
unsigned int)((((
unsigned long long)__hi << 32 | __lo) << __s) >> 32);
215__GPU_DEVICE__
unsigned int
216__funnelshift_r(
unsigned int __lo,
unsigned int __hi,
unsigned int __shift) {
217 unsigned int __s = __shift & 31u;
218 return (
unsigned int)(((
unsigned long long)__hi << 32 | __lo) >> __s);
220__GPU_DEVICE__
unsigned int
221__funnelshift_rc(
unsigned int __lo,
unsigned int __hi,
unsigned int __shift) {
222 unsigned int __s = __shift >= 32u ? 32u : __shift;
223 return (
unsigned int)(((
unsigned long long)__hi << 32 | __lo) >> __s);
226#pragma pop_macro("MAYBE_UNDEF")
227#pragma pop_macro("__GPU_DEVICE__")
__DEVICE__ unsigned int __ballot(int __a)
__device__ unsigned __funnelshift_lc(unsigned low32, unsigned high32, unsigned shiftWidth)
__device__ unsigned __funnelshift_rc(unsigned low32, unsigned high32, unsigned shiftWidth)
__device__ unsigned __funnelshift_r(unsigned low32, unsigned high32, unsigned shiftWidth)
__device__ unsigned __funnelshift_l(unsigned low32, unsigned high32, unsigned shiftWidth)
_Float16 __2f16 __attribute__((ext_vector_type(2)))
Zeroes the upper 128 bits (bits 255:128) of all YMM registers.
static _DEFAULT_FN_ATTRS __inline__ uint32_t __gpu_lane_id(void)
static _DEFAULT_FN_ATTRS __inline__ uint64_t __gpu_lane_mask(void)
static _DEFAULT_FN_ATTRS __inline__ uint32_t __gpu_shuffle_idx_u32(uint64_t __lane_mask, uint32_t __idx, uint32_t __x, uint32_t __width)
static _DEFAULT_FN_ATTRS __inline__ void __gpu_sync_lane(uint64_t __lane_mask)
static _DEFAULT_FN_ATTRS __inline__ uint32_t __gpu_num_lanes(void)
static _DEFAULT_FN_ATTRS __inline__ uint64_t __gpu_match_any_u32(uint64_t __lane_mask, uint32_t __x)
static _DEFAULT_FN_ATTRS __inline__ uint64_t __gpu_shuffle_idx_u64(uint64_t __lane_mask, uint32_t __idx, uint64_t __x, uint32_t __width)
static _DEFAULT_FN_ATTRS __inline__ uint64_t __gpu_match_all_u32(uint64_t __lane_mask, uint32_t __x)
static _DEFAULT_FN_ATTRS __inline__ uint64_t __gpu_match_all_u64(uint64_t __lane_mask, uint64_t __x)
static _DEFAULT_FN_ATTRS __inline__ uint64_t __gpu_match_any_u64(uint64_t __lane_mask, uint64_t __x)
static __inline__ void unsigned int __value