2017-11-03 4 views
2

Ich möchte temporär FTZ/DAZ Modi aktivieren, um eine Leistungssteigerung für einige Code, wo strikte Einhaltung der IEEE 754 Standard ist kein Problem, ohne das Verhalten anderer Threads, die Code ausgeführt werden könnten, wo diese Einhaltung ist wichtig.Kann ich die FTZ- und DAZ-Gleitkomma-Modi vorübergehend für einen Thread aktivieren?

Ich habe gelesen this auf, wie diese Modi und this auf die Leistung Auswirkungen der Denormals Handhabung zu aktivieren/deaktivieren, aber leider habe ich einen gemischten Code in einer Multithread-Umgebung, und ich kann diese Modi nicht aktivieren und für einmal alle.

Mein Verständnis ist, dass seit MXCSR Registerflags das Verhalten der Hardware bestimmen und da jeder Thread seinen eigenen Kontext von Registern hat, wird das Setzen dieser Flags nur das Verhalten des aktuellen Threads beeinflussen.

Ist es richtig?

Antwort

5

Ja MXCSR ist Teil der Pro-Thread-Architekturzustand gespeichert/von Kontextumschaltungen wieder hergestellt, zusammen mit den XMM/ymm/ZMM und x87 Stapelregister (xsave/xrstor verwenden). Verschiedene Threads haben ihren eigenen FPU-Status.


Interessante Idee, würde ich immer dachte DAZ war nur dann sinnvoll, wenn Sie denormal Konstanten oder etwas (oder Daten aus einer Datei) hatte, aber ohne FTZ laufen andere Fäden, ist eine weitere Quelle von denormals.

Sie können auch einige Dateien mit -ffast-math oder eine Teilmenge dieser Optionen kompilieren. Beachten Sie, dass Verknüpfung mit -ffast-math in gcc eine CRT-Funktion enthält, die DAZ/FTZ vor main() setzt, also tun Sie das nicht.

Die Optimierungen, die durch Fast-Math ermöglicht werden, sind meist orthogonal zu der Frage, ob die Denormals auf Null gesetzt werden. Sogar nur -fno-math-errno lässt mehr mathematische Funktionen inline (besser/überhaupt), z.B. sqrtf, und ist völlig sicher, wenn Sie sich nicht darum kümmern, errno gesetzt wird sowie ein NaN-Ergebnis erhalten.

Verwandte Themen