Ich bin kürzlich auf einen Fall gestoßen, in dem ich eine Ganzzahl-Divisionsoperation auf einem Chip benötigte, dem eine fehlte (ARM Cortex-A8). Während ich zu untersuchen versuchte, warum das so sein muss, fand ich heraus, dass Division im Allgemeinen viel mehr Zyklen benötigt als Addition, Subtraktion oder Multiplikation auf so ziemlich jeder Integer- (oder Fixpunkt-) Architektur. Warum ist das so? Ist es nicht wie alles andere mit einer zweischichtigen UND-ODER-Logik darstellbar?
computer-arithmetic
Phonon
quelle
quelle
Während alle aktuellen CPUs einen iterativen Ansatz zu verwenden scheinen, wie es der Aterrel nahelegt , wurden einige Arbeiten an nicht-iterativen Ansätzen durchgeführt. Gleitkommadivision und Quadratwurzel mit variabler Präzision sprechen von einer nicht-iterativen Implementierung von Gleitkommadivision und Quadratwurzel in einem FPGA unter Verwendung von Nachschlagetabellen und Taylor-Reihenerweiterung.
Ich vermute, dass die gleichen Techniken es möglich machen, diese Vorgänge auf einen einzigen Zyklus (Durchsatz, wenn nicht Latenz) zu beschränken, aber Sie werden wahrscheinlich riesige Nachschlagetabellen und damit unüberschaubar große Bereiche von Siliziumimmobilien benötigen, um dies zu tun .
Warum sollte es nicht machbar sein?
Beim Entwerfen von CPUs müssen viele Kompromisse eingegangen werden. Funktionalität, Komplexität (Anzahl der Transistoren), Geschwindigkeit und Stromverbrauch hängen zusammen, und die Entscheidungen, die während des Designs getroffen werden, können einen enormen Einfluss auf die Leistung haben.
Ein moderner Prozessor könnte wahrscheinlich eine Hauptgleitkommaeinheit haben, die genügend Transistoren auf dem Silizium reserviert, um eine Gleitkommadivision in einem einzigen Zyklus durchzuführen , aber es ist unwahrscheinlich, dass diese Transistoren effizient eingesetzt werden.
Die Gleitkommamultiplikation hat diesen Übergang von iterativ zu nicht iterativ vor einem Jahrzehnt vollzogen. Heutzutage sind Single Cycle Multiplizieren und sogar Multiplizieren-Akkumulieren selbst in mobilen Prozessoren an der Tagesordnung.
Bevor es zu einer effizienten Verwendung des Transistorbudgets kam, wurde die Multiplikation wie auch die Division häufig durch eine iterative Methode durchgeführt. Damals widmeten dedizierte DSP-Prozessoren möglicherweise den größten Teil ihres Siliziums einer einzelnen MAC- Einheit ( Fast Multiple Accumulate) . Eine Core2duo-CPU hat eine Gleitkomma- Multiplikator-Latenz von 3 (der Wert kommt aus dem Pipeline-3-Zyklus, nachdem er eingegangen ist ), kann jedoch 3 Multiplikatoren gleichzeitig im Flug haben, was zu einem Durchsatz von einem Zyklus führt, während dies bei der SSE2-Einheit der Fall ist Pumpen Sie mehrere FP-Multiplikationen in einem einzigen Zyklus aus.
Anstatt große Bereiche des Siliziums einer Einzelzyklus-Teilungseinheit zuzuweisen, verfügen moderne CPUs über mehrere Einheiten, von denen jede Operationen parallel ausführen kann, die jedoch für ihre eigenen spezifischen Situationen optimiert sind. Wenn Sie SIMD- Anweisungen wie SSE oder die in der CPU integrierten Grafiken der Sandy Bridge oder späterer CPUs berücksichtigen , befinden sich möglicherweise viele solcher Gleitkommadivisionseinheiten in Ihrer CPU.
Wenn eine generische Gleitkommadivision für moderne CPUs wichtiger wäre, wäre es möglicherweise sinnvoll, genügend Siliziumfläche für einen einzelnen Zyklus zu reservieren. Die meisten Chiphersteller haben jedoch offensichtlich beschlossen, dieses Silizium besser zu nutzen, indem sie diese Gates für andere Zwecke verwenden . Somit ist eine Operation langsamer, aber insgesamt (für typische Verwendungsszenarien) ist die CPU schneller und / oder verbraucht weniger Energie.
quelle