致命错误:cuda.h:没有这样的文件或目录
Posted
技术标签:
【中文标题】致命错误:cuda.h:没有这样的文件或目录【英文标题】:Fatal error: cuda.h: No such file or directory 【发布时间】:2017-05-09 12:46:03 【问题描述】:我在我的 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 在哪里?我该怎么做?
【问题讨论】:
附带说明,查找头文件的更快方法:locate cuda.h
。这当然是假设您的定位数据库是最新的(即,如果您刚刚安装了 CUDA,它不会找到它)。
【参考方案1】:
为此,正确的包含头文件不是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
即使您不理解报告的错误信息,它也可能对那些试图帮助您的人有用。
【讨论】:
虽然每次使用 nvcc 都可以找到,但出现以下错误: $ nvcc has_cuda.c 目前未安装程序“nvcc”。您可以通过键入以下命令进行安装:sudo apt install nvidia-cuda-toolkit。 cuda-memcheck 有类似的错误:cuda-memcheck ./has_cuda 当前未安装程序“cuda-memcheck”。您可以通过键入安装它: sudo apt install nvidia-cuda-toolkit 您需要将 CUDA bin 目录添加到您的 PATH 环境变量中。这些说明包含在我链接的安装指南中。【参考方案2】:我自己从未编译过 cuda 项目,但我认为您需要将库链接到编译器。
一些快速的谷歌搜索说 Nvidia 有编译器可以处理所有事情。所以你只需要安装它就可以了。它被称为 NVVC。安装后运行:
nvcc helloworld.cu -o hello.out
对于像这样的外部库,您几乎总是需要链接它们。您不必为标准库执行此操作,因为链接器已经知道在哪里可以找到它。
【讨论】:
似乎值得强调的是,这个答案最相关的一点是将源文件重命名为具有.cu
扩展名,这指示nvcc
将其视为CUDA 代码。这将链接到相关库中,但它还将包含必要的头文件,使顶部的 #include <cuda.h>
变得多余(充其量,请参阅 Robert Crovella 的答案以获取更多详细信息)。以上是关于致命错误:cuda.h:没有这样的文件或目录的主要内容,如果未能解决你的问题,请参考以下文章
致命错误:glib.h:使用 vscode 和 mingw 时没有这样的文件或目录
致命错误 C1083:无法打开包含文件:'boost/regex.hpp':没有这样的文件或目录