如何在 Fedora 36 上使用 Cuda 工具包 nvcc 11.7.1?

如何在 Fedora 36 上使用 Cuda 工具包 nvcc 11.7.1?

截至 2022 年 9 月,Nvidia 仍未正式支持 Fedora 36 上的 cuda 工具包。缺少的具体部分是对 gcc12 的支持,而 Fedora 36 默认支持 gcc12。在 Fedora 上使用 nvcc 的一种解决方案是转到软呢帽镜子并下载 Fedora 35。但是,我想知道如何让 nvcc 在 Fedora 36 上工作。

cuda 上有一个 RPM fusion wiki 页面,尽管有些信息仍然有点难以找到。

Fedora 35 cuda 存储库完整且包含所有必要文件,但是(截至 2022 年 9 月)等效的 fedora 36 nvidia cuda repo存在但似乎不完整,特别是它缺少以 . 开头的 rpm 文件cuda-11...

答案1

2024 年 4 月更新:

现在Fedora 39正式支持Cuda 12工具包。我更喜欢使用 conda 来安装它; nvidia 有一个官方的 conda 包。 (我的偏好是因为我不想接触通过 rpmfusion 安装的 nvidia 驱动程序。

因此,无需再执行以下步骤,直到 Fedora 成为版本 40,之后 Cuda 可能在几个月内不会得到正式支持。

2023 年 8 月更新:

距离我发布问题已有大约一年了,今天最新的 Fedora 38 有 gcc13,而 Nvidia 最新支持的 cuda 工具包是带有 gcc12 的 Fedora 37。上面的说明仍然有效,但我想在使用 CLion 时添加更多上下文。

Jetbrains 文档建议在 CLion 中编辑 CMAKE 设置,但这对我来说根本不起作用。相反,对我有用的是将以下内容放入 ~/.bash_profile (不是 .bashrc 因为我认为这仅适用于终端),然后注销并重新登录:

PATH="$PATH:/usr/local/cuda/bin"
CUDAHOSTCXX='/home/linuxbrew/.linuxbrew/bin/g++-12'; export CUDAHOSTCXX

我使用本地运行文件安装了 Cuda 工具包 12.2,而不是使用 rpm 存储库方法,因为这些方法给了我关于包不兼容的可怕消息。运行运行文件时,我确保在他们提供的小命令行 GUI 中取消选中“安装驱动程序”(这有点类似于“低图形”模式下的 debian 安装程序)。这样它就不会破坏我已经安装的 rpmfusion akmod nvidia 驱动程序。

原答案:

首先,安装 fedora 36,并在询问时选择启用第三方存储库。

然后(从RPM fusion nvidia howto 页面):

sudo dnf install akmod-nvidia
sudo dnf install xorg-x11-drv-nvidia-cuda

然后等待一两分钟,直到modinfo -F version nvidia给出非错误输出。

然后,重启这样 Nvidia 驱动程序将比 Nouveau 生效。然后,(从RPM cuda fusion Howto页面):

sudo dnf config-manager --add-repo https://developer.download.nvidia.com/compute/cuda/repos/fedora35/x86_64/cuda-fedora35.repo
sudo dnf clean all
sudo dnf module disable nvidia-driver
sudo dnf -y install cuda

第一行的 35 是故意的。另外,该module disable行确实不是禁用刚刚安装的现有 akmod nvidia 驱动程序,而是阻止下一行在现有驱动程序上安装 Nvidia 的 dkms 驱动程序。

此后,/usr/local/cuda/bin/nvcc将可用,但如果您尝试在.cu文件上运行它,它会抱怨“不支持 gcc 12”。它给了你一个标志来忽略这个并继续前进,但是为了摆脱这个警告,我们可以执行以下操作来快速获取 gcc-11:此 reddit 线程中的评论

第一的,安装自制软件使用他们的指示。我只是使用了默认位置,/home/linuxbrew但如果您愿意,您可以安装在自定义位置,例如您的主目录。然后做brew install gcc@11。最后,如果您直接使用该标志告诉 nvcc 使用 gcc-11,nvcc 将毫无怨言地工作-ccbin,例如:

/usr/local/cuda/bin/nvcc -ccbin g++-11 foo.cu -o foo

如果由于某种原因您不想让brew的gcc-11污染您的默认路径,您可以使用环境变量显式告诉nvcc始终使用brew的gcc-11。例如,输入以下内容~/bash_profile,然后注销并登录:

export NVCC_PREPEND_FLAGS='-ccbin /home/linuxbrew/.linuxbrew/bin/g++-11'

答案2

@xdavidliu 的方法在撰写本文时仍然有效。目前在 Fedora 39 上,带有 gcc 13 和不久前刚刚发布的 cuda 12.3。尽管我在 Fedora 37 上使用了最新的 nvidia 存储库,在 nvcc 上使用了带有自制程序的 gcc 12(cuda 12 可以支持的最新 gcc)。在 Fedora 上降级软件包是令人沮丧的,但自制方法非常聪明。只是补充一下,如果您使用 dnf5,您可能需要从 dnf 和 dnf5 的官方 nvidia 存储库中禁用 nvidia-driver 模块以避免冲突。谢谢詹森。

答案3

我构建了一个“compat-gcc-12-3”RPM,以允许 gcc 12.3 在 Fedora Core 38 上安装。您可以获取必要的规范文件这里。这就是你要做的:

  • 下载 gcc 12.3 源 RPM 以及dnf download --source --releasever=37 gcc.
  • 安装它。它应该将一堆文件转储到~/rpmbuild/SOURCESgcc.spec~/rpmbuild/SPECS
  • 将新安装的gcc.specgcc-12-3.spec上面 GitHub URL 中的进行比较。它们应该是相同的。
  • 请随意进行 diffgcc-12-3.speccompat-gcc-12-3.spec,以验证我没有做任何狡猾的事情......只是重命名文件并删除不需要的东西。
  • 建造!只需运行rpmbuild -bacompat-gcc-12-3.spec几个幸福的小时后,您就会得到您需要的东西!
  • 安装新构建的compat-gcc-12-3compat-gcc-12-3-c++compat-libstdc++-12-3compat-libstdc++-12-3-devel软件包,这些软件包可以与常规 gcc 安装一起安装而不会发生冲突。

相关内容