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*) 123 #else // long double overloads are available 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