为什么CUDA程序可以使用CMake“FIND_PACKAGE”,但不能使用“LANGUAGES CUDA”?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么CUDA程序可以使用CMake“FIND_PACKAGE”,但不能使用“LANGUAGES CUDA”?相关的知识,希望对你有一定的参考价值。
注意:之前的标题是“如何使用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
");
}
int main() {
helloGPU<<<1,2>>>();
cudaDeviceSynchronize();
cudaError_t error = cudaGetLastError();
if(error != cudaSuccess)
{
printf("CUDA error: %s
", 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()
我不同意并同意@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软件(包括编译器,图书馆和工具)。
(重点补充)
以上是关于为什么CUDA程序可以使用CMake“FIND_PACKAGE”,但不能使用“LANGUAGES CUDA”?的主要内容,如果未能解决你的问题,请参考以下文章
从 cmake 测试是不是存在支持 cuda 的 GPU 的最简单方法是啥?
CUDA、Boost 和 Cmake “字符串子命令 REGEX,模式 MATCHALL 需要至少 5 个参数来命令。”