2012-02-06 2 views
3

J'ai un programme CUDA. Si je compile ce programme avec l'option -g -G, je peux obtenir la bonne sortie. Si je le compile sans l'option -g -G, je n'ai pas toujours la bonne sortie. Ma conjecture est que sans l'option -g -G, le compilateur optimisera le programme et provoquera la condition de course. Quelqu'un peut-il confirmer cela, et laissez-moi savoir ce que je devrais faire pour que le programme produise la sortie correcte même si je compile le programme sans l'option -g -G. MerciQuelle est la différence lors de la compilation d'un programme CUDA avec ou sans option -g -G

système d'exploitation: x86_64 GNU/Linux Version CUDA: 4.0 appareil: 200 Geforce, il est l'un des GPUS attachés à la machine, et je ne pense pas que ce soit un dispositif d'affichage.

Répondre

4

-G active le code du dispositif de mise au point (en générant des symboles de mise au point) et désactive les optimisations pour le code du dispositif. -g est une option pour le compilateur hôte qui permet de générer des symboles de débogage pour le code hôte (et peut désactiver les optimisations de code hôte).

Cela indique probablement une condition de concurrence dans votre code qui est éliminée lorsque les optimisations sont désactivées. Vous pouvez, par exemple, manquer un __syncthreads() dans votre code d'appareil qui rendrait le code correct. Sans cela, le compilateur peut être en train de déplacer des charges ou des magasins qui provoquent des résultats incorrects. Un tel mouvement de code est une optimisation parfaitement valide si les barrières (__syncthreads()) ne sont pas franchies. Lorsque vous spécifiez -G, ces optimisations sont probablement désactivées et, par conséquent, la condition de concurrence ne se manifeste pas. Tout d'abord, assurez-vous que le code GPU est défaillant et non le code CPU en désactivant le débogage GPU (supprimer -G) mais en activant le débogage CPU (laissez -g). Ensuite, affinez-le en fonction du noyau spécifique défaillant (le processus de réduction de cette valeur dépend du programme). Inspectez ce noyau et recherchez les endroits où vous pourriez avoir besoin de synchronisation (les dépendances de mémoire partagée sont la situation courante) mais ne l'avez pas.

Si vous ne pouvez pas le trouver, mais vous pouvez le réduire au noyau spécifique qui obtient de mauvais résultats, essayez de partager le code du noyau ici si vous le pouvez, afin que d'autres puissent vous aider à voir le problème.

+3

Une autre possibilité (pas nécessairement spécifique à CUDA) est l'existence de variables non initialisées qui prennent des valeurs différentes en conséquence du code de débogage par rapport au code de libération. Cela peut également affecter le comportement du programme. –

+0

Oui, et je ne peux pas croire que je n'ai pas inclus cela. C'est la cause la plus commune de "ne fonctionne que dans les versions de débogage" bogues ... – harrism

Questions connexes