2015-03-18 8 views
11

के साथ मुझे सीएमडीए कोड को संकलित करने में समस्याएं हैं। मैं CUDA 7 उपयोग कर रहा हूँ और NVCC से संस्करण जानकारी इस प्रकार है: इस प्रकारसीएमडीए संकलन मुद्दे सीएमके

nvcc: NVIDIA (R) Cuda compiler driver 
Copyright (c) 2005-2014 NVIDIA Corporation 
Built on Tue_Dec__9_18:10:46_CST_2014 
Cuda compilation tools, release 7.0, V7.0.17 

मेरे CMake फ़ाइल find_cuda मैक्रो का उपयोग करता है:

find_package(CUDA) 
if(CUDA_FOUND) 
    list(APPEND CUDA_NVCC_FLAGS "-arch=sm_20;--compiler-options;-std=c++11;-O2;-DVERBOSE") 
endif(CUDA_FOUND) 

मैं एसटीडी = C++ 11 संकलक झंडा जोड़ा कई पदों के बाद सुझाव दिया गया कि इसकी आवश्यकता थी। हालांकि, मुझे इस ध्वज के साथ या उसके बिना बिल्कुल वही त्रुटियां मिलती हैं।

मैंने एनवीसीसी संकलन झंडे से सी ++ 11 समर्थन को हटाने के लिए निम्नलिखित भी जोड़ा, लेकिन यह कुछ भी नहीं बदलता है। इस प्रकार

if(CMAKE_COMPILER_IS_GNUCC) 
    string(REPLACE "-std=c++11" "" CUDA_HOST_FLAGS "${CUDA_HOST_FLAGS}") 
    string(REPLACE "-std=c++0x" "" CUDA_HOST_FLAGS "${CUDA_HOST_FLAGS}") 
endif(CMAKE_COMPILER_IS_GNUCC) 

त्रुटियों मैं कर रहे हैं:

/usr/lib/gcc/x86_64-linux-gnu/4.8/include/stddef.h(432): error: identifier "nullptr" is undefined 

/usr/lib/gcc/x86_64-linux-gnu/4.8/include/stddef.h(432): error: expected 
a ";" 

/usr/include/x86_64-linux-gnu/c++/4.8/bits/c++config.h(190): error: 
expected a ";" 

/usr/include/c++/4.8/exception(63): error: expected a ";" 

/usr/include/c++/4.8/exception(68): error: expected a ";" 

/usr/include/c++/4.8/exception(76): error: expected a ";" 

/usr/include/c++/4.8/exception(83): error: expected a ";" 

/usr/include/c++/4.8/exception(93): error: expected a "{" 

/usr/include/c++/4.8/bits/exception_ptr.h(64): error: function 
"std::current_exception" returns incomplete type 
"std::__exception_ptr::exception_ptr" 

मैं जीसीसी 4.8 का उपयोग कर रहा है, लेकिन साथ ही 4.7 के साथ एक ही त्रुटियों मिलता है। मैं cmake 2.8.12.2 पर हूँ।

CMake वर्बोज़ साथ संकलन देता NVCC संकलन के लिए निम्नलिखित झंडे:

/usr/local/cuda-7.0/bin/nvcc /home/xargon/Dropbox/code/gpu-mosaicing 
/src/gpu/kernels/bgra_2_gray.cu -c -o /home/xargon/code/mosaicing_bin 
/gpu/kernels/CMakeFiles/kernels.dir//./kernels_generated_bgra_2_gray.cu.o 
-ccbin /usr/bin/cc -m64 -DUSE_CUDA -DUSE_OPENCV -DUSE_QT -Xcompiler 
,\"-std=c++11\",\"-O3\",\"-DNDEBUG\" -arch=sm_20 --compiler-options 
-std=c++11 -O2 -DVERBOSE -DNVCC -I/usr/local/cuda-7.0/include -I/usr/local 
/include/opencv -I/usr/local/include -I/home/xargon/Dropbox/code/gpu- 
mosaicing/src/cpu/gui/qt -I/usr/include -I/home/xargon/Dropbox/code/gpu- 
mosaicing/src/cpu/core -I/home/xargon/Dropbox/code/gpu-mosaicing/src/cpu 
/datasources -I/home/xargon/Dropbox/code/gpu-mosaicing/src/gpu 
/intraoperability -I/home/xargon/Dropbox/code/gpu-mosaicing/src/utils 
-I/usr/local/cuda-7.0/include 
+0

तो, मैं मिलता है: /bgra_2_gray .cu -c -o /home/xargon/code/mosaicing_bin/gpu/kernels/CMakeFiles/kernels.dir//./kernels_generated_bgra_2_gray.cu।o -ccbin/usr/bin/cc-m64 -DUSE_CUDA -DUSE_OPENCV -DUSE_QT -Xcompiler, \ "- std = C++ 11 \", \ "- O3 \", \ "- DNDEBUG \" -arch = sm_20 - -compiler-options -std = C++ 11 -O2 -DVERBOSE -DNVCC – Luca

+1

यह Xcompiler सामान सादा बेवकूफ है। आप pass -std = C++ 11 पास करते हैं, इसलिए यह कोई समस्या नहीं है। – usr1234567

+0

ठीक है, इसलिए समस्या वास्तव में std = C++ 11 ध्वज को निकालना था। इसलिए, मुझे CUDA_PROPAGATE_HOST_FLAGS को बंद करना पड़ा। हालांकि, मैंने सोचा कि क्यूडा 7 सी ++ 11 फीचर्स का समर्थन करता है और मैं सोच रहा था कि क्या हो रहा है। – Luca

उत्तर

17

यह मेरे लिए काम किया CUDA 7, जीसीसी 4.8.2 और 3.0.2 CMake का उपयोग कर।

मैं कोड अद्यतन और यह स्पष्ट करना आप

CMakeLists.txt

project(cpp11) 
find_package(CUDA) 
list(APPEND CUDA_NVCC_FLAGS "-arch=sm_20;-std=c++11;-O2;-DVERBOSE") 
SET(CUDA_PROPAGATE_HOST_FLAGS OFF) 
CUDA_ADD_EXECUTABLE(cpp11 main.cpp test.h test.cu) 

CUDA कोड में सी ++ 11 उपयोग कर सकते हैं कि एक साधारण जोर आधारित उदाहरण जोड़ा test.h

#ifndef TEST_H 
#define TEST_H 
int run(); 
#endif 

test.cu

#include "test.h" 
#include <thrust/device_vector.h> 
#include <thrust/reduce.h> 
#include <thrust/sequence.h> 

template<typename T> 
struct Fun 
{ 
     __device__ T operator()(T t1, T t2) 
     { 
      auto result = t1+t2; 
      return result; 
     } 
}; 

int run() 
{ 
    const int N = 100; 
    thrust::device_vector<int> vec(N); 
    thrust::sequence(vec.begin(),vec.end()); 
    auto op = Fun<int>(); 
    return thrust::reduce(vec.begin(),vec.end(),0,op); 
} 

main.cpp

#include <iostream> 
#include "test.h" 

int main() 
{ 
    std::cout << run() << std::endl; 
    return 0; 
} 
+0

यह सी ++ फाइलों में ठीक है। मैं CUDA में C++ 11 सुविधाओं का उपयोग नहीं कर सकता .... – Luca

+1

आप * CUDA में C++ 11 का उपयोग कर सकते हैं, कृपया विस्तार उदाहरण का प्रयास करें। –

+0

आप सही हैं। यह संस्करण ठीक काम करता है। मेरे सीएमकेलिस्ट में सी ++ 11 पहचान होना चाहिए जो कुछ अजीब कर रहा है। हालांकि इसके लिए धन्यवाद। मैं अब इसे हल करने में सक्षम होना चाहिए। – Luca

9

list(APPEND CUDA_NVCC_FLAGS "-std=c++11") पर्याप्त है, SET(CUDA_PROPAGATE_HOST_FLAGS OFF) आवश्यक नहीं हो सकता, और यह मेरे कारण .cu फ़ाइल में ब्रेकपाइंट सेट नहीं कर सका

+1

यही वह है जो मैंने उपयोग किया, और यह काम किया। –

+0

इससे मुझे कई जटिल निर्भरताओं के साथ एक परियोजना में भी मदद मिली। अगर मैंने आम तौर पर मेजबान झंडे को प्रचारित किया है, तो मेरा कोड नहीं बनाया जाएगा। यह अजीब बात है, क्योंकि मेरे "नियमित" होस्ट कोड में सी ++ 11 सामान हैं ... –

3

यदि जेनोइल सीपीपी-एथेरियम को एथेरियम सीयूडीए खनन के लिए संकलित करने के तरीके की खोज करते समय इस प्रश्न में ठोकर खाई गई, तो मेरी समस्या सीपीपी में सीएमके लिस्ट्सटीटीटी फ़ाइल को संपादित करके हल की गई थी। -टेरियम/libethash-cuda फ़ोल्डर।

यह कहाँ राज्यों:

set(CUDA_NVCC_FLAGS 
${CUDA_NVCC_FLAGS}; 
-gencode etc etc) 

ऐड "-std = C++ 11" सेमी-कोलन के बाद, इस प्रकार है: निम्नलिखित

set(CUDA_NVCC_FLAGS 
${CUDA_NVCC_FLAGS}; 
-std=c++11 
-gencode etc etc)