45#ifndef KOKKOS_MATHEMATICAL_FUNCTIONS_HPP
46#define KOKKOS_MATHEMATICAL_FUNCTIONS_HPP
48#include <Kokkos_Macros.hpp>
53#ifdef KOKKOS_ENABLE_SYCL
60#if defined(KOKKOS_ENABLE_SYCL)
61#define NAMESPACE_MATH_FUNCTIONS sycl
63#define NAMESPACE_MATH_FUNCTIONS std
66#define KOKKOS_IMPL_UNARY_FUNCTION_FLOATING_POINT(FUNC, RETURNTYPE, ARGTYPE) \
67 KOKKOS_INLINE_FUNCTION RETURNTYPE FUNC(ARGTYPE x) { \
68 using NAMESPACE_MATH_FUNCTIONS::FUNC; \
72#define KOKKOS_IMPL_UNARY_FUNCTION_INTEGRAL(FUNC, RETURNTYPE) \
73 template <typename Integer, \
74 typename = std::enable_if_t<std::is_integral<Integer>::value>> \
75 KOKKOS_INLINE_FUNCTION RETURNTYPE FUNC(Integer x) { \
76 return Kokkos::Experimental::FUNC(static_cast<double>(x)); \
79#define KOKKOS_IMPL_BINARY_FUNCTION_FLOATING_POINT(FUNC, TYPE) \
80 KOKKOS_INLINE_FUNCTION TYPE FUNC(TYPE x, TYPE y) { \
81 using NAMESPACE_MATH_FUNCTIONS::FUNC; \
86#if defined(KOKKOS_ENABLE_CUDA) || defined(KOKKOS_ENABLE_HIP) || \
87 defined(KOKKOS_ENABLE_SYCL) || defined(KOKKOS_ENABLE_OPENMPTARGET)
89#define KOKKOS_IMPL_BINARY_FUNCTION_ARITHMETIC(FUNC) \
90 template <typename Arithmetic1, typename Arithmetic2, \
91 typename = std::enable_if_t< \
92 std::is_arithmetic<Arithmetic1>::value && \
93 std::is_arithmetic<Arithmetic2>::value && \
94 !std::is_same<Arithmetic1, long double>::value && \
95 !std::is_same<Arithmetic2, long double>::value>> \
96 KOKKOS_INLINE_FUNCTION double FUNC(Arithmetic1 x, Arithmetic2 y) { \
97 return Kokkos::Experimental::FUNC( \
98 static_cast<std::conditional_t<std::is_integral<Arithmetic1>::value, \
99 double, Arithmetic1>>(x), \
100 static_cast<std::conditional_t<std::is_integral<Arithmetic2>::value, \
101 double, Arithmetic2>>(y)); \
104#define KOKKOS_IMPL_MATH_UNARY_FUNCTION(FUNC) \
105 KOKKOS_IMPL_UNARY_FUNCTION_FLOATING_POINT(FUNC, float, float) \
106 KOKKOS_IMPL_UNARY_FUNCTION_FLOATING_POINT(FUNC, double, double) \
107 KOKKOS_IMPL_UNARY_FUNCTION_INTEGRAL(FUNC, double)
109#define KOKKOS_IMPL_MATH_UNARY_PREDICATE(FUNC) \
110 KOKKOS_IMPL_UNARY_FUNCTION_FLOATING_POINT(FUNC, bool, float) \
111 KOKKOS_IMPL_UNARY_FUNCTION_FLOATING_POINT(FUNC, bool, double) \
112 KOKKOS_IMPL_UNARY_FUNCTION_INTEGRAL(FUNC, bool)
114#define KOKKOS_IMPL_MATH_BINARY_FUNCTION(FUNC) \
115 KOKKOS_IMPL_BINARY_FUNCTION_FLOATING_POINT(FUNC, float) \
116 KOKKOS_IMPL_BINARY_FUNCTION_FLOATING_POINT(FUNC, double) \
117 KOKKOS_IMPL_BINARY_FUNCTION_ARITHMETIC(FUNC)
119#define KOKKOS_IMPL_MATH_NAN() \
120 KOKKOS_IMPL_UNARY_FUNCTION_FLOATING_POINT(nanf, float, char const*) \
121 KOKKOS_IMPL_UNARY_FUNCTION_FLOATING_POINT(nan, double, char const*)
125#define KOKKOS_IMPL_BINARY_FUNCTION_ARITHMETIC(FUNC) \
126 template <typename Arithmetic1, typename Arithmetic2, \
128 std::enable_if_t<std::is_arithmetic<Arithmetic1>::value && \
129 std::is_arithmetic<Arithmetic2>::value>, \
130 typename Promoted = std::conditional_t< \
131 std::is_same<Arithmetic1, long double>::value || \
132 std::is_same<Arithmetic2, long double>::value, \
133 long double, double>> \
134 KOKKOS_INLINE_FUNCTION Promoted FUNC(Arithmetic1 x, Arithmetic2 y) { \
135 return Kokkos::Experimental::FUNC( \
136 static_cast<std::conditional_t<std::is_integral<Arithmetic1>::value, \
137 double, Arithmetic1>>(x), \
138 static_cast<std::conditional_t<std::is_integral<Arithmetic2>::value, \
139 double, Arithmetic2>>(y)); \
142#define KOKKOS_IMPL_MATH_UNARY_FUNCTION(FUNC) \
143 KOKKOS_IMPL_UNARY_FUNCTION_FLOATING_POINT(FUNC, float, float) \
144 KOKKOS_IMPL_UNARY_FUNCTION_FLOATING_POINT(FUNC, double, double) \
145 KOKKOS_IMPL_UNARY_FUNCTION_FLOATING_POINT(FUNC, long double, long double) \
146 KOKKOS_IMPL_UNARY_FUNCTION_INTEGRAL(FUNC, double)
148#define KOKKOS_IMPL_MATH_UNARY_PREDICATE(FUNC) \
149 KOKKOS_IMPL_UNARY_FUNCTION_FLOATING_POINT(FUNC, bool, float) \
150 KOKKOS_IMPL_UNARY_FUNCTION_FLOATING_POINT(FUNC, bool, double) \
151 KOKKOS_IMPL_UNARY_FUNCTION_FLOATING_POINT(FUNC, bool, long double) \
152 KOKKOS_IMPL_UNARY_FUNCTION_INTEGRAL(FUNC, bool)
154#define KOKKOS_IMPL_MATH_BINARY_FUNCTION(FUNC) \
155 KOKKOS_IMPL_BINARY_FUNCTION_FLOATING_POINT(FUNC, float) \
156 KOKKOS_IMPL_BINARY_FUNCTION_FLOATING_POINT(FUNC, double) \
157 KOKKOS_IMPL_BINARY_FUNCTION_FLOATING_POINT(FUNC, long double) \
158 KOKKOS_IMPL_BINARY_FUNCTION_ARITHMETIC(FUNC)
160#define KOKKOS_IMPL_MATH_NAN() \
161 KOKKOS_IMPL_UNARY_FUNCTION_FLOATING_POINT(nanf, float, char const*) \
162 KOKKOS_IMPL_UNARY_FUNCTION_FLOATING_POINT(nan, double, char const*) \
163 KOKKOS_IMPL_UNARY_FUNCTION_FLOATING_POINT(nanl, long double, char const*)
168KOKKOS_IMPL_MATH_UNARY_FUNCTION(fabs)
169KOKKOS_IMPL_MATH_BINARY_FUNCTION(fmod)
170KOKKOS_IMPL_MATH_BINARY_FUNCTION(remainder)
171KOKKOS_IMPL_MATH_BINARY_FUNCTION(fmin)
172KOKKOS_IMPL_MATH_BINARY_FUNCTION(fmax)
173KOKKOS_IMPL_MATH_BINARY_FUNCTION(fdim)
174#ifndef KOKKOS_ENABLE_SYCL
175KOKKOS_IMPL_MATH_NAN()
178KOKKOS_IMPL_MATH_BINARY_FUNCTION(pow)
179KOKKOS_IMPL_MATH_UNARY_FUNCTION(sqrt)
180KOKKOS_IMPL_MATH_UNARY_FUNCTION(cbrt)
181KOKKOS_IMPL_MATH_BINARY_FUNCTION(hypot)
183KOKKOS_IMPL_MATH_UNARY_FUNCTION(exp)
184KOKKOS_IMPL_MATH_UNARY_FUNCTION(exp2)
185KOKKOS_IMPL_MATH_UNARY_FUNCTION(expm1)
186KOKKOS_IMPL_MATH_UNARY_FUNCTION(log)
187KOKKOS_IMPL_MATH_UNARY_FUNCTION(log10)
188KOKKOS_IMPL_MATH_UNARY_FUNCTION(log2)
189KOKKOS_IMPL_MATH_UNARY_FUNCTION(log1p)
191KOKKOS_IMPL_MATH_UNARY_FUNCTION(sin)
192KOKKOS_IMPL_MATH_UNARY_FUNCTION(cos)
193KOKKOS_IMPL_MATH_UNARY_FUNCTION(tan)
194KOKKOS_IMPL_MATH_UNARY_FUNCTION(asin)
195KOKKOS_IMPL_MATH_UNARY_FUNCTION(acos)
196KOKKOS_IMPL_MATH_UNARY_FUNCTION(atan)
197KOKKOS_IMPL_MATH_BINARY_FUNCTION(atan2)
199KOKKOS_IMPL_MATH_UNARY_FUNCTION(sinh)
200KOKKOS_IMPL_MATH_UNARY_FUNCTION(cosh)
201KOKKOS_IMPL_MATH_UNARY_FUNCTION(tanh)
202KOKKOS_IMPL_MATH_UNARY_FUNCTION(asinh)
203KOKKOS_IMPL_MATH_UNARY_FUNCTION(acosh)
204KOKKOS_IMPL_MATH_UNARY_FUNCTION(atanh)
206KOKKOS_IMPL_MATH_UNARY_FUNCTION(erf)
207KOKKOS_IMPL_MATH_UNARY_FUNCTION(erfc)
208KOKKOS_IMPL_MATH_UNARY_FUNCTION(tgamma)
209KOKKOS_IMPL_MATH_UNARY_FUNCTION(lgamma)
211KOKKOS_IMPL_MATH_UNARY_FUNCTION(ceil)
212KOKKOS_IMPL_MATH_UNARY_FUNCTION(floor)
213KOKKOS_IMPL_MATH_UNARY_FUNCTION(trunc)
214#ifndef KOKKOS_ENABLE_SYCL
215KOKKOS_IMPL_MATH_UNARY_FUNCTION(nearbyint)
218KOKKOS_IMPL_MATH_UNARY_PREDICATE(isfinite)
219KOKKOS_IMPL_MATH_UNARY_PREDICATE(isinf)
220KOKKOS_IMPL_MATH_UNARY_PREDICATE(isnan)
222#undef KOKKOS_IMPL_UNARY_FUNCTION_FLOATING_POINT
223#undef KOKKOS_IMPL_UNARY_FUNCTION_INTEGRAL
224#undef KOKKOS_IMPL_BINARY_FUNCTION_FLOATING_POINT
225#undef KOKKOS_IMPL_BINARY_FUNCTION_ARITHMETIC
226#undef KOKKOS_IMPL_MATH_UNARY_FUNCTION
227#undef KOKKOS_IMPL_MATH_UNARY_PREDICATE
228#undef KOKKOS_IMPL_MATH_BINARY_FUNCTION
229#undef KOKKOS_IMPL_MATH_NAN