Kokkos Core Kernels Package  Version of the Day
Kokkos_MathematicalFunctions.hpp
1 /*
2 //@HEADER
3 // ************************************************************************
4 //
5 // Kokkos v. 3.0
6 // Copyright (2020) National Technology & Engineering
7 // Solutions of Sandia, LLC (NTESS).
8 //
9 // Under the terms of Contract DE-NA0003525 with NTESS,
10 // the U.S. Government retains certain rights in this software.
11 //
12 // Redistribution and use in source and binary forms, with or without
13 // modification, are permitted provided that the following conditions are
14 // met:
15 //
16 // 1. Redistributions of source code must retain the above copyright
17 // notice, this list of conditions and the following disclaimer.
18 //
19 // 2. Redistributions in binary form must reproduce the above copyright
20 // notice, this list of conditions and the following disclaimer in the
21 // documentation and/or other materials provided with the distribution.
22 //
23 // 3. Neither the name of the Corporation nor the names of the
24 // contributors may be used to endorse or promote products derived from
25 // this software without specific prior written permission.
26 //
27 // THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY
28 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
29 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
30 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE
31 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
32 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
33 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
34 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
35 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
36 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
37 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38 //
39 // Questions? Contact Christian R. Trott (crtrott@sandia.gov)
40 //
41 // ************************************************************************
42 //@HEADER
43 */
44 
45 #ifndef KOKKOS_MATHEMATICAL_FUNCTIONS_HPP
46 #define KOKKOS_MATHEMATICAL_FUNCTIONS_HPP
47 
48 #include <Kokkos_Macros.hpp>
49 #include <cmath>
50 #include <algorithm>
51 #include <type_traits>
52 
53 #ifdef KOKKOS_ENABLE_SYCL
54 #include <CL/sycl.hpp>
55 #endif
56 
57 namespace Kokkos {
58 namespace Experimental {
59 
60 #if defined(KOKKOS_ENABLE_SYCL)
61 #define NAMESPACE_MATH_FUNCTIONS sycl
62 #else
63 #define NAMESPACE_MATH_FUNCTIONS std
64 #endif
65 
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; \
69  return FUNC(x); \
70  }
71 
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)); \
77  }
78 
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; \
82  return FUNC(x, y); \
83  }
84 
85 // NOTE long double overloads are not available on the device
86 #if defined(KOKKOS_ENABLE_CUDA) || defined(KOKKOS_ENABLE_HIP) || \
87  defined(KOKKOS_ENABLE_SYCL) || defined(KOKKOS_ENABLE_OPENMPTARGET)
88 
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)); \
102  }
103 
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)
108 
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)
113 
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)
118 
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*)
122 
123 #else // long double overloads are available
124 
125 #define KOKKOS_IMPL_BINARY_FUNCTION_ARITHMETIC(FUNC) \
126  template <typename Arithmetic1, typename Arithmetic2, \
127  typename = \
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)); \
140  }
141 
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)
147 
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)
153 
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)
159 
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*)
164 
165 #endif
166 
167 // Basic operations
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()
176 #endif
177 // Power functions
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)
182 // Exponential functions
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)
190 // Trigonometric functions
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)
198 // Hyperbolic functions
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)
205 // Error and gamma functions
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)
210 // Nearest integer floating point operations
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)
216 #endif
217 // Classification and comparison
218 KOKKOS_IMPL_MATH_UNARY_PREDICATE(isfinite)
219 KOKKOS_IMPL_MATH_UNARY_PREDICATE(isinf)
220 KOKKOS_IMPL_MATH_UNARY_PREDICATE(isnan)
221 
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
230 } // namespace Experimental
231 } // namespace Kokkos
232 
233 #endif
Definition: dummy.cpp:3