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

时间:2019-01-11 11:24:55

标签: 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 OS 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 Driver Manager首选项窗格检查新版本时,它表示我具有最新版本,并且根据http://www.macvidcards.com/drivers.html,我具有正确的驱动程序版本。

编辑:深入研究构建命令

我使用make VERBOSE=1进一步研究了CMake的功能。我删除了尽可能多的行和标志,以仍然获得相同的行为,并简化了路径,tmp目录等。这是产生错误的二进制文件的命令的最小示例,取自带有{{1的CMake。 }}(如果我在与LANGUAGES CXX CUDA相同的文件夹中运行它们,然后运行main.cu,则会出现上述CUDA错误):

./simple

这是CMake中带有/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)

关键部分似乎是最后一个标志/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 。我可以通过设置环境变量来获取损坏的CMake版本:

-Wl,-rpath,/usr/local/cuda/lib

或通过如下方式更新CMake文件:

export LD_LIBRARY_PATH=/usr/local/cuda/lib

我的系统上有需要执行此操作的东西吗?还是在Mac上破坏了CMake的cuda兼容性?

注意:官方博客https://devblogs.nvidia.com/building-cuda-applications-cmake/

中提到了有关Apple和rpath的一些信息

但是,如果我将此部分添加到SET_TARGET_PROPERTIES(simple PROPERTIES LINK_FLAGS -Wl,-rpath,/usr/local/cuda/lib) ,则无济于事:

CMakeLists.txt

1 个答案:

答案 0 :(得分:1)

我必须不同意@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,尤其是在前两行中:

  

CUDA工具包正在过渡到更快的发布节奏,以提供新功能,性能改进和关键错误修复。但是, CUDA运行时与显示驱动程序紧密结合(特别是libcuda.so-Linux系统上的CUDA驱动程序),意味着客户需要将整个驱动程序堆栈更新为使用最新的CUDA软件(包括编译器,库和工具)。

(添加了强调)