마침내 @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
CUDA 8.0 '이전 CUDA 툴킷에 존재하지 않았다 수량을 double'에 atomicAdd''의 정의를 제공합니다. 함께 작업하는 코드는 자체적으로 정의/구현을 제공하며 이는 오류 메시지의 소스입니다. 올바른 수정 프로그램은 CUDA 8과 호환되도록 문제의 소프트웨어 소스 코드를 변경하는 것입니다. [이 질문에] (http://stackoverflow.com/questions/37566987/cuda-atomicadd-for-doubles-definition-error) 관심있을 수 있습니다. –
흠 그 대답은 옳은 것으로 표시되어 있지만, 분명히 나에게 분명하지는 않다. '#if! defined (__ CUDA_ARCH__) ||를 삽입해야합니까? __CUDA_ARCH__> = 600 #else __device__ double atomicAdd (double * a, double b) {return b; } # endif''atomicAdd' 함수를 사용하고 Caffe를 다시 컴파일하는 caffe의 모든 '.cpp' 파일 맨 위에? 당신은 그 경험이 있습니까? – mcExchange
Apparantly 그것이 작동합니까, 나는 답변으로 전체 수정을 게시 할 것입니다. 당신의 도움을 주셔서 감사합니다! – mcExchange