CMakeでCUDAコードをコンパイルする際に問題が発生します。私はCUDA7を使用していますが、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)
多くの投稿がこれが必要であると示唆した後、私はstd = c ++ 11コンパイラフラグを追加しました。ただし、このフラグの有無にかかわらず、まったく同じエラーが発生します。
また、nvccコンパイルフラグからC++ 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"
Gcc 4.8を使用していますが、4.7でも同じエラーが発生します。私はcmake2.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
これは、CUDA 7、gcc 4.8.2、およびCMake3.0.2を使用して機能しました。
コードを更新し、CUDAコードでC++ 11を使用できることを明確にするために、単純な推力ベースの例を追加しました
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.c
#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;
}
list(APPEND CUDA_NVCC_FLAGS "-std=c++11")
で十分です、SET(CUDA_PROPAGATE_Host_FLAGS OFF)
は不要な場合があり、.cuファイルにブレークポイントを設定できませんでした
イーサリアムCUDAマイニング用のGenoilsCPP-Ethereumビルドをコンパイルする方法を探しているときにこの質問に出くわした場合、cpp-ethereum/libethash-cudaフォルダーにあるCMakeLists.txtファイルを編集することで問題が解決しました。
それが述べているところ:
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)