【发布时间】:2017-12-01 05:10:31
【问题描述】:
我刚刚在新的 GPU 服务器上安装了 Debian Stretch (9) 和 Cuda 8。 Stretch 不附带旧版本的 gcc,所以我需要使用 clang 作为宿主编译器(nvcc 不支持 gcc-6)。我可以通过以下方式调用 nvcc:
nvcc -ccbin clang-3.8
有什么方法可以在整个系统范围内实现 - 例如在 cuda 配置或环境变量中?
【问题讨论】:
我刚刚在新的 GPU 服务器上安装了 Debian Stretch (9) 和 Cuda 8。 Stretch 不附带旧版本的 gcc,所以我需要使用 clang 作为宿主编译器(nvcc 不支持 gcc-6)。我可以通过以下方式调用 nvcc:
nvcc -ccbin clang-3.8
有什么方法可以在整个系统范围内实现 - 例如在 cuda 配置或环境变量中?
【问题讨论】:
nvcc 的文档没有列出任何改变 ccbin 的 env 变量,只有选项:
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 env var 中,例如:
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
(在使用nvcc 之前在每个新shell 中重复最后一行export 或将其添加到您的.bashrc 或其他shell 初始化脚本中)
PS:nvcc 也是 bash 脚本,你可以复制它并编辑它:
cat `which nvcc`
更新:People recommend to link correct gcc version 到 cuda 的内部目录 /usr/local/cuda/bin/:
sudo ln -s /usr/bin/gcc-4.4 /usr/local/cuda/bin/gcc
【讨论】:
supernvcc/nvcc在makefile比较多的时候可能会更方便。
-ccbin /usr/bin/cc 指向 gcc-6,而不是 nvcc 所需的 gcc-5。当-ccbin 有两个选项时,nvcc 会失败。因此,需要一些更好的 supernvcc/nvcc 来过滤 $@ 从 -ccbin 和下一个参数并将其他参数传递给真正的 nvcc,但我不知道这种 bash 魔术。