CUDA与我的gcc版本不兼容

CUDA与我的gcc版本不兼容,gcc,cuda,debian,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 || (__G

我在编译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此时将整个系统作为一个依赖项

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

您唯一的解决方案是安装GCC4.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版本开始,GCC4.8就得到了完全支持,Ubuntu 14.04和Fedora 21都支持4.9
  • 从CUDA 7.5版本开始,GCC4.8就得到了完全支持,Ubuntu 14.04和Fedora 21都支持4.9
  • 从CUDA8版本开始,GCC5.3在Ubuntu 16.06和Fedora 23上得到了完全支持
  • 从CUDA9版本开始,GCC6在Ubuntu 16.04、Ubuntu 17.04和Fedora 25上完全受支持
  • CUDA9.2版本增加了对GCC7的支持
  • CUDA 10.1版本增加了对gcc 8的支持
  • CUDA 10.2版本继续支持gcc 8
  • CUDA11.0版本在Ubuntu20.04上增加了对GCC9的支持
  • CUDA 11.1版本扩展了gcc 9对大多数发行版的支持,并在Fedora linux上增加了对gcc 10的支持
目前(截至CUDA 11.1),除了Fedora linux,CUDA中没有gcc 10支持


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

如前所述,nvcc依赖于gcc 4.4。通过向使用nvcc安装创建的bin目录添加软链接,可以配置nvcc使用正确版本的gcc,而无需传递任何编译器参数

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


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

Gearoid Murphy的解决方案更适合我,因为在我的发行版(Ubuntu11.10)上,gcc-4.4和gcc-4.6在同一个目录中,所以编译器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++

Gearoid Murphy的解决方案非常有效。对我来说,我有两个cuda的目录-

/usr/local/cuda 
/usr/local/cuda-5.0
软链接只能添加到下面提到的目录中-

/usr/local/cuda 

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

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

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

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

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

查看以解决此问题:

。。。如果安装GCC4.6,还可以使用更新替代方案 命令,以便在版本之间轻松切换。这可能是 配置有:

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

CUDA经过一些头部修改后与gcc4.7兼容,可能更高版本:
对于像我这样在使用
cmake
时感到困惑的人,
FindCUDA.cmake
脚本覆盖了
nvcc.profile
中的一些内容。您可以通过按照设置
CUDA_host_compiler
来指定
nvcc
主机编译器。在大多数发行版上,您可以在最新的编译器(如gcc-4.7)旁边安装另一个gcc和g++版本。此外,大多数构建系统都知道“代码> cc和<代码> CXX/COD>环境变量,它们分别指定了其他C和C++编译器。所以我建议如下:

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

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

我必须安装较旧版本的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++

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

如果安装以下存储库:

sudo-yum安装compat-gcc-34-c++-3.4.6-37.fc23.x86_64 compat-gcc-34-3.4.6-37.fc23.x86_64
现在做的软链接提到abo
    sudo ln -s /usr/bin/gcc-4.4 /opt/cuda/bin/gcc
    sudo ln -s /usr/bin/g++-4.4 /opt/cuda/bin/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/g++
//...
#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) <]
//...
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
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++
sudo apt-get install gcc-5
sudo apt-get install g++-5
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++
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++
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"
    ]
rm -rd build/
CUDAHOSTCXX=/usr/bin/gcc-5 python setup.py build develop
sudo apt-get install --reinstall gcc-5
sudo apt-get install --reinstall g++-5
$ 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
sudo apt-get purge libcudart9.1 nvidia-cuda-dev nvidia-cuda-doc \
                                nvidia-cuda-gdb nvidia-cuda-toolkit