Angenommen, ich bekomme ein Array von ganzen Zahlen mit fester Breite (dh sie passen in ein Register der Breite ), . Ich möchte die Summe auf einer Maschine mit 2er-Komplementarithmetik berechnen , die Additionen modulo mit umlaufender Semantik ausführt . Das ist einfach - aber die Summe kann die Registergröße überschreiten, und wenn dies der Fall ist, ist das Ergebnis falsch.
Wenn die Summe nicht überläuft, möchte ich sie berechnen und so schnell wie möglich überprüfen, ob kein Überlauf vorliegt. Wenn die Summe überläuft, möchte ich nur wissen, dass dies der Fall ist. Mir ist kein Wert wichtig.
Das naive Hinzufügen von Zahlen in der Reihenfolge funktioniert nicht, da eine Teilsumme überlaufen kann. Beispielsweise ist bei 8-Bit-Registern gültig und hat eine Summe von 125 , obwohl die Teilsumme 120 + 120 den Registerbereich [ - 128 , 127 ] überläuft .
Natürlich könnte ich ein größeres Register als Akkumulator verwenden, aber nehmen wir den interessanten Fall an, in dem ich bereits die größtmögliche Registergröße verwende.
Es gibt eine bekannte Technik, um Zahlen mit dem entgegengesetzten Vorzeichen als aktuelle Teilsumme hinzuzufügen . Diese Technik vermeidet Überläufe bei jedem Schritt, auf Kosten der Uncache-Freundlichkeit und der geringen Nutzung der Verzweigungsvorhersage und der spekulativen Ausführung.
Gibt es eine schnellere Technik, die möglicherweise die Berechtigung zum Überlaufen von Teilsummen nutzt und auf einem typischen Computer mit einem Überlaufflag, einem Cache, einem Verzweigungsprädiktor und spekulativer Ausführung und Laden schneller ist?
(Dies ist eine Folge der sicheren Überlaufsummierung. )