2017-05-03 5 views
-1

Ich habe ein Problem in meinem Code und muss es debuggen. Versucht alles, was ich denken kann, aber kann das Problem nicht finden, ohne ein Debugging ähnlich wie serielle Debugging und mein Problem kommt auf diese:cuda nsight Visual Studio Edition Kernel-Debugging

Dies ist ein Teil eines Beispielcodes, der derjenige ist, der sich darstellt, wenn Sie erstellen neues CUDA-Projekt in VS (die gleiche wie hier https://www.youtube.com/watch?v=Ed_h2km0liI), aber meine Frage ist:

enter image description here

ich habe gerade die Linien 13-18 und mehrere Haltepunkte hinzugefügt, die mein Problem beschreiben. Wie kann ich diesen Kernel debuggen (sagen wir Thread 1) und n von 0-4 zu iterieren, weil so scheint die Schleife zu iterieren (wenn ich fortfahren, springt es durch die Haltepunkte 5 mal), aber n ist immer 'n' hat keinen Wert am Zielort

+0

Was passiert, wenn Sie es mit einem weniger trivialen Beispiel versuchen? Diese Schleife ist so trivial, dass sie nicht in Code eingeordnet werden kann, den der Debugger zur Laufzeit getreu darstellen kann. – talonmies

+0

in Code mit meinem Problem, jede Variable, die innerhalb der Kernel-Funktion deklariert wird, hat keinen Wert während des Debuggens, so nehme ich an, dass ich etwas falsch mache und nur die Hauptfunktion Debuggen (aber nicht verstehen, warum es die Schleife Schritte registriert mit Haltepunkten dann) – user3338991

Antwort

0

Dies ist aufgrund von Optimierungen. Der Compiler erkennt wahrscheinlich, dass die Schleife eine konstante Anzahl von Iterationen aufweist und rollt sie statisch ab. In der Tat kann die Schleife durch c[i] = 5 ersetzt werden, da die einzige beobachtbare Änderung in der letzten Iteration ist. Sie können diese Hypothese überprüfen (oder widerlegen), indem Sie das generierte PTX überprüfen.

standardmäßig CUDA Werkzeugkette führt einige der kritischen Compiler-Optimierungen auch in Debug-Konfiguration (zB Optimierungen hinsichtlich der Verteilung registrieren)

Zur Umgehung dieses:

  • stellen Sie sicher, Sie zu bauen und die Debug-Konfiguration ausführen und Optimierungen sind in der Tat
  • stellen Sie sicher, Debug-Symbole sind aktiviert durch Zugabe von folgenden Compiler-Flags deaktiviert:

    -g -G 
    
  • versuchen, den Rest von Optimierungen für alle Werkzeuge durch Zugabe von folgendem Compiler-Flags

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

Diese Flags deutlich erhöhen binäre Größe zu deaktivieren, Programm machen extrem langsam zu sein und viel zu konsumieren mehr wertvolle Register und On-Board-Speicher (bis zu dem Punkt, wo das Programm nicht läuft). Verwenden Sie nur für kleine Teile des Codes und wenn für das Debuggen erforderlich. Alternativ können Sie eine nicht konstante Schleifengrenze implementieren (z. B. eine Variable, die zur Laufzeit übergeben wird) und dafür sorgen, dass das Schleifenergebnis von vorherigen Iterationen abhängt, sodass der Compiler die Möglichkeit verliert, die Schleife zu optimieren.

+0

Danke für die Antwort, aber ich scheine die Optionen nicht richtig einstellen zu können. Auf Projekt-Eigenschaft (alle Konfigurationen, alle Plattformen) -> Konfigurationseigenschaften -> CUDA C/C++ -> Host Ich habe Ihre Compiler-Flags in zusätzliche COmpiler-Optionen eingegeben. Die Optimierung derselben Registerkarte wird deaktiviert und generiert debug für den Host als Ja (-g). In der Geräte-Registerkarte habe ich GPU-Debug generieren - ja (-G). Beim Erstellen bekomme ich: ignoring unbekannte Option für jede Option in zusätzlichen Compiler-Optionen. Und n ist immer noch ohne Wert. Sorry für grundlegende Fragen, ich bin nur ein Hobby-Programmierer, der unterwegs lernt. – user3338991

+1

Ich glaube nicht, dass das richtig ist. Jede Debugging-Erstellung mit nvcc deaktiviert alle Optimierungen und die Schleife sollte ausgegeben werden und alle Zeichen zeigen auf den Code, der bereits mit dem Debugging erstellt wurde. – talonmies

+0

Also besteht die einzige Lösung darin, n außerhalb des Kernels zu übergeben? Wie zum Beispiel in diesem Fall, um nur c [i] = n zu überwachen (was zum Debuggen sichtbar ist)? Gibt es keine einfachere Lösung, um den Inhalt des Kernels richtig zu debuggen, da keine der Variablen, die direkt in der Kernelfunktion enthalten sind, in VS nsight debuggen sichtbar ist? – user3338991

Verwandte Themen