致命错误:cuda.h:没有这样的文件或目录

时间:2016-12-23 20:56:09

标签: 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

然后,我得到以下源代码(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在哪里?我怎么能这样做?

2 个答案:

答案 0 :(得分:4)

正确的包含头文件不是cuda.h而是cuda_runtime.h,假设您要使用gcc作为此代码的编译器。正如另一个答案所指出的那样,您可以使用nvcc(已经安装在您的计算机上),根本不需要任何包含该标头的标头。

如果要使用nvcc,可能应该确保设置了适当的PATH环境变量。这个和其他有用的信息包含在linux install guide

因此,如果您修改代码如下:

#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代码并遇到任何问题时,请务必使用proper cuda error checking并使用cuda-memcheck运行您的代码,如下所示:

cuda-memcheck ./has_cuda

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

答案 1 :(得分:2)

我自己从未编译过cuda项目,但我可以肯定地告诉你,你需要将库链接到编译器。

一些快速的谷歌搜索说Nvidia有编译器可以处理所有事情。所以你只需要安装它,你就应该好好去。它被称为NVVC。安装完毕后运行:

nvcc helloworld.cu -o hello.out

这是一个解释更多的链接: www.pdc.kth.se

这不是因为你知道编译器在哪里,你几乎总是需要链接它。您不必为标准库执行此操作,因为链接器已知道在哪里可以找到它。