Fließkomma-C ++ - Compiler-Optionen | Verhindern von a / b - a * (1 / b)

8

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:

%Vor%

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%     
oyd11 04.08.2010, 16:10
quelle

5 Antworten

0

(Weird) Lösung, die ich gefunden habe: wenn immer durch den gleichen Wert in einer Funktion dividiert - fügen Sie etwas Epsilon hinzu:

%Vor%

- & gt;

%Vor%

Schützt Sie auch von gelegentlichen div durch Null

    
oyd11 08.08.2010, 15:03
quelle
3

Fügen Sie das

hinzu

#pragma float_control( precise, on)

vor der Berechnung und

#pragma float_control( precise,off)

danach. Ich denke, das sollte es tun.

    
Gangadhar 04.08.2010 16:39
quelle
2

Dieses Dokument besagt, dass Sie die Float-Pointing-Optimierungen Zeile für Zeile mithilfe von Pragmas steuern können.

    
Oliver Charlesworth 04.08.2010 16:16
quelle
1

Es gibt auch __assume. Sie können __assume (a / b! = (A * (1 / b))) verwenden. Ich habe __assume nie wirklich benutzt, aber theoretisch existiert es genau, um den Optimierer fein abzustimmen.

    
Puppy 08.08.2010 15:15
quelle
0

Können Sie die Funktionen mit diesen Berechnungen in eine separate Quellcodedatei einfügen und nur diese Datei mit den verschiedenen Einstellungen kompilieren?

Ich weiß nicht, ob das sicher ist, aber Sie müssen das überprüfen!

    
jcoder 04.08.2010 16:17
quelle