Einfluss subnormaler Gleitkommazahlen auf die Leistung
Im bereitgestellten Codeausschnitt wirkte sich eine geringfügige Änderung, die unbedeutend schien, erheblich auf die Leistung aus: Änderung 0,1f auf 0 führte zu einer 10-fachen Verlangsamung. Dieser Leistungsunterschied ergibt sich aus der Handhabung subnormaler (denormalisierter) Gleitkommazahlen.
Subnormale Zahlen stellen eine Annäherung an Null dar und sind kleiner als die kleinste darstellbare normale Gleitkommazahl. Sie resultieren häufig aus Operationen, die sehr kleine Werte erzeugen. Operationen mit subnormalen Zahlen sind im Vergleich zu Operationen mit normalisierten Gleitkommazahlen notorisch langsam. Dies liegt daran, dass viele Prozessoren nicht in der Lage sind, subnormale Zahlen direkt zu verarbeiten, und stattdessen auf langsamere Mikrocode-Routinen zurückgreifen müssen.
Numerische Untersuchung
Die beiden Codeausschnitte, einer mit 0,1 f und der andere mit 0 erzeugen nach wiederholten Iterationen unterschiedliche Ausgaben. Bei Verwendung von 0,1f konvergieren die Werte zu Werten ungleich Null nahe Null. Bei Verwendung von 0 konvergieren die Werte jedoch gegen Null. Dieser Unterschied im numerischen Verhalten erklärt die Leistungslücke.
Denormal Flushing
Um zu überprüfen, ob subnormale Zahlen für die Leistungsunterschiede verantwortlich sind, können wir sie durch Addition auf Null leeren die folgende Zeile am Anfang des Codes:
_MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON);
Dies weist den Prozessor an, alle subnormalen Zahlen als Null zu behandeln. Mit dieser Änderung wird der Leistungsunterschied zwischen der Verwendung von 0,1f und 0 vernachlässigbar. Dies bestätigt, dass subnormale Zahlen tatsächlich die Ursache der Verlangsamung sind.
Schlussfolgerung
In diesem Szenario verbessert sich die Vermeidung der Entstehung subnormaler Zahlen durch Ersetzen von 0,1f durch 0 erheblich Leistung, indem verhindert wird, dass der Prozessor langsame, unterdurchschnittliche Zahlenverarbeitungsroutinen ausführt. Diese Optimierung erinnert an die manchmal nachteiligen Auswirkungen denormalisierter Gleitkommazahlen auf die Leistung und daran, wie wichtig es ist, ihre potenzielle Präsenz in numerischen Berechnungen zu berücksichtigen.
Das obige ist der detaillierte Inhalt vonWarum führt das Ersetzen von 0.1f durch 0 zu einer 10-fachen Leistungssteigerung in meinem Code?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!