Add caffe_gpu_exp math function
authorJeff Donahue <jeff.donahue@gmail.com>
Thu, 2 Oct 2014 06:11:41 +0000 (23:11 -0700)
committerJeff Donahue <jeff.donahue@gmail.com>
Thu, 2 Oct 2014 21:52:19 +0000 (14:52 -0700)
include/caffe/util/math_functions.hpp
src/caffe/util/math_functions.cu

index 62467fb..a78eb5b 100644 (file)
@@ -206,6 +206,9 @@ template <typename Dtype>
 void caffe_gpu_abs(const int n, const Dtype* a, Dtype* y);
 
 template <typename Dtype>
+void caffe_gpu_exp(const int n, const Dtype* a, Dtype* y);
+
+template <typename Dtype>
 void caffe_gpu_powx(const int n, const Dtype* a, const Dtype b, Dtype* y);
 
 // caffe_gpu_rng_uniform with two arguments generates integers in the range
index 4ae4bba..43e65eb 100644 (file)
@@ -304,6 +304,27 @@ void caffe_gpu_abs<double>(const int N, const double* a, double* y) {
 
 
 template <typename Dtype>
+__global__ void exp_kernel(const int n, const Dtype* a, Dtype* y) {
+  CUDA_KERNEL_LOOP(index, n) {
+    y[index] = exp(a[index]);
+  }
+}
+
+template <>
+void caffe_gpu_exp<float>(const int N, const float* a, float* y) {
+  // NOLINT_NEXT_LINE(whitespace/operators)
+  exp_kernel<float><<<CAFFE_GET_BLOCKS(N), CAFFE_CUDA_NUM_THREADS>>>(
+      N, a, y);
+}
+
+template <>
+void caffe_gpu_exp<double>(const int N, const double* a, double* y) {
+  // NOLINT_NEXT_LINE(whitespace/operators)
+  exp_kernel<double><<<CAFFE_GET_BLOCKS(N), CAFFE_CUDA_NUM_THREADS>>>(
+      N, a, y);
+}
+
+template <typename Dtype>
 __global__ void powx_kernel(const int n, const Dtype* a,
     const Dtype alpha, Dtype* y) {
   CUDA_KERNEL_LOOP(index, n) {