致命错误:cuda.h文件不存在

16

我已经成功地在我的电脑上安装了CUDA 8.0,并且通过运行以下命令在我的Ubuntu 16.10中可以看到它的文件:

$ sudo find / -name nvcc

/usr/local/cuda-8.0/bin/nvcc

$ sudo find / -name cuda

/usr/local/cuda
/usr/local/cuda-8.0/targets/x86_64-linux/include/thrust/system/cuda
/usr/share/doc/cuda
/usr/include/nvidia-367/cuda

那么,我得到了以下源代码(has_cuda.c)来检查CUDA是否已安装:

#include<cuda.h>

int main ()
{
    int deviceCount;
    cudaError_t e = cudaGetDeviceCount(&deviceCount);
    return e == cudaSuccess ? deviceCount : -1;
}

但是运行这段代码会返回以下错误:

$ gcc has_cuda.c 

has_cuda.c:1:17: fatal error: cuda.h: No such file or directory
#include<cuda.h>
             ^
compilation terminated.

我在我的目录中查找了cuda.h文件,并在以下位置找到它们:

$ sudo find / -name cuda.h

/usr/local/cuda-8.0/targets/x86_64-linux/include/cuda.h
/usr/include/nvidia-367/cuda/cuda.h
/usr/include/linux/cuda.h
/usr/src/linux-headers-4.8.0-22/include/linux/cuda.h
/usr/src/linux-headers-4.8.0-22/include/uapi/linux/cuda.h
/usr/src/linux-headers-4.8.0-32/include/linux/cuda.h
/usr/src/linux-headers-4.8.0-32/include/uapi/linux/cuda.h

我在这方面还很新手,那么可能发生了什么?我是否需要导出任何变量来指出cuda.h的位置?我该如何做到这一点?


3
顺便提一下,快速查找头文件的方法是: locate cuda.h。当然,这是假设您的定位数据库是最新的(即如果您刚安装CUDA,则无法找到它)。 - Alexis Wilke
3个回答

11

如果您想要使用gcc编译这段代码,那么适当的头文件应该是cuda_runtime.h而不是cuda.h。正如其他答案所指出的那样,您可以直接使用已经安装在您机器上的nvcc来编译此代码,这将不需要任何头文件。

如果您想要使用nvcc,您可能需要确保适当的PATH环境变量已经设置好了。这和其他有用的信息都包含在Linux安装指南中。

因此,如果您像这样修改您的代码:

#include <cuda_runtime.h>

int main ()
{
    int deviceCount;
    cudaError_t e = cudaGetDeviceCount(&deviceCount);
    return e == cudaSuccess ? deviceCount : -1;
}

你应该能够使用类似于以下命令的方式成功编译它:

gcc -I/usr/local/cuda/include -L/usr/local/cuda/lib64 has_cuda.c -lcudart -o has_cuda

-I 开关后的路径应该包含您机器上 cuda_runtime.h 的路径。通常情况下,这会像上面设置那样进行,但我不确定您的机器上是否设置了 cuda 符号链接,而且看起来您的包含目录可能在一个不寻常的位置。

/usr/local/cuda-8.0/targets/x86_64-linux/include

但是,您可以像以前一样使用find来找到它。

同样,在-L开关后的路径必须是cuda lib64目录的路径,其中包含libcudart.so及其类似物。同样,通常情况下会在我显示的路径上创建符号链接,但是您的机器安装可能不符合我的期望。您应该能够使用find找到正确的路径。

正如其他答案中所示,如果您使用nvcc(已经定位),则无需显式选择-I-L路径。使其工作的最简单方法是将文件从has_cuda.c重命名为has_cuda.cu,然后您应该能够这样编译:

nvcc has_cuda.cu -o has_cuda

最后提醒,目前Ubuntu 16.10并不是CUDA的官方支持版本,因此安装可能会有一些意外情况。建议您阅读之前链接的安装指南,其中包含关于后续设置步骤(例如设置环境变量)以及如何“验证”CUDA安装的有用信息。

如果您在运行CUDA代码时遇到任何问题,请确保使用适当的CUDA错误检查,并像这样使用cuda-memcheck:

cuda-memcheck ./has_cuda

即使您不理解报告的错误信息,对于那些试图帮助您的人来说它可能是有用的。


虽然我每次使用时都可以找到nvcc,但我遇到了以下错误:$ nvcc has_cuda.c 程序“nvcc”当前未安装。您可以通过键入以下命令进行安装: sudo apt install nvidia-cuda-toolkit。 - mad
cuda-memcheck 出现了类似的错误:cuda-memcheck ./has_cuda 当前未安装 'cuda-memcheck' 程序。您可以输入以下命令进行安装: sudo apt install nvidia-cuda-toolkit - mad
1
你需要将CUDA二进制目录添加到你的PATH环境变量中。这些说明都包含在我提供的安装指南中。 - Robert Crovella

6
我从未自己编译过cuda项目,但我认为您需要将库链接到编译器中。 一些快速搜索表明,Nvidia有一个编译器可以处理所有事情。因此,您只需安装它,就可以开始使用了。它被称为NVVC。安装后,只需运行以下命令:
nvcc helloworld.cu -o hello.out

使用这些外部库,你几乎总是需要链接它们。标准库不需要进行链接,因为链接器已经知道如何找到它。

2
值得强调的是,这个答案最相关的点是将源文件重命名为.cu扩展名,这会指示nvcc将其视为CUDA代码。这将链接相关库,但也将包括必要的头文件,使顶部的#include <cuda.h>变得多余(至少可以参考Robert Crovella的答案获取更多细节)。 - tera

3

当安装Python CUDA包 lietorch 时,如果看到以下错误信息:
have fatal error: cuda.h: No such file or directory,尽管 cuda.h 文件存在,请执行以下操作:

pip install pycuda 

此后,问题应该得到解决。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接