我正在尝试使用GCC 6.2.1构建一些CUDA代码,这是我的发行版的默认编译器(注意:不是CUDA官方支持的GCC版本,所以你可以称之为实验)。这段代码可以在GCC 4.9.3和CUDA 7.5和8.0版本中正常运行。
嗯,如果我构建以下(接近)最小的示例:
#include <tuple>
int main() { return 0; }
与命令行
nvcc -std=c++11 -Wno-deprecated-gpu-targets -o main main.cu
得到以下错误:
/usr/local/cuda/bin/../targets/x86_64-linux/include/math_functions.h(8897): error: cannot overload functions distinguished by return type alone
/usr/local/cuda/bin/../targets/x86_64-linux/include/math_functions.h(8901): error: cannot overload functions distinguished by return type alone
2 errors detected in the compilation of "/tmp/tmpxft_000071fe_00000000-9_b.cpp1.ii".
为什么?我怎样才能纠正/规避这个问题?
TL;DR:算了吧。只使用cuda8。x与GCC 5。
似乎其他人已经在GCC 6.1中看到了这个问题。建议将以下标志添加到nvcc: -Xcompiler -D__CORRECT_ISO_CPP11_MATH_H_PROTO
(是的,两个连续的标志;参见nvcc --help
)。(但我不能报告完全成功,因为其他问题弹出代替)
但是记住GCC 5.4。x是受支持的最新版本,这可能有一个很好的理由,所以强制使用GCC 6是徒劳的。