2016-09-01 20 views
7

Tôi gặp phải lỗi này khi cố gắng biên dịch dẫn xuất caffe DeepLab_v2 trên Ubuntu 14.04.5 với Cuda 8.0.lỗi: chức năng "atomicAdd (double *, double)" đã được xác định

Có ai biết cách giải quyết vấn đề này không?

DeepLab_v2 biên soạn tiền phạt trên một máy tính khác có Cuda 7.5, nhưng vì trong máy tính hiện tại của tôi, tôi có Pascal Titan X, có lẽ tôi cần sử dụng Cuda 8.0.

+7

CUDA 8.0 cung cấp một định nghĩa của 'atomicAdd' trên 'double' lượng đó là không có mặt trong bộ công cụ CUDA trước. Mã bạn đang làm việc cũng dường như cung cấp định nghĩa/triển khai của chính nó và đây là nguồn của thông báo lỗi. Sửa lỗi chính xác là thay đổi mã nguồn cho phần mềm được đề cập để làm cho nó tương thích với CUDA 8. [Câu hỏi này] (http://stackoverflow.com/questions/37566987/cuda-atomicadd-for-doubles-definition-error) có thể được quan tâm. –

+1

Hmm câu trả lời được đánh dấu là chính xác, tuy nhiên nó không rõ ràng với tôi, những gì cần phải được thực hiện. Tôi có phải chèn '#if! Được xác định (__ CUDA_ARCH__) || __CUDA_ARCH__> = 600 #else __device__ double atomicThêm (double * a, double b) {return b; } # endif' trên đầu mỗi tập tin '.cpp' trong caffe sử dụng hàm' atomicAdd' và sau đó biên dịch lại Caffe? Bạn có kinh nghiệm với điều đó không? – mcExchange

+1

Kiểm dịch nó hoạt động, tôi sẽ đăng sửa đổi hoàn chỉnh làm câu trả lời. Cảm ơn bạn đã giúp đỡ! – mcExchange

Trả lời

25

Tôi cuối cùng cũng làm việc với sự trợ giúp của nhận xét của @Robert Crovella. Tôi đã phải sửa đổi các tập tin common.cuh từ chi nhánh chủ DeepLab_v2 theo cách sau:

#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

Điều thú vị là tôi thậm chí không có tập tin 'common.cuh', tôi phải tạo ra nó, đây có phải là trường hợp của bạn không? –

+0

No. Bạn có sử dụng caffe hoặc deeplab không? – mcExchange

Các vấn đề liên quan