2016-09-01 3 views
7

Я получаю эту ошибку при попытке скомпилировать производное caffe DeepLab_v2 на Ubuntu 14.04.5 с Cuda 8.0.Ошибка: функция «atomicAdd (double *, double)» уже определена

Кто-нибудь знает, как это решить?

DeepLab_v2 компилируется на другом компьютере с Cuda 7.5, но поскольку на моем текущем компьютере у меня есть Pascal Titan X, мне, вероятно, нужно использовать Cuda 8.0.

+7

CUDA 8.0 обеспечивает определение '' atomicAdd' на double' количеств, которые не присутствовали в предыдущей CUDA инструментарии. Код, с которым вы работаете, также, по-видимому, обеспечивает собственное определение/реализацию, и это является источником сообщения об ошибке. Правильное исправление заключается в том, чтобы внести исправления исходного кода в соответствующее программное обеспечение, чтобы сделать его совместимым с CUDA 8. [Этот вопрос] (http://stackoverflow.com/questions/37566987/cuda-atomicadd-for-doubles-definition-error) может представлять интерес. –

+1

Хм, этот ответ отмечен как правильный, однако мне не ясно, что нужно сделать. Должен ли я вставлять '#if! Defined (__ CUDA_ARCH__) || __CUDA_ARCH__> = 600 #else __device__ double atomicAdd (double * a, double b) {return b; } # endif' поверх каждого файла '.cpp' в caffe, который использует функцию' atomicAdd', а затем перекомпилирует Caffe? У вас есть опыт? – mcExchange

+1

Очевидно, это действительно работает, я отправлю полную модификацию в качестве ответа. Спасибо за вашу помощь! – mcExchange

ответ

25

Я, наконец, получил работу с помощью комментария @Robert Crovella. Я должен был изменить файл common.cuh из главной ветви DeepLab_v2 следующим образом:

#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 
+0

Интересно, что у меня даже не было файла 'common.cuh', мне нужно было его создать, так ли это было для вас? –

+0

Нет. Используете ли вы кофе или деплан? – mcExchange

Смежные вопросы