45 #ifndef KOKKOS_MATHEMATICAL_FUNCTIONS_HPP
46 #define KOKKOS_MATHEMATICAL_FUNCTIONS_HPP
48 #include <Kokkos_Macros.hpp>
51 #include <type_traits>
53 #ifdef KOKKOS_ENABLE_SYCL
54 #include <CL/sycl.hpp>
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*)
168 KOKKOS_IMPL_MATH_UNARY_FUNCTION(fabs)
169 KOKKOS_IMPL_MATH_BINARY_FUNCTION(fmod)
170 KOKKOS_IMPL_MATH_BINARY_FUNCTION(remainder)
171 KOKKOS_IMPL_MATH_BINARY_FUNCTION(fmin)
172 KOKKOS_IMPL_MATH_BINARY_FUNCTION(fmax)
173 KOKKOS_IMPL_MATH_BINARY_FUNCTION(fdim)
174 #ifndef KOKKOS_ENABLE_SYCL
175 KOKKOS_IMPL_MATH_NAN()
178 KOKKOS_IMPL_MATH_BINARY_FUNCTION(pow)
179 KOKKOS_IMPL_MATH_UNARY_FUNCTION(sqrt)
180 KOKKOS_IMPL_MATH_UNARY_FUNCTION(cbrt)
181 KOKKOS_IMPL_MATH_BINARY_FUNCTION(hypot)
183 KOKKOS_IMPL_MATH_UNARY_FUNCTION(exp)
184 KOKKOS_IMPL_MATH_UNARY_FUNCTION(exp2)
185 KOKKOS_IMPL_MATH_UNARY_FUNCTION(expm1)
186 KOKKOS_IMPL_MATH_UNARY_FUNCTION(log)
187 KOKKOS_IMPL_MATH_UNARY_FUNCTION(log10)
188 KOKKOS_IMPL_MATH_UNARY_FUNCTION(log2)
189 KOKKOS_IMPL_MATH_UNARY_FUNCTION(log1p)
191 KOKKOS_IMPL_MATH_UNARY_FUNCTION(sin)
192 KOKKOS_IMPL_MATH_UNARY_FUNCTION(cos)
193 KOKKOS_IMPL_MATH_UNARY_FUNCTION(tan)
194 KOKKOS_IMPL_MATH_UNARY_FUNCTION(asin)
195 KOKKOS_IMPL_MATH_UNARY_FUNCTION(acos)
196 KOKKOS_IMPL_MATH_UNARY_FUNCTION(atan)
197 KOKKOS_IMPL_MATH_BINARY_FUNCTION(atan2)
199 KOKKOS_IMPL_MATH_UNARY_FUNCTION(sinh)
200 KOKKOS_IMPL_MATH_UNARY_FUNCTION(cosh)
201 KOKKOS_IMPL_MATH_UNARY_FUNCTION(tanh)
202 KOKKOS_IMPL_MATH_UNARY_FUNCTION(asinh)
203 KOKKOS_IMPL_MATH_UNARY_FUNCTION(acosh)
204 KOKKOS_IMPL_MATH_UNARY_FUNCTION(atanh)
206 KOKKOS_IMPL_MATH_UNARY_FUNCTION(erf)
207 KOKKOS_IMPL_MATH_UNARY_FUNCTION(erfc)
208 KOKKOS_IMPL_MATH_UNARY_FUNCTION(tgamma)
209 KOKKOS_IMPL_MATH_UNARY_FUNCTION(lgamma)
211 KOKKOS_IMPL_MATH_UNARY_FUNCTION(ceil)
212 KOKKOS_IMPL_MATH_UNARY_FUNCTION(floor)
213 KOKKOS_IMPL_MATH_UNARY_FUNCTION(trunc)
214 #ifndef KOKKOS_ENABLE_SYCL
215 KOKKOS_IMPL_MATH_UNARY_FUNCTION(nearbyint)
218 KOKKOS_IMPL_MATH_UNARY_PREDICATE(isfinite)
219 KOKKOS_IMPL_MATH_UNARY_PREDICATE(isinf)
220 KOKKOS_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