CUDA与我的gcc版本不兼容。

151

我在编译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作为整个系统的依赖关系...


4
未来读者请注意:确保使用最新版的CUDA(除非您必须使用早期版本)。NVIDIA几乎每次发布都会提高最大支持编译器版本。 - einpoklum
这可能对那些使用CUDA 10并遇到gnu编译器链版本过高错误的人有所帮助:https://dev59.com/6a_la4cB1Zd3GeqPzd7a#53828864 - Douglas Daseeco
在安装detectron2时,我收到了类似的消息,因此我传递了系统变量export TORCH_DONT_CHECK_COMPILER_ABI=1并重新运行了setup.py,一切都顺利安装。我使用的是CUDA 12.0 g++ 12.x。 - Muneeb Ahmad Khurram
所以这是在说gcc在对这个软件包至关重要的方面上不是向前兼容的?这真是令人惊讶和失望。 - undefined
22个回答

-1
这是因为您当前的CUDA版本不支持您当前的GCC版本。您需要执行以下操作:
  1. 查找支持的GCC版本(在我的情况下,CUDA 9需要使用GCC 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. 在编译时的setup.py文件中添加-DCUDA_HOST_COMPILER=/usr/bin/gcc-5

    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


-1
在#debian下(在#ubuntu下必须相同):
$ apt show nvidia-cuda-toolkit
Package: nvidia-cuda-toolkit
Version: 11.8.89~11.8.0-5~deb12u1
[...]

$ dpkg -S nvidia-cuda-toolkit | grep "bin/g"
nvidia-cuda-toolkit: /usr/lib/nvidia-cuda-toolkit/bin/gcc
nvidia-cuda-toolkit: /usr/lib/nvidia-cuda-toolkit/bin/g++

$ gcc -v
[...] 
gcc version 12.2.0 (Debian 12.2.0-14)

$ /usr/lib/nvidia-cuda-toolkit/bin/gcc -v
[...] 
gcc version 11.3.0 (Debian 11.3.0-12)

nvidia-cuda-toolkit软件包提供了自己的本地gcc编译器。

所以我刚刚在我的cmake中添加了:

-D CMAKE_C_COMPILER="/usr/lib/nvidia-cuda-toolkit/bin/gcc" \
-D CMAKE_CXX_COMPILER="/usr/lib/nvidia-cuda-toolkit/bin/g++" 

一切都很顺利编译。

请那位降级的人解释一下为什么! - undefined

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