相关文章推荐

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

13 人关注

我成功地在我的电脑上安装了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;

But running this code returns me the following error:

$ 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的位置?我如何做到这一点?

1 个评论
顺便提一下,找到头文件的一个更快方法。 locate cuda.h 。当然,这是假设你的定位数据库是最新的(也就是说,如果你刚刚安装了CUDA,它就找不到)。
c
linux
cuda
nvidia
mad
mad
发布于 2016-12-24
3 个回答
Robert Crovella
Robert Crovella
发布于 2022-11-02
已采纳
0 人赞同

正确的包含头文件不是 cuda.h ,而是 cuda_runtime.h ,假设你想使用 gcc 作为这段代码的编译器。 正如其他答案所指出的,你可以直接使用 nvcc (它已经安装在你的机器上),这根本不需要为这段代码提供任何包含头文件。

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

So if you modify your code like this:

#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的符号链接,而且看起来你的include目录可能在一个不同的地方,即

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

但你可以使用find,就像你一直在做的那样来定位它。

同样,-L开关后的路径需要是你的cudalib64目录的路径,它将包含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

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

mad
尽管我每次使用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来安装它。
你需要在你的PATH环境变量中加入CUDA bin目录。这些说明包含在我链接的安装指南中。
Lasse Jacobs
Lasse Jacobs
发布于 2022-11-02
0 人赞同

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

一些快速的谷歌搜索说Nvidia有编译器,可以处理一切。因此,你只需要安装它,你就应该可以了。它被称为NVVC。一旦安装,就可以运行。

nvcc helloworld.cu -o hello.out

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

tera
值得强调的是,这个答案中最相关的一点是将源文件重命名为 .cu 的扩展名,这指示 nvcc 将其视为CUDA代码。这将链接到相关的库,但也包括必要的头文件,使顶部的 #include <cuda.h> 成为多余的(最多,详情见Robert Crovella的回答)。
Wan_YC
Wan_YC
发布于 2022-11-02
0 人赞同
 
推荐文章