使用CUDA 8.0和GCC 6.x - 函数重载问题

4
我正在尝试使用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".

为什么会这样?我该如何纠正/规避这个问题?

你能发布一个仓库案例吗?我怀疑你的代码中有一些问题导致了这个错误,而不是CUDA头文件本身的问题。 - talonmies
@talonmies:已发布可重现的示例。 - einpoklum
4
CUDA与主机工具链进行紧密集成,包括利用主机的“math.h”,这可能是好事也可能是坏事。由于主机工具链供应商对该头文件进行了更改(是否必要尚不清楚),这些更改可能会触发与CUDA的头文件"math_functions.h"冲突。这是CUDA需要根据特定主机工具链版本进行调整和验证的原因之一。可以通过遵循每个操作系统平台的“入门指南”文档中列出的支持主机工具链版本来完全避免问题。 - njuffa
@njuffa:我理解,但有时与某个版本的紧密集成并不意味着后续版本无法使用,而是需要进行一些调整。对于这个特定问题,实际上就是这种情况(尽管很可能不是CUDA在GCC 6.2.x上遇到的所有问题)。 - einpoklum
1个回答

6
TL;DR: 忘记它吧。只使用CUDA 8.x与GCC 5.x,CUDA 9或更高版本与GCC 6.x一起使用。
似乎其他人在GCC 6.1.x上也遇到了此问题,建议是向nvcc添加以下标志:-Xcompiler -D__CORRECT_ISO_CPP11_MATH_H_PROTO(是的,连续两个标志;有关详细信息,请参见nvcc --help)。 (但我无法报告完全成功,因为出现了其他问题。)
但请记住,GCC 5.4.x是最新支持的版本,这可能有很好的理由,因此强制将GCC 6.x安装到其中有点像野鹅追逐 - 特别是现在已经有CUDA 9可用。

尝试在编译Genoil的以太坊项目时,将这些标志添加到libethash-cuda目录的CMakeLists.txt中。但我仍然收到相同的错误。GCC版本为6.3.0 20170516。 - asgs
@asgs:CUDA 9是你的好朋友。 - einpoklum
好的,我会尝试手动获取它。Debian仓库只有到8版本。 - asgs
1
@asgs:你需要冒险进入运行CUDA安装程序的危险世界。或者 - 拥有一组混合的apt源,其中Debian sid源优先级较低,你可以强制使用CUDA 9的情况。 - einpoklum
1
@JoeyMallone:考虑删除这些评论,转而提出并回答一个关于使用CUDA和clang的问题,或者如果已经有相关问题存在,可以用一个链接评论替代。 - einpoklum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接