Dies ist eine gute Frage, da das Verständnis numerischer Algorithmen und der Leistung eine wichtige Voraussetzung für einen effektiven Computerwissenschaftler ist. Gleichzeitig ist es eine schlechte Frage, da die auferlegten Einschränkungen sie nicht ausreichend qualifizieren, um eine aussagekräftige Antwort zu geben.
Die Leistung der drei Berechnungen hängt stark von der Genauigkeit ab, die für das Endergebnis erforderlich ist, sowie von der Mindestgenauigkeit, die zur Darstellung der Operanden erforderlich ist. Sie qualifizieren , und als positive reelle Zahlen, aber wir müssen auch wissen, wie viele Binärziffern erforderlich sind, um sie genau darzustellen. Um die Leistungsüberlegungen für allgemeine reelle Zahlen zu verstehen, müssen wir zunächst verstehen, wie Computer Ganzzahlen darstellen und wie sie reelle Zahlen mithilfe von Gleitkommazahlen approximieren.b c d nabcdn
Wenn Computer mit einer Ganzzahl , entspricht die Anzahl der benötigten Binärziffern offensichtlich dem log der Größe der Ganzzahl plus einem zusätzlichen Bit für die Behandlung des Vorzeichens:2M2
2 | M | + 1dn= log2|M|+1
Zum Beispiel kann die Zahl -8 mit 4 Binärziffern dargestellt werden. Aus Gründen der Leistung und Raumeffizienz sind arithmetische Logikeinheiten (ALUs), die für numerische Berechnungen von Ganzzahlen auf modernen Verarbeitungseinheiten verantwortlich sind, für die Verarbeitung von Mathematik auf Ganzzahlen bis zu einer festen Größe ausgelegt, wobei heutzutage d = 32 und d = am häufigsten sind 64. Nicht nur x86-Prozessoren wie in Ihrem Computer verfügen über ALUs, sie sind auch ein grundlegender Baustein der Computerarchitektur, der in der heutigen elektronischen Gesellschaft allgegenwärtig ist. Wenn Sie mit Videospielkonsolen vertraut sind, erinnern Sie sich vielleicht an den Nintendo 64, ein Videospielsystem, das nach der Größe (in Bit) benannt ist und für die die arithmetischen Logikeinheiten auf dem Prozessor der Konsole ausgelegt sind.
Ganzzahlige Additionen, Subtraktionen und Multiplikationen auf arithmetischen Logikeinheiten sind sehr effizient und erfordern normalerweise nicht mehr als mehrere Zyklen zur Berechnung. Divisionen sind weniger performant und können auf modernen Prozessoren bis zu mehreren Dutzend Zyklen erfordern. Die Leistung hängt sowohl von der Architektur der Verarbeitungseinheit (und der entsprechenden Implementierung der arithmetischen Logikeinheit) als auch von ihrer Frequenz ab. Beachten Sie, dass ein 64-Bit-Prozessor normalerweise Bit-Operanden mit der gleichen Geschwindigkeit für irgendwo zwischen 1 und 64 arithmetisch ausführen kann .xxx
Im allgemeinen Rechnen und insbesondere im wissenschaftlichen Rechnen ist die Ganzzahlmathematik für viele Berechnungen unhandlich, und es wird eine andere Darstellung von Zahlen benötigt, die sogenannte "Gleitkomma" -Darstellung. Gleitkommazahlen stellen einen Kompromiss zwischen der Funktionsweise moderner Mikroprozessoren (Transport von Daten in Bit-Hunks) und den Berechnungsanforderungen dar, indem Zahlen auf dem Prozessor in abgeschnittener wissenschaftlicher Notation unter Verwendung einer festen Basis (normalerweise oder ) und Darstellen der Zahl unter Verwendung von zwei ganzen Zahlen, einer Mantisse (in einigen Kreisen Signifikand) und einem Exponenten . Eine gegebene Zahl wird dann ungefähr dargestellt als:b b = 2 b = 10 s e xnbb=2b=10sex
x=s∗be
Ich sage ungefähr, weil es offensichtlich sein sollte, dass selbst einfache Rationalitäten wie nicht genau als Gleitkommazahl für die Standardbasen dargestellt werden können. Die Anzahl der dem Signifikanten zugewiesenen Ziffern bestimmt die Genauigkeit der Zahl, die relativ zu ihrer eigenen Größe ist. Der IEEE 754-Standard spezifiziert eine Reihe von Regeln für das erwartete Verhalten von Gleitkommazahlen, einschließlich der Bereiche des Signifikanten und der Mantisse (und des entsprechenden Bereichs und der Genauigkeit) für mehrere wichtige Werte von , so dass numerische Berechnungen innerhalb einiger Werte wiederholbar sind Toleranz. Die Funktionsweise von Gleitkommazahlen ist ziemlich subtil, was ich in dieser Antwort nicht erfassen kann. Für eine gute Einführung empfehle ich dn13dn"Was jeder Informatiker über Gleitkomma-Arithmetik wissen sollte" .
In den letzten 50 Jahren wurde ein erheblicher intellektueller Aufwand in die Verbesserung der Prozessorfähigkeit investiert, um arithmetische Gleitkommaoperationen effizient zu berechnen. Auf modernen Prozessoren werden diese Berechnungen von einer oder mehreren Gleitkommaeinheiten (FPUs) verarbeitet, einer komplexeren Version der arithmetischen Logikeinheit, die für arithmetische Operationen mit Gleitkommazahlen ausgelegt ist und normalerweise für beide IEEE 754-spezifizierten 32 ausgelegt ist -Bit-Gleitkommazahlen (oft als "Floats" bezeichnet) und 64-Bit-Gleitkommazahlen (oft als "Doubles" bezeichnet) effizient. Ähnlich wie bei arithmetischen Logikeinheiten können Gleitkommaeinheiten häufig Addition, Subtraktion und Multiplikation in nur wenigen Zyklen berechnen, während die Division normalerweise etwas mehr erfordert.
In den meisten Fällen reichen 64-Bit-Gleitkomma-Doppelbilder nach IEEE 754 für numerische Berechnungen aus. Nehmen wir also an, dass , und jeweils als 64-Bit-Doppelbilder dargestellt werden und Sie an der Leistung des Drei Berechnungen als skalare Operationen auf einer Intel Nehalem-Architektur unter Verwendung der x87-Gleitkomma-Befehlsuntermenge, dh Sie sind nicht daran interessiert, diese Operationen in einer for-Schleife oder über einen Datenbereich zu berechnen, und Sie möchten die Vektorerweiterungen nicht verwenden . Informationen zur Befehlslatenz werden aus den hervorragenden Befehlsreferenztabellen von Agner Fog für Intel / AMD-Architekturen gesammelt .b cabc
- ab
- logac
- c1b
1 Allgemeine Potenzierung wird häufig mit folgender Identität implementiert:
ab=βa⋅logβb
Wobei entweder oder (in diesem Fall verwende ich ). Vorausgesetzt, Sie sind bereit, das Ergebnis etwas genauer zu machen (die x87-Einheit führt ihre Berechnungen mit einer Genauigkeit von 80 Bit durch, dies ist jedoch für bestimmte Wertebereiche für und nicht ausreichend ), kann diese Berechnung mit der FYL2X-Hardwareanweisung durchgeführt werden zu berechnen und dem F2XM1 Hardware Befehls (mit etwas Skalierungs Hilfe) berechnen . Angenommen, ~ 20 Zyklen für die Handhabung der Skalierung:2 e β = 2 a b t = a ⋅ log 2 b 2 tβ2eβ=2abt=a⋅log2b2t
FYL2X + F2XM1 + ~ 20 = 80 + 51 + ~ 20 = ~ 151 Zyklen
2 Dies kann durch die Änderung der Basisidentität in zwei Logarithmen und eine Division umgewandelt werden und muss für ein genaues Ergebnis nicht neu skaliert werden.
2 * FYL2X + FDIV = 2 * 80 + (7 bis 27) = 167 bis 187 Zyklen
[3] Dies entspricht einer Division, gefolgt von einer Potenzierung, also [1] plus FDIV, ~ 175 Zyklen.