2015-03-18 2 views
11

У меня возникли проблемы с компиляцией кода CUDA с CMake. Я использую CUDA 7 и информация о версии из NVCC выглядит следующим образом:Проблема компиляции CUDA с CMake

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 компилятора зОго после того, как многие сообщения предложили, что это необходимо. Тем не менее, я получаю точно такие же ошибки с этим флагом или без него.

Я также добавил следующее, чтобы удалить поддержку C++ 11 из флагов компиляции nvcc, но это тоже ничего не меняет.

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" 

Я использую GCC 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 довольно глупый. Вы проходите -std = C++ 11, так что это не проблема. – usr1234567

+0

Итак, проблема заключалась в том, чтобы удалить флаг std = C++ 11. Итак, я должен был установить CUDA_PROPAGATE_HOST_FLAGS в положение OFF. Однако я думал, что Cuda 7 поддерживает функции C++ 11, и мне было интересно, что происходит. – Luca

ответ

17

Это работает для меня с помощью CUDA 7, GCC 4.8.2 и CMake 3.0.2.

Я обновил код и добавил простой тяги на основе примера, чтобы понять, что вы можете использовать C++ 11 в CUDA кода

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) 

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

Это хорошо в файлах на C++. Я не могу использовать возможности C++ 11 в CUDA .... – Luca

+1

Вы * можете * использовать C++ 11 в CUDA, попробуйте пример расширения. –

+0

Вы правы. Эта версия отлично работает. В моих CMakeLists должно быть обнаружение C++ 11, которое делает что-то странное. Спасибо за это. Теперь я смогу разобраться. – Luca

9

list(APPEND CUDA_NVCC_FLAGS "-std=c++11") достаточно, SET(CUDA_PROPAGATE_HOST_FLAGS OFF) может быть не нужно, и это причина мне не удалось установить точку останова в файле .CU

+1

Это то, что я использовал, и это сработало. –

+0

Это также помогло мне в проекте со многими сложными зависимостями. Если я отключил распространение флагов хоста вообще, мой код не будет создан. Это странно, так как мой «обычный» хост-код содержит множество материалов C++ 11 ... –

3

Если вы сталкиваетесь с этим вопросом при поиске способа компиляции сборки Genoils CPP-Ethereum для разработки Ethereum CUDA, моя проблема была решена путем редактирования файла CMakeLists.txt в cpp -ethereum/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)