Es gibt keine einzige "Intel-CPU", insbesondere im Hinblick darauf, welche Vorgänge in Bezug auf andere optimiert sind! Die meisten von ihnen sind jedoch auf CPU-Ebene (speziell innerhalb der FPU) so, dass die Antwort auf Ihre Frage lautet:
sind doppelte Operationen genauso schnell oder schneller als Float-Operationen für +, -, * und /?
ist "Ja" - innerhalb der CPU , mit Ausnahme von Division und SQL, die für etwas langsamer sind double
als fürfloat
. (Angenommen, Ihr Compiler verwendet SSE2 für skalare FP-Mathematik, wie es alle x86-64-Compiler tun, und einige 32-Bit-Compiler, abhängig von den Optionen. Legacy x87 hat keine unterschiedlichen Breiten in Registern, nur im Speicher (es wird beim Laden / Speichern konvertiert ), also waren historisch gesehen sogar sqrt und Division für double
) genauso langsam .
Zum Beispiel hat Haswell einen divsd
Durchsatz von einem pro 8 bis 14 Zyklen (datenabhängig), aber einen divss
(skalaren Einzel-) Durchsatz von einem pro 7 Zyklen. x87 fdiv
ist ein Durchsatz von 8 bis 18 Zyklen. (Zahlen von https://agner.org/optimize/ . Die Latenz korreliert mit dem Durchsatz für die Division, ist jedoch höher als die Durchsatzzahlen.)
Die float
Versionen vieler Bibliotheksfunktionen mögen logf(float)
und sinf(float)
werden auch schneller als log(double)
und sein sin(double)
, da sie viel weniger Präzision haben, um richtig zu werden. Sie können Polynomnäherungen mit weniger Termen verwenden, um die volle Genauigkeit für float
vs.double
Allerdings , deutlich impliziert die doppelten Speicher für jede Nummer Aufnahme schwere Last auf dem Cache (s) und mehr Speicherbandbreite zu füllen und diese Cache - Zeilen von / bis RAM zu verschütten; Die Zeit, die Sie für die Leistung einer Gleitkommaoperation benötigen, ist, wenn Sie viele solcher Operationen ausführen. Daher sind die Überlegungen zu Speicher und Cache von entscheidender Bedeutung.
@ Richards Antwort weist darauf hin, dass es auch andere Möglichkeiten gibt, FP-Operationen auszuführen (die SSE / SSE2-Anweisungen; gutes altes MMX war nur Ganzzahlen), insbesondere geeignet für einfache Operationen mit vielen Daten ("SIMD", Einzelanweisung / Mehrfachdaten) ) wobei jedes Vektorregister 4 Floats mit einfacher oder nur 2 Floats mit doppelter Genauigkeit packen kann , sodass dieser Effekt noch deutlicher wird.
Am Ende haben Sie Benchmarks, aber meine Prognose ist , dass für eine vernünftig (dh groß ;-) Benchmarks, Sie Vorteil Kleben mit einfacher Genauigkeit finden (natürlich unter der Annahme , dass Sie nicht brauchen , um die zusätzlichen Bits Präzision!-).