2016-09-01 14 views
7

Otrzymuję ten błąd podczas próby skompilowania pochodnej caffe DeepLab_v2 na Ubuntu 14.04.5 z Cuda 8.0.error: funkcja "atomicAdd (double *, double)" została już zdefiniowana

Czy ktoś wie, jak rozwiązać ten problem?

DeepLab_v2 kompiluje dobrze na innym komputerze z Cuda 7.5, ale ponieważ na moim obecnym komputerze mam Pascal Titan X, prawdopodobnie potrzebuję używać Cuda 8.0.

+7

CUDA 8.0 zawiera definicję '' double' atomicAdd' na ilości, że nie był obecny w poprzednich zestawów narzędzi CUDA. Kod, nad którym pracujesz, najwyraźniej zapewnia własną definicję/implementację i jest źródłem komunikatu o błędzie. Poprawna poprawka polega na wprowadzeniu zmian kodu źródłowego w oprogramowaniu, aby był zgodny z CUDA 8. [To pytanie] (http://stackoverflow.com/questions/37566987/cuda-atomicadd-for-doubles-definition-error) mogą być interesujące. –

+1

Hmm, ta odpowiedź jest oznaczona jako poprawna, ale nie jest dla mnie jasne, co należy zrobić. Czy muszę wstawić '#if! Defined (__ CUDA_ARCH__) || __CUDA_ARCH__> = 600 #else __device__ double atomicAdd (double * a, double b) {return b; } # endif' na górze każdego pliku '.cpp' w caffe, który używa funkcji' atomicAdd', a następnie rekompiluje Caffe? Czy masz z tym doświadczenie? – mcExchange

+1

Apparantly to działa, opublikuję pełną modyfikację jako odpowiedź. Dzięki za pomoc! – mcExchange

Odpowiedz

25

W końcu udało mi się to zrobić za pomocą komentarza @Robert Crovella. Musiałem zmodyfikować plik common.cuh od głównego oddziału DeepLab_v2 w następujący sposób:

#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

Co ciekawe, nie miałem nawet pliku 'common.cuh', musiałem go stworzyć, czy tak też było w przypadku Ciebie? –

+0

Nie. Czy używasz caffe lub deeplab? – mcExchange