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

mcExchange picture mcExchange · Sep 1, 2016 · Viewed 7.5k times · Source

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.

Answer

mcExchange picture mcExchange · Sep 2, 2016

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

  #else
  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