web-dev-qa-db-fra.com

Comment démarrer un nouveau projet CUDA dans Visual Studio 2008?

C'est une question incroyablement basique, mais comment démarrer un nouveau projet CUDA dans Visual Studio 2008? J'ai trouvé des tonnes et des tonnes de documentation sur des questions liées à CUDA, mais rien sur la façon de démarrer un nouveau projet. Je travaille avec Windows 7 x64 Visual Studio 2008 C++. Je voudrais vraiment trouver une sorte d'application Hello World vraiment très basique pour simplement obtenir un programme de base compilant et en cours d'exécution.

Éditer:

J'ai essayé tes pas Tom. J'ai configuré une application console. J'ai ensuite supprimé le .cpp par défaut qu'il déposait et copié sur les trois fichiers du projet de modèle juste pour avoir quelque chose à compiler. Quand je compile cela, template_gold.cpp s'est plaint de ne pas avoir inclus stdafx.h, donc je l'ai inclus. Maintenant, la construction échoue avec ceci:

 1> ------ Construction commencée: Projet: CUDASandbox, Configuration: Debug x64 ------ 
 1> Compilation ... 
 1> template_gold. cpp 
 1> Liaison ... 
 1> LIBCMT.lib (crt0.obj): erreur LNK2019: symbole externe non résolu principal référencé dans la fonction __tmainCRTStartup 
 1> D:\Stuff\Programming\Visual Studio 2008\Projects\CUDASandbox\x64\Debug\CUDASandbox.exe: erreur fatale LNK1120: 1 externals non résolus 
 1> Le journal de génération a été enregistré dans "file: // d:\Stuff\Programming\Visual Studio 2008\Projects\CUDASandbox\CUDASandbox\x64\Debug\BuildLog.htm "
 1> CUDASandbox - 2 erreur (s), 0 avertissement (s) 
 ======= === Build: 0 réussi, 1 échoué, 0 à jour, 0 ignoré ========== 
27
Mr Bell

[~ # ~] note [~ # ~] Avec la sortie de la version 3.2 de CUDA Toolkit, NVIDIA inclut maintenant le fichier rules avec le Toolkit par opposition au SDK. Par conséquent, j'ai divisé cette réponse en deux moitiés, utilisez les instructions appropriées pour votre version de la boîte à outils.

[~ # ~] note [~ # ~] Ces instructions sont valides pour Visual Studio 2005 et 2008. Pour Visual Studio 2010 voir cette réponse .


CUDA TOOLKIT 3.2 et versions ultérieures

Je recommande d'utiliser le fichier NvCudaRuntimeApi.rules (Ou NvCudaDriverApi.rules Si vous utilisez l'API du pilote) fourni par NVIDIA, il est publié avec la boîte à outils et prend en charge les derniers indicateurs du compilateur de manière conviviale. Personnellement, je déconseillerais d'utiliser l'assistant VS, mais uniquement parce que je ne pense vraiment pas que vous en ayez besoin.

Le fichier de règles (installé dans le répertoire Program Files\Microsoft Visual Studio 9.0\VC\VCProjectDefaults) "Enseigne" à Visual Studio comment compiler et lier les fichiers .cu de votre projet dans votre application.

  • Créez un nouveau projet à l'aide des assistants MS standard (par exemple, un projet de console vide)
  • Implémentez votre code hôte (série) dans des fichiers .c ou .cpp
  • Implémentez vos wrappers et noyaux dans des fichiers .cu
  • Ajoutez le NvCudaRuntimeApi.rules (Clic droit sur le projet, Custom Build Rules, cochez la case correspondante), voir note 1
  • Ajoutez la bibliothèque d'exécution CUDA (clic droit sur le projet et choisissez Propriétés, puis dans Linker -> General ajouter $(CUDA_PATH)\lib\$(PlatformName) au = Répertoires de bibliothèques supplémentaires et dans Linker -> Input ajouter cudart.lib Aux Dépendances supplémentaires), voir les notes [2] et [3]
  • Ajoutez éventuellement les fichiers d'inclusion CUDA au chemin de recherche, requis si vous incluez des fichiers CUDA dans vos fichiers .cpp (par opposition aux fichiers .cu) (faites un clic droit sur le projet et choisissez Propriétés, puis dans C/C++ -> General ajouter $(CUDA_PATH)\include au Additional Include Directories), voir la note [3]
  • Ensuite, créez simplement votre projet et les fichiers .cu seront compilés en .obj et ajoutés automatiquement au lien

Quelques autres conseils:

  • Modifiez la génération de code pour utiliser le runtime C chargé statiquement pour correspondre au runtime CUDA; faites un clic droit sur le projet et choisissez Propriétés, puis dans C/C++ -> Génération de code changez le Runtime Library en/MT (ou/MTd pour le débogage, auquel cas vous devrez mettre cela en miroir dans Runtime API -> Host -> Runtime Library), voir la note [4]
  • Activez la coloration syntaxique à l'aide du fichier usertype.dat inclus avec le SDK, voir le readme.txt dans <sdk_install_dir>\C\doc\syntax_highlighting\visual_studio_8

Je recommanderais également d'activer la prise en charge d'Intellisense avec l'entrée de registre suivante (remplacez 9.0 par 8.0 pour VS2005 au lieu de VS2008):

[HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\9.0\Languages\Language Services\C/C++]
"NCB Default C/C++ Extensions"=".cpp;.cxx;.c;.cc;.h;.hh;.hxx;.hpp;.inl;.tlh;.tli;.cu;.cuh;.cl"

Soit dit en passant, je recommanderais d'éviter si possible cutil , à la place de lancer votre propre vérification. Cutil n'est pas pris en charge par NVIDIA, il est simplement utilisé pour essayer de garder les exemples du SDK concentrés sur la conception réelle du programme et de l'algorithme et éviter de répéter les mêmes choses dans chaque exemple (par exemple, l'analyse de la ligne de commande). Si vous écrivez le vôtre, vous aurez un bien meilleur contrôle et saurez ce qui se passe. Par exemple, le wrapper cutilSafeCall appelle exit() si la fonction échoue - une application réelle (par opposition à un échantillon) devrait probablement gérer l'échec plus élégamment!


CUDA TOOLKIT 3.1 et versions antérieures

J'utiliserais le fichier Cuda.rules Fourni par NVIDIA avec le SDK, il est publié avec la boîte à outils et prend en charge les derniers drapeaux du compilateur de manière conviviale. Personnellement, je déconseillerais d'utiliser l'assistant VS, mais uniquement parce que je ne pense vraiment pas que vous en ayez besoin.

Le fichier de règles (dans le répertoire C\common du SDK) "enseigne" à Visual Studio comment compiler et lier les fichiers .cu de votre projet dans votre application.

  • Créez un nouveau projet à l'aide des assistants MS standard (par exemple, un projet de console vide)
  • Implémentez votre code hôte (série) dans des fichiers .c ou .cpp
  • Implémentez vos wrappers et noyaux dans des fichiers .cu
  • Ajoutez le Cuda.rules (Clic droit sur le projet, Custom Build Rules, recherchez le fichier de règles et assurez-vous qu'il est coché)
  • Ajoutez la bibliothèque d'exécution CUDA (clic droit sur le projet et choisissez Propriétés, puis dans Linker -> General ajouter $(CUDA_LIB_PATH) au = Répertoires de bibliothèques supplémentaires et dans Linker -> Input ajouter cudart.lib Aux Dépendances supplémentaires), voir note [2] ci-dessous
  • Ajoutez éventuellement les fichiers d'inclusion CUDA au chemin de recherche, requis si vous incluez des fichiers CUDA dans vos fichiers .cpp (par opposition aux fichiers .cu) (faites un clic droit sur le projet et choisissez Propriétés, puis dans C/C++ -> Général ajouter $(CUDA_INC_PATH) au Répertoires d'inclusion supplémentaires)
  • Ensuite, créez simplement votre projet et les fichiers .cu seront compilés en .obj et ajoutés automatiquement au lien

Quelques autres conseils:

  • Modifiez la génération de code pour utiliser le runtime C chargé statiquement pour correspondre au runtime CUDA, faites un clic droit sur le projet et choisissez Properties, puis dans C/C++ -> Code Generation changez la Runtime Library en/MT (ou/MTd pour le débogage, auquel cas vous devrez refléter cela dans Règle de construction CUDA -> Options hybrides CUDA/C++), voir la note [4]
  • Activez la coloration syntaxique à l'aide du fichier usertype.dat inclus avec le SDK, voir le readme.txt dans <sdk_install_dir>\C\doc\syntax_highlighting\visual_studio_8

Je recommanderais également d'activer la prise en charge d'Intellisense avec l'entrée de registre suivante (remplacez 9.0 par 8.0 pour VS2005 au lieu de VS2008):

[HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\9.0\Languages\Language Services\C/C++]
"NCB Default C/C++ Extensions"=".cpp;.cxx;.c;.cc;.h;.hh;.hxx;.hpp;.inl;.tlh;.tli;.cu;.cuh;.cl"

Soit dit en passant, je recommanderais d'éviter si possible cutil , à la place de lancer votre propre vérification. Cutil n'est pas pris en charge par NVIDIA, il est simplement utilisé pour essayer de garder les exemples du SDK concentrés sur la conception réelle du programme et de l'algorithme et éviter de répéter les mêmes choses dans chaque exemple (par exemple, l'analyse de la ligne de commande). Si vous écrivez le vôtre, vous aurez un bien meilleur contrôle et saurez ce qui se passe. Par exemple, le wrapper cutilSafeCall appelle exit() si la fonction échoue - une application réelle (par opposition à un échantillon) devrait probablement gérer l'échec plus élégamment!


[~ # ~] note [~ # ~]

  1. Vous pouvez également utiliser une fonction de règles spécifiques à la version de Toolkit, par exemple NvCudaRuntimeApi.v3.2.rules. Cela signifie qu'au lieu de chercher la boîte à outils CUDA dans% CUDA_PATH%, elle cherchera dans% CUDA_PATH_V3_2%, ce qui signifie que vous pouvez avoir plusieurs versions de la boîte à outils CUDA installées sur votre système et que différents projets peuvent cibler différentes versions. Voir également la note [3].
  2. Le fichier de règles ne peut pas modifier les paramètres de compilation et de l'éditeur de liens C/C++, car il ajoute simplement des paramètres de compilation pour le code CUDA. Par conséquent, vous devez effectuer cette étape manuellement. N'oubliez pas de le faire pour toutes les configurations!
  3. Si vous souhaitez stabiliser sur une version spécifique de CUDA Toolkit, vous devez remplacer CUDA_PATH par CUDA_PATH_V3_2. Voir aussi la note 1 .
  4. Une version non concordante du runtime C peut causer divers problèmes; en particulier si vous avez des erreurs concernant LIBCMT (par exemple LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs) ou si vous multipliez les symboles définis pour les fonctions de bibliothèque standard, alors cela devrait être votre premier suspect.
45
Tom

Quelle belle question !! Pour toute la documentation CUDA là-bas, c'est quelque chose que j'ai toujours pensé être une omission évidente ... En fait, je suis vraiment content d'avoir trouvé ce post, car après avoir utilisé CUDA pendant un bon moment, je n'avais toujours pas ' J'ai trouvé un moyen officiel correct d'amener VS à produire un programme CUDA à partir de zéro.

Quand j'ai eu besoin de démarrer un nouveau programme CUDA, j'ai toujours copié et modifié l'exemple "template" du répertoire SDK. Ce n'est peut-être pas exactement ce que vous recherchez, car il ne démarre pas à neuf, mais est un moyen rapide d'obtenir un CUDA-capable projet fonctionnant dans VS avec tous les noms de projet/fichier corrects ...

  1. Faites une copie de l'exemple "template" du SDK, et renommez le répertoire - le seul contenu nécessaire dans le répertoire sont le code source et les fichiers VS .sln et .vcproj
  2. Renommez les fichiers .sln et .vcproj
  3. Ouvrez le fichier .sln dans un éditeur de texte et renommez la variable Project et . Vcproj filename dans la 3ème ligne du fichier
  4. Ouvrez le fichier .vcproj dans un éditeur de texte et renommez les variables Name et RootNamespace dans les premières lignes du fichier
  5. Ouvrez le projet avec VS, et ouvrez les pages de propriétés (clic droit sur le nom du projet dans le volet Explorateur de solutions, sélectionnez "Propriétés")
  6. Changez le nom Output File dans les pages de propriétés (sous Propriétés de configuration -> Linker -> General) ... Avant de changer le nom de fichier, je sélectionne "Toutes les configurations " dans le menu déroulant Configuration et " x64 " dans le menu déroulant Plate-forme, puisque je suis sur un système 64 bits
  7. Changer le Program Database File name dans les Property Pages (sous Configuration Properties -> Linker -> Debugging) ... Avant de changer le nom de fichier, je sélectionne "Debug " et " x64 " dans les menus déroulants.
4
tpm1510
3
Salman Ul Haq
  • Installez l'assistant CUDA VS. Il installera VS et ajoutera le projet CUDA au menu "nouveau projet".
  • Assurez-vous que le compilateur x64 est installé (doit être vérifié lors de l'installation de VS).
  • Vérifiez si vous avez des bibliothèques x64, des includes, un répertoire nvcc et dans le chemin de recherche.
  • Créez un nouveau projet à l'aide du modèle CUDA.
  • Modifiez le type de projet sur x64 et le paramètre CUDA sur Native (si vous avez une carte compatible nv cuda) ou l'émulation dans le cas contraire.
  • Le modèle créera des règles de construction personnalisées qui compilent les fichiers .cu avec nvcc et d'autres fichiers avec le compilateur par défaut.
  • si, vs essaie de compiler des fichiers .cu avec le compilateur C/C++, cliquez sur ce fichier dans l'explorateur de solutions et désactivez la compilation pour ces fichiers (point rouge sur l'icône du fichier)

Des informations supplémentaires sur l'installation de l'assistant CUDA sur VS2008 peuvent être trouvées ici et ici

[Éditer]
Si vous ne souhaitez pas utiliser l'assistant, vous devez configurer manuellement les chemins CUDA lib/include/nvcc et ajouter des règles de construction personnalisées à chaque nouveau programme CUDA. Pour plus d'informations sur la manière de procéder, consultez la réponse de Tom.

3
beermann