c++ - 为什么 CUDA 程序可以与 CMake “FIND_PACKAGE” 一起使用,但不能与 “LANGUAGES CUDA” 一起使用?

标签 c++ cmake cuda

注意:之前的标题是“如何在不使用 FIND_PACKAGE 的情况下使用 CMake 编译 CUDA 程序?”。进行编辑以更清楚地说明关键问题是什么。

按照建议的方式使用 CMake 和 CUDA 时,如果没有 FIND_PACKAGE,它可以编译,但是当我运行生成的二进制文件时,出现以下错误:

CUDA error: CUDA driver version is insufficient for CUDA runtime version

但是,如果我使用 nvcc 手动编译,或者在 cmake 中使用 FIND_PACKAGE,则它可以正常工作。 CUDA 示例也可以编译和运行。我知道 FIND_PACKAGE(CUDA) 已被弃用,因为 cuda 现在是一流的 cmake 语言。这两种不同的方法有什么区别,如何在不使用 find 包的情况下使其工作?

<小时/>

详细信息:

main.cu:

#include <iostream>

__global__ void helloGPU() {
    printf("Hi globe\n");
}

int main() {
    helloGPU<<<1,2>>>();
    cudaDeviceSynchronize();
    cudaError_t error = cudaGetLastError();
    if(error != cudaSuccess)
    {
        printf("CUDA error: %s\n", cudaGetErrorString(error));
        exit(-1);
    }
}

CMakeLists.txt 有效:

cmake_minimum_required (VERSION 3.10)
find_package(CUDA REQUIRED)
cuda_add_executable(simple main.cu)

CMakeLists.txt 已损坏:

cmake_minimum_required (VERSION 3.10)
project(simplecuda LANGUAGES CXX CUDA)
add_executable(simple main.cu)

系统:

Mac 操作系统 High Sierra 10.13.6
Cuda驱动版本:410.130
GPU驱动版本:387.10.10.10.40.105
nvcc版本:10.0.130
clang++ 版本:9.0.0

编辑:为什么当前的驱动程序版本

一些评论建议使用不同的驱动程序版本。这就是为什么我有列出的版本:

使用 CUDA 安装程序安装的默认驱动程序,在尝试运行 CUDA 示例时出现以下错误:

CUDA driver version is insufficient for CUDA runtime version

此类网站让我相信尝试不同的驱动程序版本可能会有所帮助:( https://devtalk.nvidia.com/default/topic/1027922/cuda-setup-and-installation/-solved-code-35-cudaerrorinsufficientdriver-error-on-mac-version-10-13-2-17c88-with-nvidia-geforce-gt-/ )。

经过一些不成功的尝试和错误,我遇到了这个脚本:https://www.tonymacx86.com/threads/nvidia-update-simple-way-to-install-nvidia-web-drivers.244987/

这会自动搜索并安装驱动程序,这就是我获得 387.10.10.10.40.105 的方式。

在此版本中,CUDA 示例第一次工作正常,使用 nvcc 手动编译源代码,并使用 FIND_PACKAGE 工作。我相对确定我的驱动程序版本现在是正确的。当我使用 NVIDIA 驱动程序管理器首选项 Pane 检查新版本时,它说我有最新版本,并且根据 http://www.macvidcards.com/drivers.html ,我有正确的驱动程序版本。

编辑:深入研究构建命令

我通过使用 make VERBOSE=1 进一步了解了 CMake 正在做什么。我删除了尽可能多的行和标志,以便仍然获得相同的行为,并简化了路径、tmp 目录等。这是生成给出错误的二进制文件的命令的最小示例,从 CMake 中使用 获取LANGUAGES CXX CUDA (如果我在与 main.cu 相同的文件夹中运行它们,然后运行 ​​./simple,它会给出上面的 CUDA 错误):

/Developer/NVIDIA/CUDA-10.0/bin/nvcc  -c main.cu -o main.cu.o
/Developer/NVIDIA/CUDA-10.0/bin/nvcc  -dlink main.cu.o -o cmake_device_link.o
/usr/bin/clang++  main.cu.o cmake_device_link.o -o simple  -L"/Developer/NVIDIA/CUDA-10.0/lib" "/Developer/NVIDIA/CUDA-10.0/lib/libcudart_static.a"

以下是使用 FIND_PACKAGE(CUDA) 的 CMake 命令的类似最小版本:

/Developer/NVIDIA/CUDA-10.0/bin/nvcc main.cu -c -o main.cu.o -I/Developer/NVIDIA/CUDA-10.0/include
/usr/bin/clang++   main.cu.o  -o simple /Developer/NVIDIA/CUDA-10.0/lib/libcudart_static.a -Wl,-rpath,/usr/local/cuda/lib

关键部分似乎是最后一个标志,-Wl,-rpath,/usr/local/cuda/lib。我可以通过设置环境变量来使损坏的 CMake 版本正常工作:

export LD_LIBRARY_PATH=/usr/local/cuda/lib

或者按如下方式更新 CMake 文件:

SET_TARGET_PROPERTIES(simple PROPERTIES LINK_FLAGS -Wl,-rpath,/usr/local/cuda/lib)

我的系统是否有问题需要我执行此操作?或者 Mac 上 CMake 的 cuda 兼容性被破坏?

注意:官方博客中提到了一些关于Apple和rpaths的内容:https://devblogs.nvidia.com/building-cuda-applications-cmake/

但是如果我将此部分添加到 CMakeLists.txt 中,则没有帮助:

if(APPLE)
  # We need to add the path to the driver (libcuda.dylib) as an rpath, 
  # so that the static cuda runtime can find it at runtime.
  set_property(TARGET simple
               PROPERTY
               BUILD_RPATH ${CMAKE_CUDA_IMPLICIT_LINK_DIRECTORIES})
endif()

最佳答案

我必须同意@MatthieuBrucher 的观点:

  • CUDA 10 需要 410 多个驱动程序,您似乎有 387 个用于显示,最高兼容 CUDA 9.0。另外,我不建议混合使用 CUDA 和显示驱动程序版本。在 Linux 和 Windows 上,CUDA 驱动程序会与显示驱动程序一起自动安装,因此您始终会获得良好的组合。

  • CMake 将尝试构建一个小型测试程序(在 Linux 上从 /usr/share/cmake-3.10/Modules/CMakeCUDACompilerId.cu.in 生成)并尝试运行它。您将在此处收到兼容性错误消息。

升级您的显示驱动程序,一切都应该正常。如果更新的驱动程序不支持您的 GPU(在 Mac 上不应该出现这种情况),那么您必须降级 CUDA 驱动程序和工具包。

您可以找到更多信息here ,尤其是前两行:

The CUDA toolkit is transitioning to a faster release cadence to deliver new features, performance improvements, and critical bug fixes. However, the tight coupling of the CUDA runtime with the display driver (specifically libcuda.so—the CUDA driver on Linux systems), means that the customer is required to update the entire driver stack to use the latest CUDA software (including the compiler, libraries, and tools).

(已添加强调)

关于c++ - 为什么 CUDA 程序可以与 CMake “FIND_PACKAGE” 一起使用,但不能与 “LANGUAGES CUDA” 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54145575/

相关文章:

c++ - C++ 容器的迭代器失效规则

C++11 完美转发和引用折叠

opencv - 在没有 GPU 的情况下编译 OpenCV?

c++ - Visual Studio 2017 的 CMake 多项目设置

c++ - Visual Studio 2010 Qt 插件 Cmake 项目

用于常量内存变量使用的 CUDA 5.0 命名空间

cuda - CUDA 中的矩阵向​​量乘法 : benchmarking & performance

c++ - 为什么这个 C++ 'new' 运算符的实现有效?

c++ - CUDA 异常行为访问 vector

c++ - 在 arm neon 中有效地计算两个不同的数字