致命错误:cuda.h:没有那个文件或目录

mad*_*mad 10 c linux cuda nvidia

我在我的 PC 上成功安装了 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
Run Code Online (Sandbox Code Playgroud)

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

#include<cuda.h>

int main ()
{
    int deviceCount;
    cudaError_t e = cudaGetDeviceCount(&deviceCount);
    return e == cudaSuccess ? deviceCount : -1;
}
Run Code Online (Sandbox Code Playgroud)

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

$ gcc has_cuda.c 

has_cuda.c:1:17: fatal error: cuda.h: No such file or directory
#include<cuda.h>
             ^
compilation terminated.
Run Code Online (Sandbox Code Playgroud)

我在目录中查找 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
Run Code Online (Sandbox Code Playgroud)

我在这方面很菜鸟,所以,会发生什么?我应该导出任何变量来指出 cuda.h 在哪里吗?我怎样才能做到这一点?

Rob*_*lla 8

假设您想用作此代码的编译器,则正确的包含头文件不是cuda.hbut 。正如另一个答案所指出的那样,您可以使用(已安装在您的机器上),它根本不需要此代码的任何包含标头。cuda_runtime.hgccnvcc

如果您想使用,nvcc您可能应该确保PATH设置了适当的环境变量。这个和其他有用的信息包含在linux 安装指南中。

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

#include <cuda_runtime.h>

int main ()
{
    int deviceCount;
    cudaError_t e = cudaGetDeviceCount(&deviceCount);
    return e == cudaSuccess ? deviceCount : -1;
}
Run Code Online (Sandbox Code Playgroud)

您应该能够使用如下命令成功编译它:

gcc -I/usr/local/cuda/include -L/usr/local/cuda/lib64 has_cuda.c -lcudart -o has_cuda
Run Code Online (Sandbox Code Playgroud)

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

/usr/local/cuda-8.0/targets/x86_64-linux/include
Run Code Online (Sandbox Code Playgroud)

但是您可以find像以前一样使用来定位它。

同样,-L切换后的路径需要是您的 cudalib64目录的路径,该目录将包含 libcudart.so 及其同类文件。同样,这通常会在我显示的路径上进行符号链接,但是您的机器安装可能不符合我的期望。您应该能够使用find来定位正确的路径。

并且如另一个答案中所示,如果您使用nvcc(您已经找到),则无需明确选择-I和-L路径。使这项工作最简单的方法是将您的文件从 重命名has_cuda.c为has_cuda.cu,然后您应该能够像这样编译:

nvcc has_cuda.cu -o has_cuda
Run Code Online (Sandbox Code Playgroud)

最后,Ubuntu 16.10 目前还不是官方支持的 CUDA 发行版,因此它在您的机器上的安装方式可能会有些出人意料。我鼓励您阅读之前链接的安装指南,因为它包含有关安装后设置步骤的有用信息,例如设置环境变量,以及如何“验证”CUDA 安装。

每当您运行 CUDA 代码时,遇到任何问题,请确保使用正确的 cuda 错误检查并使用 cuda-memcheck 运行您的代码,如下所示:

cuda-memcheck ./has_cuda
Run Code Online (Sandbox Code Playgroud)

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


Las*_*obs 6

我自己从未编译过 cuda 项目,但我认为您需要将库链接到编译器。

一些快速谷歌搜索说英伟达有编译器可以处理所有事情。所以你只需要安装它就可以了。它被称为 NVVC。安装后只需运行:

nvcc helloworld.cu -o hello.out
Run Code Online (Sandbox Code Playgroud)

对于像这样的外部库,您几乎总是需要链接它们。您不必为标准库执行此操作,因为链接器已经知道在哪里可以找到它。

  • 似乎值得强调的是,这个答案最相关的一点是将源文件重命名为具有“.cu”扩展名,这指示“nvcc”将其视为 CUDA 代码。这将链接到相关的库,但它还将包含必要的头文件,使顶部的“#include &lt;cuda.h&gt;”变得多余(最多,请参阅 Robert Crovella 的答案以获取更多详细信息)。 (2认同)