Ich schreibe numerische Echtzeit-Software in C ++, die ich derzeit mit Visual-C ++ 2008 kompiliere.
Mit dem 'schnellen' Gleitkomma-Modell ( /fp:fast
), verschiedene Optimierungen, die meisten von ihnen sind nützlich für meinen Fall, aber speziell:
ist für viele meiner Berechnungen zu numerisch instabil.
(siehe: Microsoft Visual C ++ Gleitkommaoptimierung )
Durch den Wechsel zu /fp:precise
wird meine Anwendung mehr als doppelt so langsam ausgeführt. Ist es möglich, den Optimierer fein abzustimmen (dh diese spezifische Optimierung zu deaktivieren) oder ihn irgendwie manuell zu umgehen?
- Beispiel für einen Minimalcode: -
%Vor%[mein tatsächlicher Code ist meistens matrixbezogene Algorithmen]
Ausgabe: VC (cl, Version 15, 0x86) ist:
%Vor%Ein div anstelle von zwei ist ein großes numerisches Problem, (xmm0, wird mit 1.0f aus dem RAM geladen), da abhängig von den Werten von xmm1,2 (die in verschiedenen Bereichen liegen können) Sie viel verlieren können der Genauigkeit (kompiliert ohne SSE, gibt ähnlichen Stack-x87-FPU-Code aus).
Einpacken der Funktion mit
%Vor%Löst das Genauigkeitsproblem, aber erstens ist es nur auf einer Funktionsebene (global-scope) verfügbar, und zweitens verhindert es das Inlining der Funktion (dh die Geschwindigkeitsbegrenzungen sind zu hoch)
'präzise' Ausgabe wird geworfen, um 'hin und her' zu verdoppeln:
%Vor%Dieses Dokument besagt, dass Sie die Float-Pointing-Optimierungen Zeile für Zeile mithilfe von Pragmas steuern können.
Tags und Links optimization c++ visual-c++ floating-point floating-accuracy