cudacaffe

error: function "atomicAdd(double *, double)" has already been defined


I get this error while trying to compile the caffe derivative DeepLab_v2 on Ubuntu 14.04.5 with Cuda 8.0.

Does anyone know how to solve this?

DeepLab_v2 compiles fine on another computer that has Cuda 7.5, but since in my current computer I have a Pascal Titan X, I probably need to use Cuda 8.0.


Solution

  • I finally got it working with the help of @Robert Crovella's comment. I had to modify the file common.cuh from the DeepLab_v2 master branch in the following way:

    #ifndef CAFFE_COMMON_CUH_
    #define CAFFE_COMMON_CUH_
    
      #include <cuda.h>
    
      #if defined(__CUDA_ARCH__) && __CUDA_ARCH__ < 600
      static __inline__ __device__ double atomicAdd(double *address, double val) {
        unsigned long long int* address_as_ull = (unsigned long long int*)address;
        unsigned long long int old = *address_as_ull, assumed;
        if (val==0.0)
          return __longlong_as_double(old);
        do {
          assumed = old;
          old = atomicCAS(address_as_ull, assumed, __double_as_longlong(val +__longlong_as_double(assumed)));
        } while (assumed != old);
        return __longlong_as_double(old);
      }
      #endif
    
    #endif