1

Was sind die allgemeinen Strategien Debuggen von numerischen Code zu starten, wenn:Wie wird mit dem Debuggen von Zahlencode begonnen, wenn NaN nur angezeigt werden, wenn sie mit Optimierungen kompiliert wurden?

  • Code mit aggressiven Optimierungs-Flags zusammengestellt, occational NaN produziert das und Inf die in der Ausgabe
  • Code kompiliert mit -g für den Betrieb (die -O0 impliziert) mit Debugger, erzeugt NaN's und Infs nicht mehr?

In diesem Fall habe ich mit der Portland Group C++ Compiler, PGCC und verwendeten Optionen Optimierung arbeitete

-w -fast -O3 -Mipa=fast -Mfprelaxed -Minline=levels:10

und dann nur

-w -g

für die Debugging-Version . Aber ich bin sicher, dass eine ähnliche Situation mit g++ auch passieren könnte.

EDIT: Hinzufügen von Druckanweisungen ist keine sehr verlockende Option, da der Code nicht von mir geschrieben wird, es mehrere tausend Zeilen groß ist, und ich habe keine Ahnung, die Suche einzuschränken; Die NaNs können von überall her stammen.

+0

Können Sie Druckanweisungen hinzufügen? –

+2

Wenn die Korrektheit einen höheren Wert als die Geschwindigkeit aufweist, sollten Sie auf Optimierungen verzichten, die Sie nicht steuern. –

+0

Alex: Es wäre schön, die verdächtigen Zeilen im Quellcode zu finden, um sie sehen zu können und zu entscheiden, ob sie richtig erscheinen. –

Antwort

3

Ich würde versuchen, um zu sehen, ob Sie Gleitkommaausnahmen like done here aktivieren können, dann sehen, ob es eine Ausnahme gibt, die von irgendeiner Signalisierung Nan geworfen wird. Es gibt wahrscheinlich ein Compiler-Flag in Ihrem Compiler, um diese Ausnahmen zu aktivieren.

Kurz gesagt, würde ich manuelle binäre Suche tun. Das heißt, schreiben Sie eine Funktion, die alle Variablen ausgibt. Teilen Sie dann das Programm in zwei Hälften, nicht nach Codezeilen, sondern nach dem, was tatsächlich ausgeführt wird, und isolieren Sie es. Mit anderen Worten, krempeln Sie die Ärmel hoch und steigen Sie ein.

Bearbeiten: Dies gilt möglicherweise nicht für Ihren Fall, da der Link, den ich Ihnen gab, sehr Win32-spezifisch war. Aber vielleicht gibt es dir ein paar Hinweise. Oder Sie könnten den Code auf einem kostenlosen MS-Compiler versuchen?

+0

+1: [Wolfszaun in Alaska] (http://www.google.com/search?q=wolf+fence+in+alaska) (binäre AKA-Suche) ist bei richtiger Verwendung sehr effektiv. 20 Pässe reduzieren Ihr Problem um einen Faktor von 2^20 oder 1.000.000+. Es ist besonders nützlich, wenn es um Black Box®-Probleme geht, eine Klasse, die das Optimieren von Compilern beinhaltet. –

2

Die Compiler von Portland Group bieten einige Optionen, um die Richtlinie zu begleiten - Mfprelaxed; Ich würde versuchen, diese nacheinander zu setzen und zu sehen, welche einen Unterschied machen. Vielleicht möchten Sie diese Direktive einfach aus Ihrer Zusammenstellung löschen.

2

Ich möchte darauf hinweisen, dass im Fall von g ++ das Flag -g Optimierungen nicht unterdrückt (dh es bedeutet nicht -O0). Eine optimierte ausführbare Datei, die Debuginformationen enthält, ist schwieriger zu debuggen, aber es ist sicherlich möglich, dies zu tun.

Verwandte Themen