CUDA与我的gcc版本不兼容

时间:2011-07-08 09:25:35

标签: gcc cuda debian

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

最初它根本没有编译:

error -- unsupported GNU version! gcc 4.5 and up are not supported!

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

//#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 4)
#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 6)

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

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

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

21 个答案:

答案 0 :(得分:97)

正如已经指出的那样,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

答案 1 :(得分:46)

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

您唯一的解决方案是将gcc 4.4版本安装为 second 编译器(大多数发行版都允许这样做)。 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发布以来,Ubuntu 16.04,Ubuntu 17.04和Fedora 25完全支持gcc 6。
  • CUDA 9.2版本增加了对gcc 7
  • 的支持

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

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

答案 2 :(得分:29)

对于CUDA 10:

sudo ln -s /usr/bin/gcc-7 /usr/local/cuda/bin/gcc 
sudo ln -s /usr/bin/g++-7 /usr/local/cuda/bin/g++

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

sudo apt install gcc-7 g++-7

对于CUDA 9:

sudo ln -s /usr/bin/gcc-6 /usr/local/cuda/bin/gcc 
sudo ln -s /usr/bin/g++-6 /usr/local/cuda/bin/g++

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

sudo apt install gcc-6 g++-6

对于CUDA 8:

sudo ln -s /usr/bin/gcc-5 /usr/local/cuda/bin/gcc 
sudo ln -s /usr/bin/g++-5 /usr/local/cuda/bin/g++

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

sudo apt install gcc-5 g++-5

答案 3 :(得分:24)

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

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++

答案 4 :(得分: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++

答案 5 :(得分:8)

查看how to use "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

答案 6 :(得分:5)

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

CC=gcc-4.4 CXX=g++-4.4 cmake path/to/your/CMakeLists.txt

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

答案 7 :(得分:3)

这适用于fedora 23.根据您的fedora版本,compat gcc存储库会略有不同。

如果安装以下存储库:

sudo yum install compat-gcc-34-c++-3.4.6-37.fc23.x86_64 compat-gcc-34-3.4.6-37.fc23.x86_64 

现在假设你的cuda bin文件夹在/usr/local/cuda/

中,如上所述制作软链接
sudo ln -s /usr/bin/gcc-34 /usr/local/cuda/bin/gcc
sudo ln -s /usr/bin/g++-34 /usr/local/cuda/bin/g++

您现在应该可以使用nvcc进行编译,而不会出现gcc版本错误。

答案 8 :(得分:3)

如果对我使用cmake,则没有任何编辑文件和链接的技巧,因此我使用指定gcc / g ++版本的标志进行编译。
cmake -DCMAKE_C_COMPILER=gcc-6 -DCMAKE_CXX_COMPILER=g++-6 ..

像魅力一样工作。

答案 9 :(得分:2)

我必须安装旧版本的gcc,g ++。

    sudo apt-get install gcc-4.4
    sudo apt-get install g++-4.4

检查gcc-4.4是否在/ usr / bin /中,对于g ++是否相同 然后我可以使用上面的解决方案:

    sudo ln -s /usr/bin/gcc-4.4 /opt/cuda/bin/gcc
    sudo ln -s /usr/bin/g++-4.4 /opt/cuda/bin/g++

答案 10 :(得分:2)

对于像我这样在使用cmake时感到困惑的人,FindCUDA.cmake脚本会覆盖nvcc.profile中的部分内容。您可以按照http://public.kitware.com/Bug/view.php?id=13674设置nvcc来指定CUDA_HOST_COMPILER主机编译器。

答案 11 :(得分:2)

CUDA经过一些与gcc4.7兼容的标题修改后可能更高版本: https://www.udacity.com/wiki/cs344/troubleshoot_gcc47

答案 12 :(得分:2)

将nvcc配置为使用特定版本的gcc(例如gcc-4.4)的另一种方法是编辑 nvcc.profile 并更改 PATH 以包含首先要使用的gcc的路径。

例如(/ opt中安装的gcc-4.4.6):

PATH += /opt/gcc-4.4.6/lib/gcc/x86_64-unknown-linux-gnu/4.4.6:/opt/gcc-4.4.6/bin:$(TOP)/open64/bin:$(TOP)/share/cuda/nvvm:$(_HERE_):

nvcc.profile 的位置各不相同,但它应与 nvcc 可执行文件本身位于同一目录中。

这有点像黑客,因为 nvcc.profile 不是根据nvcc手册进行用户配置,但它是最适合我的解决方案。

答案 13 :(得分:2)

Gearoid Murphy的解决方案就像一个魅力。对我来说,我有两个目录为cuda -

/usr/local/cuda 
/usr/local/cuda-5.0

软链接只能添加到下面提到的目录中 -

/usr/local/cuda 

此外,正如SchighSchagh所提到的那样,g ++和gcc软链接都是必需的。

答案 14 :(得分:1)

如果遇到此错误,请阅读日志文件:

$ cat /var/log/cuda-installer.log 
[INFO]: Driver installation detected by command: apt list --installed | grep -e nvidia-driver-[0-9][0-9][0-9] -e nvidia-[0-9][0-9][0-9]
[INFO]: Cleaning up window
[INFO]: Complete
[INFO]: Checking compiler version...
[INFO]: gcc location: /usr/bin/gcc

[INFO]: gcc version: gcc version 9.2.1 20191008 (Ubuntu 9.2.1-9ubuntu2) 

[ERROR]: unsupported compiler version: 9.2.1. Use --override to override this check.

只需遵循日志文件中的建议:

sudo sh cuda_<version>_linux.run --override

工作完成:)

我刚刚使用--override选项在Kubuntu 19.10上安装了带有gcc 9.2的CUDA 10.2。

答案 15 :(得分:0)

$CUDA_HOME/include/host_config.h中,找到这样的行(可能会在不同的CUDA版本之间略有不同):

//...
#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 9)

#error -- unsupported GNU version! gcc versions later than 4.9 are not supported!

#endif [> __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 9) <]
//...

根据您的情况删除或更改它们。

请注意,此方法可能不安全,可能会破坏您的构建。例如,gcc 5默认使用C ++ 11,但从CUDA 7.5开始,这不是nvcc的情况。解决方法是添加

--Xcompiler="--std=c++98"表示CUDA&lt; = 6.5

--std=c++11代表CUDA&gt; = 7.0。

答案 16 :(得分:0)

要在Ubuntu 16.10上编译CUDA 8.0示例,我做了:

sudo apt-get install gcc-5 g++-5
cd /path/to/NVIDIA_CUDA-8.0_Samples
# Find the path to the library (this should be in NVIDIA's Makefiles)
LIBLOC=`find /usr/lib -name "libnvcuvid.so.*" | head -n1 | perl -pe 's[/usr/lib/(nvidia-\d+)/.*][$1]'`
# Substitute that path into the makefiles for the hard-coded, incorrect one
find . -name "*.mk" | xargs perl -pi -e "s/nvidia-\d+/$LIBLOC/g"
# Make using the supported compiler
HOST_COMPILER=g++-5 make

这样做的好处是不修改整个系统或只对二进制文件进行符号链接(这可能会导致库链接问题。)

答案 17 :(得分:0)

这解决了我的问题:

sudo rm /usr/local/cuda/bin/gcc
sudo rm /usr/local/cuda/bin/g++
sudo apt install gcc-4.4 g++-4.4
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++

答案 18 :(得分:0)

之所以发生这种情况,是因为您当前的CUDA版本不支持您当前的GCC版本。您需要执行以下操作:

  1. 找到受支持的GCC版本(在我的情况下为CUDA 9,为5)

    • CUDA 4.1: GCC 4.5
    • CUDA 5.0: GCC 4.6
    • CUDA 6.0: GCC 4.7
    • CUDA 7.0: GCC 4.8
    • CUDA 7.5: GCC 4.8
    • CUDA 8: GCC 5.3
    • CUDA 9: GCC 5.5
    • CUDA 9.2: GCC 7
    • CUDA 10.1: GCC 8
  2. 安装支持的GCC版本

    sudo apt-get install gcc-5
    sudo apt-get install g++-5
    
  3. 更改/usr/bin目录中GCC的软链接

    cd /usr/bin
    sudo rm gcc
    sudo rm g++
    sudo ln -s /usr/bin/gcc-5 gcc
    sudo ln -s /usr/bin/g++-5 g++
    
  4. 更改/usr/local/cuda-9.0/bin目录中GCC的软链接

    cd /usr/local/cuda-9.0/bin
    sudo rm gcc
    sudo rm g++
    sudo ln -s /usr/bin/gcc-5 gcc
    sudo ln -s /usr/bin/g++-5 g++
    
  5. -DCUDA_HOST_COMPILER=/usr/bin/gcc-5添加到您的setup.py文件中,用于编译

    if torch.cuda.is_available() and CUDA_HOME is not None:
        extension = CUDAExtension
        sources += source_cuda
        define_macros += [("WITH_CUDA", None)]
        extra_compile_args["nvcc"] = [
            "-DCUDA_HAS_FP16=1",
            "-D__CUDA_NO_HALF_OPERATORS__",
            "-D__CUDA_NO_HALF_CONVERSIONS__",
            "-D__CUDA_NO_HALF2_OPERATORS__",
            "-DCUDA_HOST_COMPILER=/usr/bin/gcc-5"
        ]
    
  6. 删除旧的构建目录

    rm -rd build/
    
  7. 通过设置CUDAHOSTCXX=/usr/bin/gcc-5

    重新编译
    CUDAHOSTCXX=/usr/bin/gcc-5 python setup.py build develop
    

注意:如果按照以下步骤操作后仍然出现gcc: error trying to exec 'cc1plus': execvp: no such file or directory错误,请尝试重新安装GCC,然后重新编译:

sudo apt-get install --reinstall gcc-5
sudo apt-get install --reinstall g++-5

积分:https://github.com/facebookresearch/maskrcnn-benchmark/issues/25#issuecomment-433382510

答案 19 :(得分:0)

对于CUDA 6.5(显然是7.0和7.5),我创建了gcc 4.8.5 RPM软件包的版本(在Fedora Core 30下),该版本的gcc可以与系统当前的GCC一起安装。 / p>

您可以找到所有这些信息here

答案 20 :(得分:0)

就我而言,我已经从Ubuntu版本安装了CUDA,而cmake将使用NVidia SDK Manager来检测该版本而不是新安装的版本。

我运行了dpkg -l | grep cuda,可以看到两个版本。

我要做的是卸载旧的CUDA(在我的情况下为9.1版),而单独保留新版本(10.2版)。我像这样使用了清除命令:

sudo apt-get purge libcudart9.1 nvidia-cuda-dev nvidia-cuda-doc \
                                nvidia-cuda-gdb nvidia-cuda-toolkit

请确认软件包名称与您要从安装中删除的版本匹配。

我不得不从空白的cmake目录中重新运行BUILD,以将所有#include和库重定向到SDK版本(因为旧路径是在现有构建环境中烘焙的)。