如何让cmake找到CUDA

Posted

技术标签:

【中文标题】如何让cmake找到CUDA【英文标题】:How to let cmake find CUDA 【发布时间】:2013-11-27 15:01:49 【问题描述】:

我正在尝试构建 this project,它具有 CUDA 作为依赖项。但是cmake脚本在系统上找不到CUDA安装:

cls ~/workspace/gpucluster/cluster/build $ cmake ..
-- The C compiler identification is GNU 4.7.1
-- The CXX compiler identification is GNU 4.7.1
-- Check for working C compiler: /usr/bin/gcc
-- Check for working C compiler: /usr/bin/gcc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
CMake Error at /usr/share/cmake/Modules/FindCUDA.cmake:488 (message):
  Specify CUDA_TOOLKIT_ROOT_DIR
Call Stack (most recent call first):
  CMakeLists.txt:20 (find_package)

-- 配置不完整,出现错误!

我尝试将其作为环境变量添加到.bashrc,但没有效果:

export CUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda-5.5

如何正确Specify CUDA_TOOLKIT_ROOT_DIR

【问题讨论】:

【参考方案1】:

cmake 提到 CUDA_TOOLKIT_ROOT_DIR 作为 cmake 变量,而不是环境一。这就是为什么将它放入.bashrc 时它不起作用的原因。如果您查看 FindCUDA.cmake,它会清楚地表明:

脚本将提示用户指定 CUDA_TOOLKIT_ROOT_DIR 如果前缀 不能由系统路径中 nvcc 的位置确定,需要 被指定为 find_package()。要使用不同的安装版本 工具包在运行 cmake 之前设置环境变量 CUDA_BIN_PATH (例如 CUDA_BIN_PATH=/usr/local/cuda1.0 而不是默认的 /usr/local/cuda) 或者在配置后设置 CUDA_TOOLKIT_ROOT_DIR。如果你改变值 CUDA_TOOLKIT_ROOT_DIR,依赖路径的各种组件将 搬家了。

所以将CUDA_BIN_PATH 放入.bashrc 或指定CUDA_TOOLKIT_ROOT_DIR 到cmake:

cmake -D CUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda-5.5 ..

【讨论】:

能否指定cmake如何指定CUDA_TOOLKIT_ROOT_DIR?我通常不是 cmake 用户。 这让我更进一步:Could NOT find CUDA (missing: CUDA_NVCC_EXECUTABLE)。可能安装不完整,因为我只有库和头文件,没有可执行文件。 @cls 看起来需要可执行的 nvcc。也很可能出于完全相同的原因找不到 CUDA 的位置。正确安装 CUDA 后,我敢打赌,您不必手动指定 CUDA_TOOLKIT_ROOT_DIR。 你是对的,在我安装了缺少的 CUDA 部件后,cmake 工作了。 make 然后失败并出现如下错误:/usr/local/cuda-5.5/include/thrust/system/cuda/detail/detail/launch_closure.inl(86): error: kernel launches from templates are not allowed in system files 这是我的配置错误还是程序作者的源代码错误? code.google.com/p/thrust/issues/detail?id=359 尝试删除变量 CPLUS_INCLUDE_PATH【参考方案2】:

FindCMake.cmake 查找 /usr/local/cuda。在您的情况下,该目录可能不存在。只需创建一个该名称的符号链接到您的实际 CUDA 安装目录:

$ sudo ln -s /usr/local/cuda-5.5 /usr/local/cuda

您的 CMake 现在应该能够为您的项目生成 Makefile。

【讨论】:

经过两天的挖掘,这为我修复了它。出于某种原因,从 apt-get 安装 cuda 没有符号链接 /cuda 与 /cuda-8.0 我想知道为什么这个有 15 个赞成票的好答案低于只有 3 个和 5 个赞成票的新答案..【参考方案3】:

也许 CUDA 是从源安装的(nvcc 不在路径中)。然后脚本无法设置CUDA_TOOLKIT_ROOT_DIR,因为缺少nvcc。对我来说,运行后效果很好:

sudo apt install nvidia-cuda-toolkit

(这个包可能需要几个 GiB 的空间)

【讨论】:

【参考方案4】:

自 CMake 3.8 起,FindCUDA 已被弃用,在 CMake 项目中使用 CUDA 的正确方法是通过 project()enable_language() 启用它

https://cmake.org/cmake/help/v3.8/release/3.8.html#cuda

【讨论】:

这对原始问题没有帮助:你如何让 CMake 知道在哪里可以找到 CUDA?这在使用新方法时仍然适用。如果有的话,新版本在自动查找 CUDA 方面似乎比 FindCUDA 差得多!【参考方案5】:

在终端中,输入nano ~/.bashrc。然后将以下行添加到文件中:

export PATH=$PATH:/usr/local/cuda/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib:/usr/local/lib
export CPLUS_INCLUDE_PATH=/usr/local/cuda/include

保存文件,然后在终端输入source ~/.bashrc

您可以通过在终端输入nvcc --version 来验证是否设置了 CUDA 路径。

【讨论】:

所有环境变量都按照你的建议设置了,但是错误还是一样。【参考方案6】:

就我而言,我必须让 /usr/lib/cuda 指向实际的 CUDA 安装。所以我做了:

ln -s /usr/lib/cuda /home/nvidia_libraries/cuda_10.2

我的主文件夹本地安装了 cuda_10.2,而不是系统范围。

【讨论】:

以上是关于如何让cmake找到CUDA的主要内容,如果未能解决你的问题,请参考以下文章

尽管找到了 cuda,但 CMAKE_CUDA_COMPILER 标志为假

如何让 CMake 在 Windows 上找到 google protobuf?

cmake windows caffe cuda版本的切换

cmake怎么取消cuda

如何理解CMake文档,优先静态库,Cuda混编

如何使用 CMake 分别编译 *.cpp 和 *.cu?