2010-10-27 15 views
1

J'ai écrit une application CUDA qui contient des paramètres codés en dur (via #define s). Tout semblait fonctionner correctement, alors j'ai essayé d'autres paramètres. Maintenant, le programme ne fonctionne plus correctement.CUDA: Déboguer avec -deviceemu et gdb

Donc, je veux le déboguer. Je compile l'application avec -deviceemu -g -O0 options, parce que j'ai lu que je peux alors utiliser gdb pour le déboguer. Dans gdb, j'ai défini un point d'arrêt au démarrage du noyau en utilisant break kernelstart.

Cependant, gdb, saute au début de mon noyau CUDA, mais je ne peux pas passer à travers, car il ne me laisse pas inspecter les choses dans le noyau. Je pense qu'il est préférable que je donne la sortie de gdb:

Breakpoint 1, kernelstart (__cuda_0=0x100000, __cuda_1=0x101000, __cuda_2=0x102000, __cuda_3=0x102100) at cudatest.cu:287 
(gdb) s 
__device_stub__Z12kernelstartPjS_S_S_ (__par0=0x100000, __par1=0x101000, __par2=0x102000, __par3=0x102100) at /tmp/tmpxft_000003c4_00000000-1_cudatest.cudafe1.stub.c:7 
7 /tmp/tmpxft_000003c4_00000000-1_cudatest.cudafe1.stub.c: No such file or directory. 
    in /tmp/tmpxft_000003c4_00000000-1_cudatest.cudafe1.stub.c 
(gdb) s 
cudaLaunch<char> (entry=0x804a98d "U\211\345\203\354\030\213E\024\211D$\f\213E\020\211D$\b\213E\f\211D$\004\213E\b\211\004$\350\r\377\377\377\311\303U\211\345\203\354\070\307\004$\340 \005\b\350\345\341\377\377\243P!\005\b\307\004$x\234\004\b\350\b\001") at /usr/local/cuda/bin/../include/cuda_runtime.h:773 
(gdb) s 
(gdb) s 
cudatest (__cuda_0=0x100000, __cuda_1=0x101000, __cuda_2=0x102000, __cuda_3=0x102100) at cudatest.cu:354 
(gdb) s 

Après, cela, il saute à ma procédure main.

Je sais que mes spécifications sont plus que vagues, mais quelqu'un peut-il deviner où est le problème? Est-il possible d'inspecter les noyaux en utilisant gdb?

Répondre

7
  1. utilisation cuda-gdb
  2. Compile: nvcc -g -G filename.cu
  3. Invoke cuda-gdb sur votre a.out
  4. Vous pouvez définir votre fonction point d'arrêt à l'intérieur du noyau comme d'habitude.
  5. Exécutez le programme, et il devrait s'arrêter à l'intérieur de votre fonction noyau.
  6. Vous pouvez même obtenir des détails sur le thread en cours d'exécution à l'aide de commandes telles que cuda thread. D'autres commandes comme cuda block existent.
  7. Pour passer entre les fils disent cuda thread (x,y,z)

Pour plus de détails, voir la dernière version de la documentation cuda-gdb. Si vous utilisez la dernière version de cuda toolkit (c.-à-d. 3.2 à partir d'aujourd'hui), assurez-vous de consulter la dernière version de la documentation (les options ont beaucoup changé).

Et assurez-vous également que vous exécutez cuda-gdb à partir d'une console (en dehors de X11), puisque vous arrêtez votre GPU pour le débogage.

Espérons que cela aide.

1

Compiler avec:

nvcc -g -G --keep

résolu ce problème pour moi. Cela garantit que tous les fichiers intermédiaires générés lors de la compilation ne sont pas effacés afin que le débogueur puisse les trouver.

+0

Je ne pense pas que les informations de "--keep" ne sont pas nécessaires pour un débogueur comme gdb. "--keep" est juste pour garder l'ensemble et le code source original ensemble dans le même fichier. – codetwiddler