为什么CUDA程序可以使用CMake“FIND_PACKAGE”,但不能使用“LANGUAGES CUDA”?

问题描述 投票:-1回答:1

注意:之前的标题是“如何使用CMake编译CUDA程序,而不使用FIND_PACKAGE?”。编辑使关键问题更清晰。

当以建议的方式使用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包的情况下使其工作?


细节:

卖弄.粗:

#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)

System:

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

Edit: why the current driver versions

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

使用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驱动程序管理器首选项窗格检查新版本时,它说我有最新版本,根据http://www.macvidcards.com/drivers.html,我有正确的驱动程序版本。

Edit: digging into build commands

我通过使用make VERBOSE=1进一步挖掘了CMake正在做的事情。我删除了尽可能多的行和标志,仍然可以获得相同的行为,简化路径,tmp目录等。这是一个生成二进制文件的命令的最小示例,它给出了一个错误,取自使用LANGUAGES CXX CUDA的CMake(如果我在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"

以下是来自CMake与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

关键部分似乎是最后一面旗帜,-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)

我的系统上有什么东西坏了我需要这样做吗?还是CMake在Mac上兼容cuda?

注意:官方博客中提到的Apple和rpath有一些内容: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()
c++ cmake cuda
1个回答
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软件(包括编译器,图书馆和工具)。

(重点补充)

© www.soinside.com 2019 - 2024. All rights reserved.