Heim > Backend-Entwicklung > C++ > Warum ist das Hinzufügen von 0,1f zu einem Float-Array wesentlich langsamer als das Hinzufügen von 0, und wie kann dieses Leistungsproblem behoben werden?

Warum ist das Hinzufügen von 0,1f zu einem Float-Array wesentlich langsamer als das Hinzufügen von 0, und wie kann dieses Leistungsproblem behoben werden?

Susan Sarandon
Freigeben: 2024-12-19 13:10:10
Original
558 Leute haben es durchsucht

Why is adding 0.1f to a float array significantly slower than adding 0, and how can this performance issue be addressed?

Warum verlangsamt das Hinzufügen von 0,1f zu einem Float-Array die Leistung um das Zehnfache im Vergleich zum Hinzufügen von 0?

Der Leistungsunterschied ergibt sich aus der Handhabung von denormalen (oder subnormalen) Gleitkommazahlen durch Prozessoren. Denormale Zahlen stellen Werte dar, die sehr nahe bei Null liegen, was sich erheblich auf die Leistung auswirken kann.

Wenn Sie 0,1f zu einem Float-Array hinzufügen, kann das Ergebnis eine denormale Zahl sein, auch wenn dies bei den ursprünglichen Werten nicht der Fall war. Dies liegt an der begrenzten Genauigkeit der Gleitkommadarstellung. Operationen mit denormalen Zahlen sind normalerweise viel langsamer als mit normalisierten Zahlen, da viele Prozessoren sie nicht direkt verarbeiten können und sie mithilfe von Mikrocode auflösen müssen.

Im Gegensatz dazu führt das Hinzufügen von 0 zu einem Float-Array nicht zu denormalen Zahlen. Dies liegt daran, dass 0 bereits eine normalisierte Zahl ist. Daher können Operationen mit 0 viel effizienter ausgeführt werden.

Um die Auswirkungen denormaler Zahlen auf die Leistung zu demonstrieren, betrachten Sie den folgenden Code:

const float x[16] = {  1.1,   1.2,   1.3,     1.4,   1.5,   1.6,   1.7,   1.8,
                       1.9,   2.0,   2.1,     2.2,   2.3,   2.4,   2.5,   2.6};
const float z[16] = {1.123, 1.234, 1.345, 156.467, 1.578, 1.689, 1.790, 1.812,
                     1.923, 2.034, 2.145,   2.256, 2.367, 2.478, 2.589, 2.690};
float y[16];
for (int i = 0; i < 16; i++)
{
    y[i] = x[i];
}

for (int j = 0; j < 9000000; j++)
{
    for (int i = 0; i < 16; i++)
    {
        y[i] *= x[i];
        y[i] /= z[i];
        y[i] = y[i] + 0.1f; // <--
        y[i] = y[i] - 0.1f; // <--
    }
}
Nach dem Login kopieren

Hier wird 0,1f zum Float-Array hinzugefügt führt zu einer erheblichen Verlangsamung, da die resultierenden Werte in denormale Zahlen umgewandelt werden.

Um die Auswirkungen denormaler Zahlen auf die Leistung zu vermeiden, können Sie die verwenden _MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON); intrinsisch, um Denormale auf Null zu löschen. Das bedeutet, dass jeder Wert, der nicht normal gewesen wäre, stattdessen auf Null gerundet wird. Durch die Verwendung dieser Funktion können Sie die Leistung Ihres Codes bei der Arbeit mit Gleitkomma-Arrays erheblich verbessern.

Das obige ist der detaillierte Inhalt vonWarum ist das Hinzufügen von 0,1f zu einem Float-Array wesentlich langsamer als das Hinzufügen von 0, und wie kann dieses Leistungsproblem behoben werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage