Ist Float langsamer als Double? Läuft ein 64-Bit-Programm schneller als ein 32-Bit-Programm?

Ist Float langsamer als Double? Läuft ein 64-Bit-Programm schneller als ein 32-Bit-Programm?


Verwendet float Tippe langsamer als mit double eingeben?


Ich habe gehört, dass moderne Intel- und AMD-CPUs mit Doubles schneller rechnen können als mit Floats.


Was ist mit mathematischen Standardfunktionen (sqrt , pow , log , sin , cos , etc.)? Ihre Berechnung mit einfacher Genauigkeit sollte erheblich schneller sein, da weniger Gleitkommaoperationen erforderlich sein sollten. Zum Beispiel sqrt mit einfacher Genauigkeit kann einfachere mathematische Formeln als sqrt mit doppelter Genauigkeit verwenden . Außerdem habe ich gehört, dass mathematische Standardfunktionen im 64-Bit-Modus schneller sind (wenn sie auf einem 64-Bit-Betriebssystem kompiliert und ausgeführt werden). Was ist die endgültige Antwort darauf?


Antworten:


Die klassische x86-Architektur verwendet Gleitkommaeinheiten (FPU), um Gleitkommaberechnungen durchzuführen. Die FPU führt alle Berechnungen in ihren internen Registern durch, die jeweils eine Genauigkeit von 80 Bit haben. Jedes Mal, wenn Sie versuchen, mit float zu arbeiten oder double , wird die Variable zunächst aus dem Speicher in das interne Register der FPU geladen. Das bedeutet, dass es absolut keinen Unterschied in der Geschwindigkeit der eigentlichen Berechnungen gibt, da die Berechnungen in jedem Fall mit voller 80-Bit-Präzision durchgeführt werden. Das einzige, was anders sein könnte, ist die Geschwindigkeit, mit der der Wert aus dem Speicher geladen und das Ergebnis zurück in den Speicher gespeichert wird. Natürlich kann es auf einer 32-Bit-Plattform länger dauern, einen double zu laden/speichern im Vergleich zu float . Auf einer 64-Bit-Plattform sollte es keinen Unterschied geben.


Moderne x86-Architekturen unterstützen erweiterte Befehlssätze (SSE/SSE2) mit neuen Befehlen, die dieselben Gleitkommaberechnungen durchführen können, ohne die "alten" FPU-Befehle einzubeziehen. Aber auch hier würde ich keinen Unterschied in der Rechengeschwindigkeit für float erwarten und double . Und da diese modernen Plattformen 64-Bit-Plattformen sind, sollte auch die Lade-/Speichergeschwindigkeit gleich sein.


Auf einer anderen Hardwareplattform könnte die Situation anders sein. Aber normalerweise sollte ein kleinerer Fließkommatyp keine Leistungsvorteile bringen. Der Hauptzweck kleinerer Fließkommatypen ist es, Speicherplatz zu sparen, nicht die Leistung zu verbessern.


Bearbeiten:(Um den Kommentar von @MSalters anzusprechen)
Was ich oben gesagt habe, gilt für grundlegende arithmetische Operationen. Wenn es um Bibliotheksfunktionen geht, hängt die Antwort von mehreren Implementierungsdetails ab. Wenn der Gleitkomma-Befehlssatz der Plattform einen Befehl enthält, der die Funktionalität der gegebenen Bibliotheksfunktion implementiert, dann gilt das, was ich oben gesagt habe, normalerweise auch für diese Funktion (das würde normalerweise Funktionen wie sin beinhalten , cos , sqrt ). Für andere Funktionen, deren Funktionalität im FP-Befehlssatz nicht sofort unterstützt wird, kann sich die Situation als erheblich anders erweisen. Es ist durchaus möglich, dass float Versionen solcher Funktionen können effizienter implementiert werden als ihre double Versionen.