2016-09-01 8 views
7

Cuda 8.0を使用してUbuntu 14.04.5でCaffe派生語DeepLab_v2をコンパイルしようとしているときにこのエラーが発生します。エラー:function "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' Caffeの '.cpp'ファイルの上に' atomicAdd'関数を使ってCaffeを再コンパイルしますか?あなたはその経験がありますか? – 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

関連する問題