1 // This file is part of OpenCV project.
2 // It is subject to the license terms in the LICENSE file found in the top-level directory
3 // of this distribution and at http://opencv.org/license.html.
5 #ifndef OPENCV_DNN_SRC_CUDA_MATH_HPP
6 #define OPENCV_DNN_SRC_CUDA_MATH_HPP
8 #include <cuda_runtime.h>
11 namespace cv { namespace dnn { namespace cuda4dnn { namespace csl { namespace device {
13 template <class T> __device__ T abs(T val) { return (val < T(0) ? -val : val); }
14 template <> inline __device__ __half2 abs(__half2 val) {
19 template <> inline __device__ float abs(float val) { return fabsf(val); }
20 template <> inline __device__ double abs(double val) { return fabs(val); }
22 template <class T> __device__ T exp(T val);
23 template <> inline __device__ __half exp(__half val) { return hexp(val); }
24 template <> inline __device__ __half2 exp(__half2 val) { return h2exp(val); }
25 template <> inline __device__ float exp(float val) { return expf(val); }
26 template <> inline __device__ double exp(double val) { return ::exp(val); }
28 template <class T> __device__ T expm1(T val);
29 template <> inline __device__ __half expm1(__half val) { return hexp(val) + __half(1); }
30 template <> inline __device__ __half2 expm1(__half2 val) { return h2exp(val) + __half2(1, 1); }
31 template <> inline __device__ float expm1(float val) { return expm1f(val); }
32 template <> inline __device__ double expm1(double val) { return ::expm1(val); }
34 template <class T> __device__ T max(T x, T y) { return (x > y ? x : y); }
35 template <> inline __device__ __half2 max(__half2 a, __half2 b) {
40 template <> inline __device__ float max(float x, float y) { return fmaxf(x, y); }
41 template <> inline __device__ double max(double x, double y) { return fmax(x, y); }
43 template <class T> __device__ T min(T x, T y) { return (x > y ? y : x); }
44 template <> inline __device__ __half2 min(__half2 a, __half2 b) {
49 template <> inline __device__ float min(float x, float y) { return fminf(x, y); }
50 template <> inline __device__ double min(double x, double y) { return fmin(x, y); }
52 template <class T> __device__ T log1p(T val);
53 template <> inline __device__ __half log1p(__half val) { return hlog(val) + __half(1); }
54 template <> inline __device__ __half2 log1p(__half2 val) { return h2log(val) + __half2(1, 1); }
55 template <> inline __device__ float log1p(float val) { return log1pf(val); }
57 template <class T> __device__ T log1pexp(T val);
58 template <> inline __device__ __half log1pexp(__half val) {
59 if (val <= __half(-4.0))
61 else if (val <= __half(8.0))
62 return log1p(exp(val));
63 else if (val <= __half(8.7))
64 return val + exp(-val);
68 template <> inline __device__ __half2 log1pexp(__half2 val) {
69 val.x = log1pexp(val.x);
70 val.y = log1pexp(val.y);
73 template <> inline __device__ float log1pexp(float val) {
77 return log1pf(expf(val));
79 return val + exp(-val);
83 template <> inline __device__ double log1pexp(double val) {
87 return log1p(exp(val));
89 return val + exp(-val);
94 template <class T> __device__ T tanh(T val);
95 template <> inline __device__ __half tanh(__half val) { return tanhf(val); }
96 template <> inline __device__ __half2 tanh(__half2 val) { return __half2(tanh(val.x), tanh(val.y)); }
97 template <> inline __device__ float tanh(float val) { return tanhf(val); }
98 template <> inline __device__ double tanh(double val) { return ::tanh(val); }
100 template <class T> __device__ T pow(T val, T exp);
101 template <> inline __device__ __half pow(__half val, __half exp) { return powf(val, exp); }
102 template <> inline __device__ __half2 pow(__half2 val, __half2 exp) { return __half2(pow(val.x, exp.x), pow(val.y, exp.y)); }
103 template <> inline __device__ float pow(float val, float exp) { return powf(val, exp); }
104 template <> inline __device__ double pow(double val, double exp) { return ::pow(val, exp); }
106 template <class T> __device__ T sqrt(T val);
107 template <> inline __device__ __half sqrt(__half val) { return hsqrt(val); }
108 template <> inline __device__ __half2 sqrt(__half2 val) { return h2sqrt(val); }
109 template <> inline __device__ float sqrt(float val) { return sqrtf(val); }
110 template <> inline __device__ double sqrt(double val) { return ::sqrt(val); }
112 template <class T> __device__ T rsqrt(T val);
113 template <> inline __device__ __half rsqrt(__half val) { return hrsqrt(val); }
114 template <> inline __device__ __half2 rsqrt(__half2 val) { return h2rsqrt(val); }
115 template <> inline __device__ float rsqrt(float val) { return rsqrtf(val); }
116 template <> inline __device__ double rsqrt(double val) { return ::rsqrt(val); }
118 template <class T> __device__ T sigmoid(T val) { return T(1) / (T(1) + exp(-val)); }
119 template <> inline __device__ __half2 sigmoid(__half2 val) { return __half2(1, 1) / (__half2(1, 1) + exp(__hneg2(val))); }
121 template <class T> __device__ T clamp(T value, T lower, T upper) { return min(max(value, lower), upper); }
123 }}}}} /* namespace cv::dnn::cuda4dnn::csl::device */
125 #endif /* OPENCV_DNN_SRC_CUDA_MATH_HPP */