最近在学习cuda编程,本人在构建cuda的helloworld项目的时候出现了以下错误
FAILED: CMakeFiles/cuda_learning.dir/test.cu.o
/bin/nvcc -forward-unknown-to-host-compiler -DUSE_C10D_GLOO -DUSE_C10D_NCCL -DUSE_DISTRIBUTED -DUSE_RPC -DUSE_TENSORPIPE -isystem /home/black/anaconda3/lib/python3.8/site-packages/torch/include -isystem /home/black/anaconda3/lib/python3.8/site-packages/torch/include/torch/csrc/api/include -g -G -DONNX_NAMESPACE=onnx_c2 -gencode arch=compute_86,code=sm_86 -Xcudafe --diag_suppress=cc_clobber_ignored,--diag_suppress=integer_sign_change,--diag_suppress=useless_using_declaration,--diag_suppress=set_but_not_used,--diag_suppress=field_without_dll_interface,--diag_suppress=base_class_has_different_dll_interface,--diag_suppress=dll_interface_conflict_none_assumed,--diag_suppress=dll_interface_conflict_dllexport_assumed,--diag_suppress=implicit_return_from_non_void_function,--diag_suppress=unsigned_compare_with_zero,--diag_suppress=declared_but_not_referenced,--diag_suppress=bad_friend_decl --expt-relaxed-constexpr --expt-extended-lambda -g -std=c++17 -D_GLIBCXX_USE_CXX11_ABI=0 -MD -MT CMakeFiles/cuda_learning.dir/test.cu.o -MF CMakeFiles/cuda_learning.dir/test.cu.o.d -x cu -c /home/black/CudaProjects/cuda_learning/test.cu -o CMakeFiles/cuda_learning.dir/test.cu.o
/usr/include/c++/11/bits/std_function.h:435:145: error: parameter packs not expanded with ‘...’:
435 | function(_Functor&& __f)
| ^
/usr/include/c++/11/bits/std_function.h:435:145: note: ‘_ArgTypes’
/usr/include/c++/11/bits/std_function.h:530:146: error: parameter packs not expanded with ‘...’:
530 | operator=(_Functor&& __f)
| ^
/usr/include/c++/11/bits/std_function.h:530:146: note: ‘_ArgTypes’
ninja: build stopped: subcommand failed.
1. 首先先展示一下我的环境
OS:wsl2下的Ubuntu22
cuda:11.5
GPU:RTX3060 Laptop
2. 分析输出的报错信息
从下面可以发现是C++版本的问题,从下面的输出可以看出来nvcc在编译的时候使用了C++/11的头文件,因此不支持c++17下面的特性;
/usr/include/c++/11/bits/std_function.h:435:145: error: parameter packs not expanded with ‘...’:
435 | function(_Functor&& __f)
3. 在CMAKELISTS.txt中设置无效
我尝试在CMakeList.txt中设置以下内容没有效果,下面的代码指出使用c++17版本
set(CMAKE_CXX_FLAGS "-std=c++17")
set(CMAKE_CUDA_FLAGS "-g -G -std=c++17")
4. 经过查阅,需要对g++和gcc进行降级
我所使用的gcc、g++版本都是11.4.0以上的,从参考资料里面得知降级至g+±10的版本就可以解决这个错误
5. 安装gcc-10,g++ -10
sudo apt install gcc-10 g++-10
6. 完善CMAKE指令
显式设置cuda的g++编译器
set(CMAKE_CXX_FLAGS "-std=c++17 -DCMAKE_CUDA_HOST_COMPILER=/usr/bin/g++-10")
set(CMAKE_CUDA_FLAGS "-g -G -std=c++17")
7. 对于Clion,也可以这样做
8. 参考资料
https://github.com/stotko/stdgpu/issues/337