Nunca he compilado un proyecto cuda, pero creo que necesitarás vincular la biblioteca al compilador.
Algunas búsquedas rápidas en Google dicen que Nvidia tiene un compilador para esto que se encargará de todo. Entonces solo necesita instalar eso y debería estar listo para comenzar. Se llama NVVC. Una vez instalado simplemente ejecute:
nvcc helloworld.cu -o hello.out
Con bibliotecas externas como estas, casi siempre necesita vincularlas. No es necesario que lo haga para la biblioteca estándar porque el enlazador ya sabe dónde encontrarlo.
El archivo de cabecera de inclusión adecuado para esto no es cuda.h
pero cuda_runtime.h
, asumiendo que quieres usar gcc
como compilador de este código. Como señala la otra respuesta, podría usar nvcc
(que ya está instalado en su máquina) que no requeriría incluir encabezados para este código en absoluto.
Si quieres usar nvcc
probablemente deberías asegurarte de que el PATH
apropiado se establece la variable de entorno. Esta y otra información útil se encuentran en la guía de instalación de Linux.
Entonces, si modifica su código de esta manera:
#include <cuda_runtime.h>
int main ()
{
int deviceCount;
cudaError_t e = cudaGetDeviceCount(&deviceCount);
return e == cudaSuccess ? deviceCount : -1;
}
Debería poder compilarlo con éxito usando un comando como este:
gcc -I/usr/local/cuda/include -L/usr/local/cuda/lib64 has_cuda.c -lcudart -o has_cuda
El camino después del -I
el interruptor debe contener la ruta a cuda_runtime.h
en su máquina. Normalmente, eso se configuraría como arriba, pero no estoy seguro si el cuda
El enlace simbólico está configurado en su máquina, y también parece que su directorio de inclusión puede estar en un lugar inusual, es decir,
/usr/local/cuda-8.0/targets/x86_64-linux/include
pero puedes usar find
tal como lo has estado haciendo para localizarlo.
Del mismo modo, la ruta después del -L
switch debe ser la ruta a tu cuda lib64
directorio, que contendrá libcudart.so y sus primos. Una vez más, eso normalmente sería un enlace simbólico en la ruta que he mostrado, pero es posible que la instalación de su máquina no se ajuste a mis expectativas. Deberías poder usar find
para localizar la ruta correcta.
Y como se indica en la otra respuesta, si usa nvcc
(que ya ha localizado), no necesitará seleccionar explícitamente el -I
y -L
sendero. La forma más fácil de hacer que esto funcione es cambiar el nombre de su archivo de has_cuda.c
a has_cuda.cu
, entonces debería poder compilar así:
nvcc has_cuda.cu -o has_cuda
Finalmente, Ubuntu 16.10 no es una distribución con soporte oficial para CUDA en este momento, por lo que puede haber algunas cosas inesperadas sobre la forma en que se instaló en su máquina. Le animo a leer la guía de instalación vinculada anteriormente, ya que contiene información útil sobre los pasos de configuración posteriores a la instalación, como la configuración de variables de entorno y también cómo "verificar" la instalación de CUDA.
Cada vez que esté ejecutando códigos CUDA y tenga algún tipo de problema, asegúrese de usar la verificación de errores cuda adecuada y ejecute sus códigos con cuda-memcheck, así:
cuda-memcheck ./has_cuda
Incluso si no comprende la información de error notificada, puede ser útil para aquellos que intentan ayudarlo.