为 nvcc 设置默认主机编译器

17

我刚刚在新的GPU服务器上安装了Debian Stretch(9)和Cuda 8。Stretch不提供旧版本的gcc,所以我需要使用clang作为主机编译器(nvcc不支持gcc-6)。我可以这样调用nvcc来实现:

nvcc -ccbin clang-3.8

有没有一种方法可以在整个系统范围内实现这个功能 - 例如在CUDA配置或环境变量中?

2个回答

18

nvcc的文档中没有列出任何可以更改ccbin环境变量的选项,只有这个选项:

http://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html

--compiler-bindir directory, -ccbin 指定编译器可执行文件所在的目录。也可以指定主机编译器可执行文件名以确保选择正确的主机编译器。

Linux指南中也没有这样的信息:http://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html

您可以尝试创建一些nvcc包装脚本,并将其放置在PATH环境变量的前面,如下所示:

mkdir ~/supernvcc
echo '#!/bin/sh' > ~/supernvcc/nvcc
echo `which nvcc` -ccbin clang-3.8 '$@' >> ~/supernvcc/nvcc
chmod +x ~/supernvcc/nvcc
export PATH=/home/`id -un`/supernvcc:$PATH

在每个新的 shell 中重复上一行,并加入 export 后再使用 nvcc,或将其添加到您的 .bashrc 或其他 shell 初始化脚本中。

PS:而且 nvcc 也是 bash 脚本,您可以直接复制并编辑它:

cat `which nvcc`

更新: 人们建议将正确的gcc版本链接到cuda的内部目录/usr/local/cuda/bin/:

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

谢谢,虽然要去那样的努力可能只需要修改makefiles - 我只是希望有一种“干净”的方法来做到这一点。 - Chris
@RobertCrovella,别名在从makefile启动的脚本shell中无法工作。在Ubuntu上,从Ubuntu软件包中获取的nvcc(/usr/bin/nvcc)是一个脚本,没有检查Debian和/或Nvidia软件包的变体(Ubuntu还有gcc-5 / g++-5也受nvcc支持)。当有多个makefile时,“supernvcc / nvcc”可能更方便。 - osgx
我的解决方案不完整:我有一个makefile(cmakefile),其中调用nvcc时使用了错误的“ -ccbin /usr/bin/cc”,它指向gcc-6,而不是nvcc需要的gcc-5。当存在两个“ -ccbin”选项时,nvcc将失败。因此,需要一些更好的supernvcc / nvcc,该工具将从“ -ccbin”过滤掉“ $ @”和下一个参数,并将其他参数传递给真正的nvcc,但我不知道这种类型的bash魔术。 - osgx
1
最近的更新非常棒,运行得非常顺畅! - dreamflasher
如果有人在手动调整gcc版本时遇到编译错误,请确保符号链接与相同的版本一致。 - loran d

4
你可以按照官方文档中所描述的方式,使用NVCC_PREPEND_FLAGSNVCC_APPEND_FLAGS来注入-ccbin到所有nvcc的调用中。
例如,我在我的~/.bash_profile中有以下内容:
export NVCC_PREPEND_FLAGS='-ccbin /home/linuxbrew/.linuxbrew/bin/g++-11'

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