2016-09-01 23 views
7

परिभाषित किया गया है मुझे Cuda 8.0 के साथ उबंटू 14.04.5 पर कैफे व्युत्पन्न DeepLab_v2 संकलित करने का प्रयास करते समय यह त्रुटि मिलती है।त्रुटि: फ़ंक्शन "atomicAdd (डबल *, डबल)" को पहले से ही

क्या कोई इसे हल करने के बारे में जानता है?

दीपलाब_वी 2 दूसरे कंप्यूटर पर ठीक है, जिसमें कुडा 7.5 है, लेकिन जब से मेरे वर्तमान कंप्यूटर में मेरे पास पास्कल टाइटन एक्स है, तो मुझे शायद कुडा 8.0 का उपयोग करने की आवश्यकता है।

+7

CUDA 8.0 पर 'मात्रा है कि पिछले CUDA उपकरणकिटें में मौजूद नहीं थे double'' atomicAdd' की एक परिभाषा प्रदान करता है। जिस कोड के साथ आप काम कर रहे हैं वह स्पष्ट रूप से अपनी परिभाषा/कार्यान्वयन प्रदान करता है, और यह त्रुटि संदेश का स्रोत है। सही फिक्स यह है कि इसे कोड में सॉफ़्टवेयर में स्रोत कोड में परिवर्तन करना है ताकि इसे CUDA 8 के साथ संगत बनाया जा सके। [यह प्रश्न] (http://stackoverflow.com/questions/37566987/cuda-atomicadd-for-doubles-definition-error) ब्याज का हो सकता है। –

+1

हम्म कि उत्तर सही के रूप में चिह्नित किया गया है, हालांकि यह मेरे लिए क्रिस्टल स्पष्ट नहीं है, क्या करने की आवश्यकता है। क्या मुझे '#if! परिभाषित करना है (__ CUDA_ARCH__) || __CUDA_ARCH__> = 600 #else __device__ डबल परमाणु जोड़ें (डबल * ए, डबल बी) {वापसी बी; } # endif' कैफी में प्रत्येक '.cpp' फ़ाइल के शीर्ष पर जो' atomicAdd' फ़ंक्शन का उपयोग करता है और फिर कैफे को फिर से संकलित करता है? क्या आपके पास इसका अनुभव है? – mcExchange

+1

यह काम करता है, मैं एक पूर्ण जवाब को एक उत्तर के रूप में पोस्ट करूंगा। आपकी सहायताके लिए धन्यवाद! – mcExchange

उत्तर

25

अंतत: मैं इसे @ रॉबर्ट क्रोवेला की टिप्पणी की सहायता से काम कर रहा हूं। मैं निम्नलिखित तरीके से 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

नहीं। क्या आप कैफे या डीप्लाब का उपयोग करते हैं? – mcExchange

संबंधित मुद्दे