1 // This file is part of Eigen, a lightweight C++ template library 2 // for linear algebra. 3 // 4 // Copyright (C) 2014 Benoit Steiner <benoit.steiner.goog (at) gmail.com> 5 // 6 // This Source Code Form is subject to the terms of the Mozilla 7 // Public License v. 2.0. If a copy of the MPL was not distributed 8 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/. 9 10 #ifndef EIGEN_MATH_FUNCTIONS_CUDA_H 11 #define EIGEN_MATH_FUNCTIONS_CUDA_H 12 13 namespace Eigen { 14 15 namespace internal { 16 17 // Make sure this is only available when targeting a GPU: we don't want to 18 // introduce conflicts between these packet_traits definitions and the ones 19 // we'll use on the host side (SSE, AVX, ...) 20 #if defined(__CUDACC__) && defined(EIGEN_USE_GPU) 21 template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE 22 float4 plog<float4>(const float4& a) 23 { 24 return make_float4(logf(a.x), logf(a.y), logf(a.z), logf(a.w)); 25 } 26 27 template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE 28 double2 plog<double2>(const double2& a) 29 { 30 using ::log; 31 return make_double2(log(a.x), log(a.y)); 32 } 33 34 template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE 35 float4 plog1p<float4>(const float4& a) 36 { 37 return make_float4(log1pf(a.x), log1pf(a.y), log1pf(a.z), log1pf(a.w)); 38 } 39 40 template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE 41 double2 plog1p<double2>(const double2& a) 42 { 43 return make_double2(log1p(a.x), log1p(a.y)); 44 } 45 46 template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE 47 float4 pexp<float4>(const float4& a) 48 { 49 return make_float4(expf(a.x), expf(a.y), expf(a.z), expf(a.w)); 50 } 51 52 template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE 53 double2 pexp<double2>(const double2& a) 54 { 55 using ::exp; 56 return make_double2(exp(a.x), exp(a.y)); 57 } 58 59 template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE 60 float4 psqrt<float4>(const float4& a) 61 { 62 return make_float4(sqrtf(a.x), sqrtf(a.y), sqrtf(a.z), sqrtf(a.w)); 63 } 64 65 template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE 66 double2 psqrt<double2>(const double2& a) 67 { 68 using ::sqrt; 69 return make_double2(sqrt(a.x), sqrt(a.y)); 70 } 71 72 template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE 73 float4 prsqrt<float4>(const float4& a) 74 { 75 return make_float4(rsqrtf(a.x), rsqrtf(a.y), rsqrtf(a.z), rsqrtf(a.w)); 76 } 77 78 template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE 79 double2 prsqrt<double2>(const double2& a) 80 { 81 return make_double2(rsqrt(a.x), rsqrt(a.y)); 82 } 83 84 85 #endif 86 87 } // end namespace internal 88 89 } // end namespace Eigen 90 91 #endif // EIGEN_MATH_FUNCTIONS_CUDA_H 92