2016-09-01 2 views
7

Cuda 8.0을 사용하여 우분투 14.04.5에서 caffe derivative DeepLab_v2을 컴파일하는 동안이 오류가 발생합니다.오류 : "atomicAdd (double *, double)"함수가 이미 정의되었습니다.

누구든지 해결 방법을 알고 있습니까?

DeepLab_v2는 Cuda 7.5가있는 다른 컴퓨터에서 제대로 컴파일되지만, 현재 컴퓨터에는 Pascal Titan X가 있으므로 Cuda 8.0을 사용해야 할 수도 있습니다.

+7

CUDA 8.0 '이전 CUDA 툴킷에 존재하지 않았다 수량을 double'에 atomicAdd''의 정의를 제공합니다. 함께 작업하는 코드는 자체적으로 정의/구현을 제공하며 이는 오류 메시지의 소스입니다. 올바른 수정 프로그램은 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''atomicAdd' 함수를 사용하고 Caffe를 다시 컴파일하는 caffe의 모든 '.cpp' 파일 맨 위에? 당신은 그 경험이 있습니까? – mcExchange

+1

Apparantly 그것이 작동합니까, 나는 답변으로 전체 수정을 게시 할 것입니다. 당신의 도움을 주셔서 감사합니다! – mcExchange

답변

25

마침내 @Robert Crovella의 의견으로 도움을 얻었습니다. 나는 다음과 같은 방법으로 DeepLab_v2 마스터 지점에서 파일 common.cuh을 수정했다 :

#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

번호 caffe 또는 deeplab을 사용합니까? – mcExchange