DPC++ Runtime
Runtime libraries for oneAPI DPC++
builtins.hpp
Go to the documentation of this file.
1 //==----------- builtins.hpp - SYCL built-in functions ---------------------==//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #pragma once
10 
11 #include <sycl/detail/defines_elementary.hpp> // for __SYCL_ALWAYS_INLINE
12 #include <sycl/detail/generic_type_traits.hpp> // for convertDataToType
13 
14 // TODO Decide whether to mark functions with this attribute.
15 #define __NOEXC /*noexcept*/
16 
17 #ifdef __SYCL_DEVICE_ONLY__
18 #define __FUNC_PREFIX_OCL __spirv_ocl_
19 #define __FUNC_PREFIX_CORE __spirv_
20 #define __SYCL_EXTERN_IT1(Ret, prefix, call, Arg1)
21 #define __SYCL_EXTERN_IT2(Ret, prefix, call, Arg1, Arg2)
22 #define __SYCL_EXTERN_IT2_SAME(Ret, prefix, call, Arg)
23 #define __SYCL_EXTERN_IT3(Ret, prefix, call, Arg1, Arg2, Arg3)
24 #else
25 #define __FUNC_PREFIX_OCL sycl_host_
26 #define __FUNC_PREFIX_CORE sycl_host_
27 #define __SYCL_EXTERN_IT1(Ret, prefix, call, Arg) \
28  extern Ret __SYCL_PPCAT(prefix, call)(Arg)
29 #define __SYCL_EXTERN_IT2_SAME(Ret, prefix, call, Arg) \
30  extern Ret __SYCL_PPCAT(prefix, call)(Arg, Arg)
31 #define __SYCL_EXTERN_IT2(Ret, prefix, call, Arg1, Arg2) \
32  extern Ret __SYCL_PPCAT(prefix, call)(Arg1, Arg2)
33 #define __SYCL_EXTERN_IT3(Ret, prefix, call, Arg1, Arg2, Arg3) \
34  extern Ret __SYCL_PPCAT(prefix, call)(Arg1, Arg2, Arg3)
35 #endif
36 
37 #define __SYCL_PPCAT_NX(A, B) A##B
38 #define __SYCL_PPCAT(A, B) __SYCL_PPCAT_NX(A, B)
39 
40 #define __SYCL_MAKE_CALL_ARG1(call, prefix) \
41  template <typename R, typename T1> \
42  inline __SYCL_ALWAYS_INLINE R __invoke_##call(T1 t1) __NOEXC { \
43  using Ret = sycl::detail::ConvertToOpenCLType_t<R>; \
44  using Arg1 = sycl::detail::ConvertToOpenCLType_t<T1>; \
45  __SYCL_EXTERN_IT1(Ret, prefix, call, Arg1); \
46  Arg1 arg1 = sycl::detail::convertDataToType<T1, Arg1>(t1); \
47  Ret ret = __SYCL_PPCAT(prefix, call)(arg1); \
48  return sycl::detail::convertDataToType<Ret, R>(ret); \
49  }
50 
51 #define __SYCL_MAKE_CALL_ARG2(call, prefix) \
52  template <typename R, typename T1, typename T2> \
53  inline __SYCL_ALWAYS_INLINE R __invoke_##call(T1 t1, T2 t2) __NOEXC { \
54  using Ret = sycl::detail::ConvertToOpenCLType_t<R>; \
55  using Arg1 = sycl::detail::ConvertToOpenCLType_t<T1>; \
56  using Arg2 = sycl::detail::ConvertToOpenCLType_t<T2>; \
57  __SYCL_EXTERN_IT2(Ret, prefix, call, Arg1, Arg2); \
58  Arg1 arg1 = sycl::detail::convertDataToType<T1, Arg1>(t1); \
59  Arg2 arg2 = sycl::detail::convertDataToType<T2, Arg2>(t2); \
60  Ret ret = __SYCL_PPCAT(prefix, call)(arg1, arg2); \
61  return sycl::detail::convertDataToType<Ret, R>(ret); \
62  }
63 
64 #define __SYCL_MAKE_CALL_ARG2_SAME(call, prefix) \
65  template <typename R, typename T> \
66  inline __SYCL_ALWAYS_INLINE R __invoke_##call(T t1, T t2) __NOEXC { \
67  using Ret = sycl::detail::ConvertToOpenCLType_t<R>; \
68  using Arg = sycl::detail::ConvertToOpenCLType_t<T>; \
69  __SYCL_EXTERN_IT2_SAME(Ret, prefix, call, Arg); \
70  Arg arg1 = sycl::detail::convertDataToType<T, Arg>(t1); \
71  Arg arg2 = sycl::detail::convertDataToType<T, Arg>(t2); \
72  Ret ret = __SYCL_PPCAT(prefix, call)(arg1, arg2); \
73  return sycl::detail::convertDataToType<Ret, R>(ret); \
74  }
75 
76 #define __SYCL_MAKE_CALL_ARG2_SAME_RESULT(call, prefix) \
77  template <typename T> \
78  inline __SYCL_ALWAYS_INLINE T __invoke_##call(T v1, T v2) __NOEXC { \
79  using Type = sycl::detail::ConvertToOpenCLType_t<T>; \
80  __SYCL_EXTERN_IT2_SAME(Type, prefix, call, Type); \
81  Type arg1 = sycl::detail::convertDataToType<T, Type>(v1); \
82  Type arg2 = sycl::detail::convertDataToType<T, Type>(v2); \
83  Type ret = __SYCL_PPCAT(prefix, call)(arg1, arg2); \
84  return sycl::detail::convertDataToType<Type, T>(ret); \
85  }
86 
87 #define __SYCL_MAKE_CALL_ARG3(call, prefix) \
88  template <typename R, typename T1, typename T2, typename T3> \
89  inline __SYCL_ALWAYS_INLINE R __invoke_##call(T1 t1, T2 t2, T3 t3) __NOEXC { \
90  using Ret = sycl::detail::ConvertToOpenCLType_t<R>; \
91  using Arg1 = sycl::detail::ConvertToOpenCLType_t<T1>; \
92  using Arg2 = sycl::detail::ConvertToOpenCLType_t<T2>; \
93  using Arg3 = sycl::detail::ConvertToOpenCLType_t<T3>; \
94  __SYCL_EXTERN_IT3(Ret, prefix, call, Arg1, Arg2, Arg3); \
95  Arg1 arg1 = sycl::detail::convertDataToType<T1, Arg1>(t1); \
96  Arg2 arg2 = sycl::detail::convertDataToType<T2, Arg2>(t2); \
97  Arg3 arg3 = sycl::detail::convertDataToType<T3, Arg3>(t3); \
98  Ret ret = __SYCL_PPCAT(prefix, call)(arg1, arg2, arg3); \
99  return sycl::detail::convertDataToType<Ret, R>(ret); \
100  }
101 
102 #ifndef __SYCL_DEVICE_ONLY__
103 namespace __host_std {
104 #endif // __SYCL_DEVICE_ONLY__
105 /* ----------------- 4.13.3 Math functions. ---------------------------------*/
201 /* --------------- 4.13.4 Integer functions. --------------------------------*/
236 /* --------------- 4.13.5 Common functions. ---------------------------------*/
246 /* --------------- 4.13.6 Geometric Functions. ------------------------------*/
256 /* --------------- 4.13.7 Relational functions. -----------------------------*/
257 __SYCL_MAKE_CALL_ARG2_SAME(FOrdEqual, __FUNC_PREFIX_CORE) // isequal
258 __SYCL_MAKE_CALL_ARG2_SAME(FUnordNotEqual, __FUNC_PREFIX_CORE) // isnotequal
259 __SYCL_MAKE_CALL_ARG2_SAME(FOrdGreaterThan, __FUNC_PREFIX_CORE) // isgreater
260 __SYCL_MAKE_CALL_ARG2_SAME(FOrdGreaterThanEqual,
261  __FUNC_PREFIX_CORE) // isgreaterequal
262 __SYCL_MAKE_CALL_ARG2_SAME(FOrdLessThan, __FUNC_PREFIX_CORE) // isless
263 __SYCL_MAKE_CALL_ARG2_SAME(FOrdLessThanEqual, __FUNC_PREFIX_CORE) // islessequal
264 __SYCL_MAKE_CALL_ARG2_SAME(FOrdNotEqual, __FUNC_PREFIX_CORE) // islessgreater
265 __SYCL_MAKE_CALL_ARG2_SAME(LessOrGreater, __FUNC_PREFIX_CORE) // islessgreater
266 __SYCL_MAKE_CALL_ARG1(IsFinite, __FUNC_PREFIX_CORE) // isfinite
269 __SYCL_MAKE_CALL_ARG1(IsNormal, __FUNC_PREFIX_CORE) // isnormal
271 __SYCL_MAKE_CALL_ARG2_SAME(Unordered, __FUNC_PREFIX_CORE) // isunordered
272 __SYCL_MAKE_CALL_ARG1(SignBitSet, __FUNC_PREFIX_CORE) // signbit
276 __SYCL_MAKE_CALL_ARG3(select, __FUNC_PREFIX_OCL) // select
277 #ifndef __SYCL_DEVICE_ONLY__
278 } // namespace __host_std
279 #endif
280 
281 #undef __NOEXC
282 #undef __SYCL_MAKE_CALL_ARG1
283 #undef __SYCL_MAKE_CALL_ARG2
284 #undef __SYCL_MAKE_CALL_ARG2_SAME
285 #undef __SYCL_MAKE_CALL_ARG2_SAME_RESULT
286 #undef __SYCL_MAKE_CALL_ARG3
287 #undef __SYCL_PPCAT_NX
288 #undef __SYCL_PPCAT
289 #undef __FUNC_PREFIX_OCL
290 #undef __FUNC_PREFIX_CORE
291 #undef __SYCL_EXTERN_IT1
292 #undef __SYCL_EXTERN_IT2
293 #undef __SYCL_EXTERN_IT2_SAME
294 #undef __SYCL_EXTERN_IT3
__SYCL_MAKE_CALL_ARG3
#define __SYCL_MAKE_CALL_ARG3(call, prefix)
Definition: builtins.hpp:87
__SYCL_MAKE_CALL_ARG2
#define __SYCL_MAKE_CALL_ARG2(call, prefix)
Definition: builtins.hpp:51
sycl::_V1::ext::oneapi::fabs
std::enable_if_t< detail::is_bf16_storage_type< T >::value, T > fabs(T x)
Definition: bf16_storage_builtins.hpp:47
sycl::_V1::ext::intel::experimental::esimd::acos
__ESIMD_API std::enable_if_t< std::is_floating_point< T >::value, sycl::ext::intel::esimd::simd< T, SZ > > acos(sycl::ext::intel::esimd::simd< T, SZ > src0)
Definition: math.hpp:1298
__FUNC_PREFIX_CORE
#define __FUNC_PREFIX_CORE
Definition: builtins.hpp:26
sycl::_V1::ext::intel::experimental::esimd::atan2
sycl::ext::intel::esimd::simd< float, N > atan2(sycl::ext::intel::esimd::simd< float, N > y, sycl::ext::intel::esimd::simd< float, N > x)
Definition: math.hpp:1446
__host_std
Definition: builtins.hpp:103
sycl::_V1::ext::oneapi::experimental::native::tanh
__SYCL_ALWAYS_INLINE std::enable_if_t< std::is_same_v< T, half >||std::is_same_v< T, float >, sycl::marray< T, N > > tanh(sycl::marray< T, N > x) __NOEXC
Definition: builtins.hpp:117
sycl::_V1::cos
ESIMD_NODEBUG ESIMD_INLINE sycl::ext::intel::esimd::simd< float, SZ > cos(sycl::ext::intel::esimd::simd< float, SZ > x) __NOEXC
Definition: builtins_esimd.hpp:27
sycl::_V1::exp
ESIMD_NODEBUG ESIMD_INLINE sycl::ext::intel::esimd::simd< float, SZ > exp(sycl::ext::intel::esimd::simd< float, SZ > x) __NOEXC
Definition: builtins_esimd.hpp:49
__host_std::__SYCL_MAKE_CALL_ARG2_SAME
__SYCL_MAKE_CALL_ARG2_SAME(Dot, __FUNC_PREFIX_CORE) __SYCL_MAKE_CALL_ARG2_SAME_RESULT(FMul
sycl::_V1::ext::intel::experimental::esimd::asin
__ESIMD_API std::enable_if_t< std::is_floating_point< T >::value, sycl::ext::intel::esimd::simd< T, SZ > > asin(sycl::ext::intel::esimd::simd< T, SZ > src0)
Definition: math.hpp:1336
sycl::_V1::ext::intel::esimd::sqrt
__ESIMD_API simd< T, N > sqrt(simd< T, N > src, Sat sat={})
Square root.
Definition: math.hpp:389
sycl::_V1::sin
ESIMD_NODEBUG ESIMD_INLINE sycl::ext::intel::esimd::simd< float, SZ > sin(sycl::ext::intel::esimd::simd< float, SZ > x) __NOEXC
Definition: builtins_esimd.hpp:38
sycl::_V1::ext::intel::experimental::esimd::atan
ESIMD_DETAIL __ESIMD_API sycl::ext::intel::esimd::simd< T, SZ > atan(sycl::ext::intel::esimd::simd< T, SZ > src0)
Definition: math.hpp:1254
defines_elementary.hpp
sycl::_V1::ext::intel::experimental::esimd::sincos
__ESIMD_API sycl::ext::intel::esimd::simd< float, SZ > sincos(sycl::ext::intel::esimd::simd< float, SZ > &dstcos, U src0, Sat sat={})
Definition: math.hpp:1240
generic_type_traits.hpp
sycl::_V1::ext::intel::esimd::rsqrt
__ESIMD_API simd< T, N > rsqrt(simd< T, N > src, Sat sat={})
Square root reciprocal - calculates 1/sqrt(x).
Definition: math.hpp:397
sycl::_V1::ext::intel::esimd::ceil
ESIMD_INLINE sycl::ext::intel::esimd::simd< RT, SZ > ceil(const sycl::ext::intel::esimd::simd< float, SZ > src0, Sat sat={})
"Ceiling" operation, vector version - alias of rndu.
Definition: math.hpp:594
popcount
int popcount(const simd_mask< _Tp, _Abi > &) noexcept
sycl::_V1::ext::intel::experimental::esimd::fmod
sycl::ext::intel::esimd::simd< float, N > fmod(sycl::ext::intel::esimd::simd< float, N > y, sycl::ext::intel::esimd::simd< float, N > x)
Definition: math.hpp:1479
sycl::_V1::ext::intel::esimd::log2
__ESIMD_API simd< T, N > log2(simd< T, N > src, Sat sat={})
Logarithm base 2.
Definition: math.hpp:381
__SYCL_MAKE_CALL_ARG2_SAME_RESULT
#define __SYCL_MAKE_CALL_ARG2_SAME_RESULT(call, prefix)
Definition: builtins.hpp:76
sycl::_V1::ext::intel::math::copysign
std::enable_if_t< std::is_same_v< Tp, float >, float > copysign(Tp x, Tp y)
Definition: math.hpp:71
sycl::_V1::ext::oneapi::experimental::native::exp2
__SYCL_ALWAYS_INLINE sycl::marray< half, N > exp2(sycl::marray< half, N > x) __NOEXC
Definition: builtins.hpp:160
sycl::_V1::log
ESIMD_NODEBUG ESIMD_INLINE sycl::ext::intel::esimd::simd< float, SZ > log(sycl::ext::intel::esimd::simd< float, SZ > x) __NOEXC
Definition: builtins_esimd.hpp:60
sycl::_V1::ext::intel::math::rint
std::enable_if_t< std::is_same_v< Tp, float >, float > rint(Tp x)
Definition: math.hpp:152
sycl::_V1::ext::intel::esimd::pow
__ESIMD_API simd< T, N > pow(simd< T, N > src0, simd< U, N > src1, Sat sat={})
Power - calculates src0 in power of src1.
Definition: math.hpp:442
__FUNC_PREFIX_OCL
#define __FUNC_PREFIX_OCL
Definition: builtins.hpp:25
syclcompat::fast_length
float fast_length(const float *a, int len)
Compute fast_length for variable-length array.
Definition: util.hpp:126
sycl::_V1::detail::Ordered
@ Ordered
Definition: queue_impl.hpp:68
sycl::_V1::ext::intel::esimd::floor
ESIMD_INLINE sycl::ext::intel::esimd::simd< RT, SZ > floor(const sycl::ext::intel::esimd::simd< float, SZ > src0, Sat sat={})
"Floor" operation, vector version - alias of rndd.
Definition: math.hpp:581
sycl::_V1::ext::intel::esimd::trunc
__ESIMD_API sycl::ext::intel::esimd::simd< RT, SZ > trunc(const sycl::ext::intel::esimd::simd< float, SZ > &src0, Sat sat={})
Round to integral value using the round to zero rounding mode (vector version).
Definition: math.hpp:614
__host_std::__SYCL_MAKE_CALL_ARG1
__FUNC_PREFIX_CORE __FUNC_PREFIX_CORE __FUNC_PREFIX_CORE __FUNC_PREFIX_CORE __FUNC_PREFIX_CORE __SYCL_MAKE_CALL_ARG1(IsFinite, __FUNC_PREFIX_CORE) __SYCL_MAKE_CALL_ARG1(IsInf