2017-05-03 4 views
-1

J'ai un problème dans mon code et j'ai besoin de le déboguer. J'ai essayé tout ce que je peux penser, mais je ne peux pas trouver le problème sans un débogage similaire au débogage série et mon problème se résume à ceci:cuda nsight Visual Studio édition débogage du noyau

Ceci fait partie d'un exemple de code, qui est celui qui se présente si vous créez nouveau projet cuda dans VS (comme ici https://www.youtube.com/watch?v=Ed_h2km0liI), mais ma question est:

enter image description here

J'ai ajouté que les lignes 13-18 et plusieurs points d'arrêt, qui décrivaient mon problème. Comment puis-je déboguer ce noyau (disons thread 1) et obtenir n itérer réellement de 0-4, parce que comme ça, la boucle semble itérer (si je clique sur continuer, il saute à travers les points de rupture 5 fois), mais n est toujours 'n' n'a pas de valeur à l'emplacement cible

+0

Cette boucle est assez triviale pour ne pas correspondre au code que le débogueur peut représenter fidèlement à l'exécution. – talonmies

+0

dans le code avec mon problème, toute variable déclarée dans la fonction noyau n'a aucune valeur pendant le débogage, donc je suppose que je fais quelque chose de mal et débogage juste la fonction principale (mais je ne comprends pas pourquoi elle enregistre les pas de boucle avec des points d'arrêt puis) ​​ – user3338991

Répondre

0

Ceci est dû aux optimisations. Le compilateur est susceptible de détecter que la boucle a un nombre constant d'itérations et de le dérouler statiquement. En fait, la boucle peut être remplacée par c[i] = 5, car le seul changement observable est dans la dernière itération. Vous pouvez vérifier (ou réfuter) cette hypothèse en vérifiant le PTX généré.

Par défaut CUDA toolchain effectue certaines des optimisations du compilateur critiques même dans la configuration de débogage (par exemple des optimisations liées à s'inscrire allocation)

Pour contourner ce problème:

  • assurez-vous de construire et exécuter la configuration de débogage et optimisations sont en effet désactivées
  • faire des symboles de débogage sont bien activés en ajoutant suivants drapeaux du compilateur:

    -g -G 
    
  • essayer de désactiver le reste des optimisations pour tous les outils en ajoutant suivants drapeaux du compilateur

    -O0 -Xcompiler -O0 -Xcicc -O0 -Xptxas -O0 -lineinfo 
    

Ces drapeaux augmenter significativement la taille binaire, faire le programme d'être extrêmement lent et de consommer beaucoup plus de précieux registres et de la mémoire embarquée (jusqu'au point où le programme ne fonctionnera plus). Utilisez uniquement sur de petits morceaux de code et lorsque cela est nécessaire pour le débogage. Vous pouvez également implémenter une limite de boucle non constante (par exemple, une variable transmise au moment de l'exécution) et rendre le résultat de la boucle dépendant des itérations précédentes, de sorte que le compilateur perdra l'opportunité d'optimiser la boucle. Que se passe-t-il si vous l'essayez avec un exemple moins trivial?

+0

Merci pour la réponse, mais je ne semble pas être en mesure de définir les bonnes options. Sur la propriété du projet (toutes les configurations, toutes les plates-formes) -> propriétés de configuration -> CUDA C/C++ -> hôte J'ai entré les drapeaux du compilateur dans les options COmpiler supplémentaires. L'optimisation de l'onglet même est désactivée et génère un débogage de l'hôte sur yes (-g). Dans l'onglet périphérique, j'ai généré le déboguage GPU - oui (-G). Lors de la construction, j'obtiens: en ignorant l'option inconnue pour chaque option dans les options du compilateur supplémentaires. Et n est toujours sans valeur. Désolé pour les questions de base, je suis juste un programmeur de passe-temps à apprendre sur le pouce. – user3338991

+1

Je ne crois pas que ce soit correct. Toute construction de débogage avec nvcc désactive toutes les optimisations et la boucle doit être émise et tous les signes pointent vers le code déjà construit avec le débogage – talonmies

+0

Donc la seule solution est de passer n en dehors du noyau? Comme par exemple dans ce cas juste pour surveiller c [i] = n (qui est visible pour déboguer)? N'y a-t-il pas une solution plus simple pour déboguer correctement ce qui est dans le noyau, car aucune des variables qui vit juste à l'intérieur de la fonction du noyau n'est visible dans le débogage de VS nsight. – user3338991