CUDA与我的gcc版本不兼容

fbi*_*jec 86 debian gcc cuda

我在编译CUDA SDK附带的一些示例时遇到了麻烦.我已经安装了开发人员驱动程序(版本270.41.19)和CUDA工具包,最后是SDK(两者都是4.0.17版本).

最初它根本没有编译:

error -- unsupported GNU version! gcc 4.5 and up are not supported!
Run Code Online (Sandbox Code Playgroud)

我发现81行负责:/usr/local/cuda/include/host_config.h并将其更改为:

//#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 4)
#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 6)
Run Code Online (Sandbox Code Playgroud)

从那时起,我只得到了一些编译的例子,它停止了:

In file included from /usr/include/c++/4.6/x86_64-linux-gnu/bits/gthr.h:162:0,
             from /usr/include/c++/4.6/ext/atomicity.h:34,
             from /usr/include/c++/4.6/bits/ios_base.h:41,
             from /usr/include/c++/4.6/ios:43,
             from /usr/include/c++/4.6/ostream:40,
             from /usr/include/c++/4.6/iterator:64,
             from /usr/local/cuda/include/thrust/iterator/iterator_categories.h:38,
             from /usr/local/cuda/include/thrust/device_ptr.h:26,
             from /usr/local/cuda/include/thrust/device_malloc_allocator.h:27,
             from /usr/local/cuda/include/thrust/device_vector.h:26,
             from lineOfSight.cu:37:
/usr/include/c++/4.6/x86_64-linux-gnu/bits/gthr-default.h:251:1: error: pasting         "__gthrw_" and "/* Android's C library does not provide pthread_cancel, check for
`pthread_create' instead.  */" does not give a valid preprocessing token
make[1]: *** [obj/x86_64/release/lineOfSight.cu.o] Error 1
Run Code Online (Sandbox Code Playgroud)

正如一些示例编译我认为这不是驱动程序问题,而是必须与不受支持的gcc版本有关.降级不是一种选择,因为gcc4.6此时将整个系统作为依赖...

Gea*_*phy 102

正如已经指出的那样,nvcc依赖于gcc 4.4.通过将软链接添加到使用nvcc install创建的bin目录,可以将nvcc配置为使用正确版本的gcc而不传递任何编译器参数.

默认的cuda二进制目录(安装默认值)是/ usr/local/cuda/bin,从这个目录添加到正确版本的gcc的软链接就足够了:

sudo ln -s /usr/bin/gcc-4.4 /usr/local/cuda/bin/gcc

  • 我还必须链接到g ++.否则,简单的`nvcc`调用工作,但是说,将`make`应用于CUDA Samples,很快就会引入调用:`nvcc -ccbin g ++`.对我来说,我使用`sudo ln -s /usr/bin/gcc-4.9/usr/local/cuda/bin/gcc`和`sudo ln -s /usr/bin/g++-4.9/usr/local/cuda/bin /克++`. (12认同)
  • 如果用`cmake .. && make`编译,你可以[尝试](http://stackoverflow.com/questions/34403447/caffe-compilation-fails-due-to-unsupported-gcc-compiler-version)`cmake - D CUDA_NVCC_FLAGS =" - ccbin gcc-4.4".. && make`.如果使用普通的`Makefile`,你可以[尝试](http://stackoverflow.com/questions/3698441/how-to-use-an-older-version-of-gcc-in-linux)`make CXX = g ++ -4.4 CC = gcc-4.4`. (7认同)
  • 我还必须添加一个符号链接到正确的g ++版本. (4认同)
  • “update-alternatives”命令也可能有帮助,尤其是在安装 CUDA 5.0 时 (2认同)

tal*_*ies 50

CUDA不支持gcc 4.5和4.6 - 代码将无法编译,其他工具链(包括cuda-gdb)将无法正常工作.您不能使用它们,并且限制是不可协商的.

您唯一的解决方案是安装gcc 4.4版本作为第二个编译器(大多数发行版都允许).nvcc有一个选项--compiler-bindir,可用于指向备用编译器.创建一个本地目录,然后创建指向支持的gcc版本可执行文件的符号链接.通过该--compiler-bindir选项将该本地目录传递给nvcc ,您应该能够编译CUDA代码而不会影响系统的其余部分.


编辑:

请注意,这个问题和答案与CUDA 4有关.自编写以来,NVIDIA在更新的CUDA工具链发布中继续扩展对后来gcc版本的支持

  • 截至CUDA 4.1版本,现在支持gcc 4.5.gcc 4.6和4.7不受支持.
  • 截至CUDA 5.0版本,现在支持gcc 4.6.gcc 4.7不受支持.
  • 截至CUDA 6.0版本,现在支持gcc 4.7.
  • 截至CUDA 7.0版本,完全支持gcc 4.8,在Ubuntu 14.04和Fedora 21上支持4.9.
  • 截至CUDA 7.5版本,完全支持gcc 4.8,在Ubuntu 14.04和Fedora 21上支持4.9.
  • 从CUDA 8版本开始,Ubuntu 16.06和Fedora 23完全支持gcc 5.3.
  • 截至CUDA 9版本,gcc 6完全支持Ubuntu 16.04,Ubuntu 17.04和Fedora 25.
  • CUDA 9.2版本增加了对gcc 7的支持

目前(截至CUDA 10)在CUDA中没有gcc 8支持.

请注意,NVIDIA最近在此处添加了一个非常有用的表,其中包含当前CUDA版本支持的编译器和OS矩阵.

  • 什么?如何使用更高版本*编译代码(当然除了硬编码限制)*?我唯一能想到的是,因为某些版本默认启用C11/C++ 11,但如果这导致旧代码出现问题,那么使用命令行开关可能很容易. (3认同)
  • 我在SLES 11 SP3上使用CUDA 7.5和`gcc 4.9.3`没有任何问题. (2认同)
  • 借调@ Hi-Angel.#talonmies"限制是不可谈判的"甚至意味着什么?较新版本的gcc和gdb支持对象文件的旧二进制头文件,因为它们"总是"(有点)有,没有理由新的gcc版本不起作用.除了Symlinking解决方案,任何其他问题很可能是交流预处理器版本标志设置,如果gcc版本测试在某些cuda标头中作为定义或宏的一部分进行"硬编码",则很容易修复.例外可能是cuda gpu编译器本身. (2认同)
  • 这不是二进制兼容性问题。CUDA 工具链要求 nvcc 和 GPU 前端解析器能够拦截和重载各种编译器和 libc/libc++ 内部标头,以编译主机和设备代码并将它们集成在一起。CUDA 解析器需要能够正确解析 gcc 内部标头等。未经测试的 gcc 版本可能并且确实会失败,无论 NVIDIA 标头中内置的预处理器防护如何。你可以相信我(作为一个在 CUDA 工具链上研究近 10 年的人),也可以不相信。此时我真的不 (2认同)

bry*_*410 35

更新:

对于CUDA 9:

MAX_GCC_VERSION=8
Run Code Online (Sandbox Code Playgroud)

您需要先安装gcc和g ++ 6:

sudo apt install gcc-$MAX_GCC_VERSION g++-$MAX_GCC_VERSION
Run Code Online (Sandbox Code Playgroud)

老答案:

对于CUDA 8:

sudo ln -s /usr/bin/gcc-$MAX_GCC_VERSION /usr/local/cuda/bin/gcc 
sudo ln -s /usr/bin/g++-$MAX_GCC_VERSION /usr/local/cuda/bin/g++
Run Code Online (Sandbox Code Playgroud)

您需要先安装gcc和g ++ 5:

MAX_GCC_VERSION=8
Run Code Online (Sandbox Code Playgroud)

  • 拯救了我的生命,大声笑配置噩梦!!!!谢谢。我将其应用于具有gcc和g ++ 7系统链接的cuda 10。对于遇到这种情况的任何人。 (2认同)
  • 我应该自己创建 `/usr/bin/gcc` 和 `/usr/bin/g++` 或 `/usr/local/cuda/bin/gcc` 文件夹吗? (2认同)
  • @bryant1410当我在第四步中运行命令时,我记得收到了一条错误,“错误:目录 /usr/local/cuda/bin/gcc 不存在,正在中止”或类似的内容。我现在意识到(在阅读问题的详细信息后),您的答案假设OP提到的步骤0:“我已经安装了CUDA工具包,最后安装了SDK”。我试图使用 NVIDIA 的“cuda_10.2.89_440.33.01_linux.run”向导进行安装,但它在运行时失败,并抱怨 gcc 兼容性。我最终决定卸载 gcc 9 :P (2认同)
  • 如果您使用 [ana|mini]conda (conda-forge 包 `cudatoolkit-dev`)安装了 NVCC,那么您需要在环境中链接,如 `ln -s /usr/bin/gcc-8 /home/user/miniconda3 /envs/your_env/bin/gcc` 和 `ln -s /usr/bin/g++-8 /home/user/miniconda3/envs/your_env/bin/g++` (2认同)

Nic*_*rca 24

Gearoid Murphy的解决方案对我来说效果更好,因为在我的发行版(Ubuntu 11.10)上,gcc-4.4和gcc-4.6在同一个目录中,所以--compiler-bindir没有帮助.唯一需要注意的是我还必须安装g ++ - 4.4和symlink它:

sudo ln -s /usr/bin/gcc-4.4 /usr/local/cuda/bin/gcc
sudo ln -s /usr/bin/g++-4.4 /usr/local/cuda/bin/g++
Run Code Online (Sandbox Code Playgroud)


neo*_*hur 11

对于CUDA7.5,这些线路工作:

sudo ln -s /usr/bin/gcc-4.9 /usr/local/cuda/bin/gcc 
sudo ln -s /usr/bin/g++-4.9 /usr/local/cuda/bin/g++
Run Code Online (Sandbox Code Playgroud)


Aka*_*nes 8

了解如何使用"update-alternatives"来解决此问题:

...如果您安装gcc 4.6,您还可以使用update-alternatives命令以便在版本之间轻松切换.这可以配置:

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.6 60 --slave /usr/bin/g++ g++ /usr/bin/g++-4.6 
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.7 40 --slave /usr/bin/g++ g++ /usr/bin/g++-4.7 
sudo update-alternatives --config gcc
Run Code Online (Sandbox Code Playgroud)


mat*_*ath 5

在大多数发行版中,您可以在最新的编译器(如gcc-4.7)旁边安装另一个gcc和g ++版本.此外,大多数构建系统都知道CCCXX环境变量,它们分别指定了其他C和C++编译器.所以我建议像:

CC=gcc-4.4 CXX=g++-4.4 cmake path/to/your/CMakeLists.txt
Run Code Online (Sandbox Code Playgroud)

对于Makefile,应该有类似的方式.我不建议在/ usr/local中设置自定义符号链接,除非您知道自己在做什么.


mar*_*xor 5

如果cmake对我来说,编辑文件和链接的技巧都无效,那么我使用指定gcc / g ++版本的标志进行编译。
cmake -DCMAKE_C_COMPILER=gcc-6 -DCMAKE_CXX_COMPILER=g++-6 ..

像魅力一样工作。