注意:上一个标题是“如何在不使用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
答案 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软件(包括编译器,库和工具)。
(添加了强调)