I successfully installed CUDA 8.0 in my PC and I can see its files by running the following commands in my 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
Then, I got the following source code (has_cuda.c) to check out if CUDA is installed:
#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.
I looked for cuda.h in my directories and found them at the following places:
$ 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
I am quite rookie on this, so, what can be happening? should I have to export any variable to point out where cuda.h is? how can I do this?
The C++ API (cuda_runtime. h) is a C++-style interface built on top of the C API. It wraps some of the C API routines, using overloading, references and default arguments. These wrappers can be used from C++ code and can be compiled with any C++ compiler.
The proper include header file for this is not cuda.h
but cuda_runtime.h
, assuming you want to use gcc
as the compiler for this code. As the other answer points out, you could just use nvcc
(which is already installed on your machine) which wouldn't require any include headers for this code at all.
If you want to use nvcc
you probably should make sure that the appropriate PATH
environment variable is set. This and other useful information is contained in the linux install guide.
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;
}
You should be able to compile it successfully using a command something like this:
gcc -I/usr/local/cuda/include -L/usr/local/cuda/lib64 has_cuda.c -lcudart -o has_cuda
The path after the -I
switch should contain the path to cuda_runtime.h
on your machine. Normally that would be set up as above, but I'm not sure if the cuda
symlink is set up on your machine, and also it looks like your include directory may be at an unusual place, i.e.
/usr/local/cuda-8.0/targets/x86_64-linux/include
but you can use find
just as you have been doing to locate it.
Likewise, the path after the -L
switch needs to be the path to your cuda lib64
directory, which will contain libcudart.so and and its cousins. Again, that would normally be symlinked on the path I have shown, but your machine install may not conform to my expectations. You should be able to use find
to locate the correct path.
And as indicated in the other answer, if you use nvcc
(which you have already located), you won't need to explicitly select the -I
and -L
path. The easiest way to make this work is to rename your file from has_cuda.c
to has_cuda.cu
, then you should be able to compile like this:
nvcc has_cuda.cu -o has_cuda
Finally, Ubuntu 16.10 is not an officially supported distribution for CUDA at this time, so there may be some things unexpected about the way it got installed on your machine. I'd encourage you to read the previously linked install guide, as it contains useful information about post-installation setup steps, such as setting environment variables, and also how to "verify" the CUDA installation.
Any time you are running CUDA codes, and having any sort of trouble, make sure to use proper cuda error checking and run your codes with cuda-memcheck, like so:
cuda-memcheck ./has_cuda
Even if you don't understand the error information reported, it may be useful for those trying to help you.
I have never compiled a cuda project myself but I think you will need to link the library to the compiler.
Some quick googling says Nvidia has compiler for this which will handle everything. So you just need to install that and you should be good to go. It's called NVVC. Once installed just run:
nvcc helloworld.cu -o hello.out
With external libraries like these, you almost always need to link them. You don't have to do it for the standard library because the linker already knows where to find it.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With