Ist eine logische Rechtsverschiebung um eine Potenz von 2 schneller?

8

Ich würde gerne wissen, ob eine logische Verschiebung nach rechts schneller ist, wenn um eine Potenz von 2 verschoben wird. Ich benutze C ++.

Zum Beispiel ist

%Vor%

ist schneller als

%Vor%

Ich schätze, dass die erste Antwort für alle darin besteht, mir zu sagen, dass man sich nicht um winzige Kleinigkeiten wie diese kümmern sollte, sondern um korrekte Algorithmen und Sammlungen, um Größenordnungen zu reduzieren. Ich stimme dir vollkommen zu, aber ich versuche wirklich, alles aus einem Embedded-Chip herauszuquetschen (ein ATMega328) - ich habe nur eine Leistungsveränderung, die einem "Woohoo!" Würdig ist! indem ich einen Teil durch einen Bit-Shift ersetze, verspreche ich dir, dass das wichtig ist.

Danke.

    
Will 16.09.2010, 11:46
quelle

8 Antworten

17

Schauen wir uns das Datenblatt an:

Ссылка

Soweit ich sehen kann, verschiebt sich die ASR (rechnerische Verschiebung nach rechts) immer um ein Bit und kann nicht die Anzahl der Bits zum Verschieben nehmen; Es dauert einen Zyklus zur Ausführung. Daher wird die Verschiebung um n Bits n Zyklen dauern. Zweierpotenzen verhalten sich genauso wie jede andere Zahl.

    
Martin B 16.09.2010, 11:55
quelle
4

In der AVR-Befehlssatz , arithmetische Verschiebung nach rechts und links passieren ein Bit zu einem Zeitpunkt . Für diesen speziellen Mikrocontroller bedeutet das Verschieben von >> n , dass der Compiler tatsächlich viele einzelne asr ops macht, und ich denke, >>3 ist eins schneller als >>4 .

Das macht den AVR übrigens ziemlich unsinnig.

    
Crashworks 16.09.2010 11:59
quelle
4

Sie müssen die Dokumentation Ihres Prozessors für diese Information konsultieren. Selbst für einen gegebenen Befehlssatz können je nach Modell unterschiedliche Kosten anfallen. Auf einem wirklich kleinen Prozessor könnte die Verschiebung um eins möglicherweise schneller sein als bei anderen Werten (zum Beispiel bei Rotationsanweisungen auf einigen IA32-Prozessoren, aber nur deshalb, weil diese Anweisung so selten von Compilern erzeugt wird).

>

Laut Ссылка werden alle logischen Verschiebungen in einem Zyklus für den ATMega328 durchgeführt. Aber natürlich, wie in den Kommentaren erwähnt, sind alle logischen Verschiebungen um ein Bit. Die Kosten einer Verschiebung um n sind also n Zyklen in n Anweisungen.

    
Pascal Cuoq 16.09.2010 11:54
quelle
2

Es hängt davon ab, wie der Prozessor aufgebaut ist. Wenn der Prozessor eine Laufrotation hat, kann er eine beliebige Anzahl von Bits in einer Operation verschieben, aber das kostet Platz und Energiebudget. Die wirtschaftlichste Hardware könnte nur um eins rotieren, mit Optionen bezüglich des Wrap-Around-Bits. Als nächstes wäre einer, der sich entweder nach links oder nach rechts drehen könnte. Ich kann mir eine Struktur vorstellen, die einen 1-Shifter, 2-Shifter, 4-Shifter usw. hat. In diesem Fall ist 4 vielleicht schneller als 3.

    
Mike Dunlavey 16.09.2010 12:08
quelle
1

Wenn Ihr Targe-Prozessor einen Bit-Shift-Befehl hat (was sehr wahrscheinlich ist), dann hängt es von der Hardware-Implementierung dieses Befehls ab, ob es irgendeinen Unterschied zwischen dem Verschieben von 2-Bit-Bits oder dem Verschieben von einigen gibt andere Nummer. Es ist jedoch unwahrscheinlich, dass es einen Unterschied macht.

    
Bart van Ingen Schenau 16.09.2010 11:52
quelle
1

Zerlegen Sie zuerst den Code. Lassen Sie sich nicht von Leuten abschrecken, die Ihnen sagen, Sie verschwenden Ihre Zeit. Das Wissen, das du gewinnst, wird dich in die Lage versetzen, die Person zu werden, die die großen Firmenfeuer löscht. Die Zahl der Menschen mit echten hinter dem Vorhang Wissen fällt in dieser Industrie mit einer alarmierenden Rate.

Hört sich an, als ob andere hier die wirkliche Antwort erklärt hätten, welche Disassemblierung hätte gezeigt werden müssen. Also werden 4 Schichten 133% der Zeit beanspruchen, die 3 Schichten benötigt haben, oder 3 Schichten sind 75% der Zeit von 4 Schichten, abhängig davon, wie Sie die Zahlen verglichen haben. Und Ihre Messungen sollten diesen Unterschied widerspiegeln, wenn sie nicht mit diesem Experiment fortfahren, bis Sie die Ausführungszeiten vollständig verstehen.

    
old_timer 16.09.2010 21:01
quelle
0

Bei allem Respekt, sollten Sie nicht erst anfangen über Performance zu sprechen, bis Sie anfangen zu messen. Kompiliere dein Programm mit der Division. Lauf. Messzeit. Wiederholen Sie mit der Verschiebung.

    
danatel 16.09.2010 11:59
quelle
0

Tatsächlich hat ATMega einen Swap-Nibble-Befehl. Daher kann die Verschiebung x << 4 schneller als x << 3

sein

x << 3 wird durch 3 Linksverschiebungen implementiert

%Vor%

wobei x << 4 nur einen Swap und ein bisschen clear

benötigt %Vor%

oder

%Vor%

oder wenn Sie sicherstellen können, dass die oberen 4 Bits Null sind, genügt ein Nibble Swap

%Vor%     
Lưu Vĩnh Phúc 28.07.2013 13:06
quelle