使用CUDA 8.0与GCC 6.x - 糟糕的功能超载投诉

问题描述:

我想使用GCC 6.2.1,我的发行版的默认编译器(注意:不是由CUDA官方支持的GCC版本,所以建立一些CUDA代码,所以你可以称之为实验)。这是GCC 4.9.3和CUDA版本7.5和8.0都可以正常使用的代码。使用CUDA 8.0与GCC 6.x - 糟糕的功能超载投诉

好吧,如果我建立以下(贴近)小例子:

#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". 

这是为什么?我该如何纠正/规避此事?

+0

你可以发布回购案吗?我怀疑你的代码中有什么会导致这种情况中断,而不是CUDA头文件中的任何内容。 – talonmies

+0

@talonmies:发布的可重现示例。 – einpoklum

+4

为了更好和/或更糟,CUDA使用与主机工具链的紧密集成,包括利用主机的'math.h'。当主机工具链供应商使用此头文件进行(不必要的)?时,它们的更改可能会触发与CUDA头文件math_functions.h的冲突。这是CUDA需要针对特定​​主机工具链版本进行调整和验证的原因之一。通过坚持每个OS平台的“入门”文档中列举的受支持的主机工具链版本,都可以完全避免问题。 – njuffa

TL; DR:忘掉它。仅使用CUDA 8.x中与GCC 5.x的,和CUDA 9或更高版本的GCC 6.x的

看来other people have seen this issue with GCC 6.1.x和建议是添加以下标志NVCC:-Xcompiler -D__CORRECT_ISO_CPP11_MATH_H_PROTO(是的,两个连续的标志;详情请参见nvcc --help)。 (但是我不能报告完成的成功,因为其他问题会弹出)

但请记住,GCC 5.4.x是最新的支持版本,可能有一个很好的理由,所以它有点疯狂的追逐强制GCC 6.x - 特别是当CUDA 9现在可用时。

+0

尝试在编译时将这些标记添加到libethash-cuda目录的'CMakeLists.txt'中[Genoil's ethereum ](https://github.com/Genoil/cpp-ethereum)项目。但我仍然得到同样的错误。 GCC版本是6.3.0 20170516 – asgs

+0

@asgs:CUDA 9是你的朋友。 – einpoklum

+0

当然,我会尝试手动抓住它。 Debian软件仓库只有8个,不过 – asgs