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
57namespace Kokkos {
58namespace 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
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()
176#endif
177// Power functions
178KOKKOS_IMPL_MATH_BINARY_FUNCTION(pow)
179KOKKOS_IMPL_MATH_UNARY_FUNCTION(sqrt)
180KOKKOS_IMPL_MATH_UNARY_FUNCTION(cbrt)
181KOKKOS_IMPL_MATH_BINARY_FUNCTION(hypot)
182// Exponential functions
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)
190// Trigonometric functions
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)
198// Hyperbolic functions
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)
205// Error and gamma functions
206KOKKOS_IMPL_MATH_UNARY_FUNCTION(erf)
207KOKKOS_IMPL_MATH_UNARY_FUNCTION(erfc)
208KOKKOS_IMPL_MATH_UNARY_FUNCTION(tgamma)
209KOKKOS_IMPL_MATH_UNARY_FUNCTION(lgamma)
210// Nearest integer floating point operations
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)
216#endif
217// Classification and comparison
218KOKKOS_IMPL_MATH_UNARY_PREDICATE(isfinite)
219KOKKOS_IMPL_MATH_UNARY_PREDICATE(isinf)
220KOKKOS_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