2016-12-23 2 views
1

J'ai installé avec succès CUDA 8.0 dans mon PC et je peux voir ses fichiers en exécutant les commandes suivantes dans mon Ubuntu 16.10:Erreur fatale: cuda.h: Aucun fichier ou répertoire

$ 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 

Puis, je me suis le code source suivant (has_cuda.c) pour vérifier si CUDA est installé:

#include<cuda.h> 

int main() 
{ 
    int deviceCount; 
    cudaError_t e = cudaGetDeviceCount(&deviceCount); 
    return e == cudaSuccess ? deviceCount : -1; 
} 

Mais d'exécuter ce code me renvoie l'erreur suivante:

$ gcc has_cuda.c 

has_cuda.c:1:17: fatal error: cuda.h: No such file or directory 
#include<cuda.h> 
      ^
compilation terminated. 

j'ai cherché cuda.h dans mes répertoires et ont trouvé dans les endroits suivants:

$ 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 

Je suis novice tout à fait à ce sujet, donc, ce qui peut se produire? devrais-je devoir exporter n'importe quelle variable pour indiquer où cuda.h est? Comment puis-je faire ceci?

Répondre

2

Je n'ai jamais compilé moi-même un projet cuda mais je peux vous assurer que vous aurez besoin de lier la bibliothèque au compilateur.

Quelques recherches rapides indiquent que Nvidia a un compilateur pour cela qui va tout gérer. Donc, vous avez juste besoin d'installer cela et vous devriez être bon à faire. C'est ce qu'on appelle NVVC. Une fois installé il suffit d'exécuter:

nvcc helloworld.cu -o hello.out 

Voici un lien qui explique plus: www.pdc.kth.se

Ce n'est pas parce que vous savez où quelque chose est que le compilateur vous ne devez presque toujours lier. Vous n'avez pas besoin de le faire pour la bibliothèque standard car l'éditeur de liens sait déjà où le trouver.

+0

Il semble intéressant de souligner que le point le plus pertinent de cette réponse est de renommer le fichier source pour avoir une extension '.cu', qui demande' nvcc' de le traiter comme du code CUDA. Ce lien sera dans les bibliothèques appropriées, mais il inclura également les fichiers d'en-tête nécessaires rendant le '#include ' au plus redondant (au mieux, voir la réponse de Robert Crovella pour plus de détails). – tera

4

Le fichier d'en-tête include approprié pour ce n'est pas cuda.h mais cuda_runtime.h, en supposant que vous souhaitez utiliser gcc en tant que compilateur pour ce code. Comme l'indique l'autre réponse, vous pouvez simplement utiliser nvcc (qui est déjà installé sur votre machine), ce qui ne nécessiterait aucun en-tête d'inclusion pour ce code.

Si vous souhaitez utiliser nvcc, vous devez vous assurer que la variable d'environnement PATH appropriée est définie. Ceci et d'autres informations utiles sont contenues dans le linux install guide.

Donc, si vous modifiez votre code comme ceci:

#include <cuda_runtime.h> 

int main() 
{ 
    int deviceCount; 
    cudaError_t e = cudaGetDeviceCount(&deviceCount); 
    return e == cudaSuccess ? deviceCount : -1; 
} 

Vous devriez être en mesure de le compiler en utilisant une commande quelque chose comme ceci avec succès:

gcc -I/usr/local/cuda/include -L/usr/local/cuda/lib64 has_cuda.c -lcudart -o has_cuda 

Le chemin après que l'interrupteur -I doit contenir le chemin vers cuda_runtime.h sur votre machine. Normalement, ce serait créé comme ci-dessus, mais je ne suis pas sûr si le cuda symlink est mis en place sur votre machine, et aussi il semble que votre include peut être à un endroit inhabituel, à savoir

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

mais vous pouvez utiliser find comme vous l'avez fait pour le localiser.

De même, le chemin après le commutateur -L doit être le chemin d'accès à votre répertoire cuda lib64, qui contiendra libcudart.so et ses cousins. Encore une fois, cela serait normalement symétrique sur le chemin que j'ai montré, mais l'installation de votre machine peut ne pas être conforme à mes attentes. Vous devriez pouvoir utiliser find pour localiser le bon chemin.

Et comme indiqué dans l'autre réponse, si vous utilisez nvcc (que vous avez déjà localisé), vous n'aurez pas besoin de sélectionner explicitement le chemin -I et -L. La meilleure façon de faire ce travail est de renommer votre fichier de has_cuda.c à has_cuda.cu, alors vous devriez être en mesure de compiler comme ceci:

nvcc has_cuda.cu -o has_cuda 

Enfin, Ubuntu 16.10 n'est pas une distribution officiellement pris en charge pour CUDA à ce moment, donc il peut y avoir des choses inattendues sur la façon dont il a été installé sur votre machine. Je vous encourage à lire le guide d'installation précédemment lié, car il contient des informations utiles sur les étapes de configuration post-installation, telles que la définition des variables d'environnement et également comment "vérifier" l'installation de CUDA.

Chaque fois que vous utilisez des codes CUDA, et ayant toute sorte de problème, assurez-vous d'utiliser proper cuda error checking et exécuter vos codes avec cuda-memcheck, comme ceci:

cuda-memcheck ./has_cuda 

Même si vous ne comprenez pas l'information d'erreur rapportée, il peut être utile pour ceux qui essaient de vous aider.

+0

Bien que je puisse localiser nvcc chaque fois que je l'utilise, j'ai l'erreur suivante: $ nvcc has_cuda.c Le programme 'nvcc' n'est actuellement pas installé. Vous pouvez l'installer en tapant: sudo apt installer nvidia-cuda-toolkit. – mad

+0

cuda-memcheck a une erreur similaire: cuda-memcheck ./has_cuda Le programme 'cuda-memcheck' n'est actuellement pas installé. Vous pouvez l'installer en tapant: sudo apt installer nvidia-cuda-toolkit – mad

+0

Vous aurez besoin d'ajouter le répertoire bin CUDA à votre variable d'environnement PATH. Ces instructions sont contenues dans le guide d'installation I lié. –