2010-09-16 7 views
8

Ich würde gerne wissen, ob das Ausführen einer logischen Rechtsverschiebung schneller ist, wenn um eine Potenz von 2 verschoben wird. Ich benutze C++.Ist eine logische Rechtsverschiebung um eine Potenz von 2 schneller?

Zum Beispiel als

myUnsigned >> 4 

schneller ist

myUnsigned >> 3 

Ich schätze, dass erste Antwort der jeder wird sein, mir zu sagen, dass man nicht über winzig kleine Dinge wie diese sorgen sollte, ist es Verwenden Sie korrekte Algorithmen und Sammlungen, um wichtige Größenordnungen zu reduzieren. Ich stimme dir vollkommen zu, aber ich versuche wirklich, alles aus einem Embedded-Chip herauszuquetschen (ein ATMega328) - ich habe gerade eine Leistungsveränderung, die einem "Woohoo!" Würdig ist! indem ich eine Kluft durch eine Bit-Verschiebung ersetze, verspreche ich dir, dass das wichtig ist.

Vielen Dank.

+8

Warum messen Sie sich nicht? –

+7

Wen interessiert es, wenn 'x >> 4' schneller ist als' x >> 3'? Sie haben unterschiedliche Semantiken, es spielt also keine Rolle, wer schneller ist. Wie auch immer, ich habe noch nie eine Architektur kennengelernt, bei der der richtige Operand eines Bit-Shift-Operators irgendwelche Auswirkungen auf die Performance hatte. – fredoverflow

+4

@FredOverflow: Auf dem ATMega nimmt der Bit-Shift-Befehl nicht den Operanden "Anzahl der zu verschiebenden Bits". Bezüglich 'x >> 4' gegen' x >> 3' - vielleicht hat das OP hier einige Freiheiten (zB Festkommaarithmetik und hat einen gewissen Spielraum, wie groß die Bruchkomponente ist) –

Antwort

17

Blick Lassen Sie sich auf dem Datenblatt:

http://atmel.com/dyn/resources/prod_documents/8271S.pdf

Soweit ich sehen kann, ist die ASR (arithmetische Verschiebung nach rechts) immer um ein Bit verschiebt und die Anzahl der Bits nicht nehmen zu verschieben; 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.

+0

Vielen Dank! Ich musste eine Gleitkommazahl durch eine ganze Zahl ersetzen, aber um die Genauigkeit zu erhalten, musste ich diese multiplizieren. Ich versuche, einen idealen Koeffizienten zu finden, so dass ich die kleinste mögliche Zeit damit verbringe, den Int zurück auf die unmultiplizierte Größe zu knacken. – Will

1

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

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 beispielsweise durch andere Werte (dies ist bei Rotationsanweisungen auf einigen IA32-Prozessoren der Fall, aber nur deshalb, weil diese Anweisung von Compilern so selten erzeugt wird).

Gemäß http://atmel.com/dyn/resources/prod_documents/8271S.pdf 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. So ist die Kosten für eine Verschiebung von nn Zyklen in n Anweisungen.

+0

Vorsicht: Die Schichtanweisungen verschiebt immer nur um ein Bit ... so weiter Sie verschieben, je länger es dauert. –

+1

+1 für die Untersuchung der spezifischen CPU. –

+0

@Martin B Danke für den Hinweis, ich hätte es bemerken sollen, die Informationen waren im selben PDF verfügbar. –

0

Mit allem Respekt, Sie sollten nicht einmal über die Leistung sprechen, bis Sie mit der Messung beginnen. Kompiliere dein Programm mit der Division. Lauf. Messzeit. Wiederholen Sie mit der Verschiebung.

+1

Angesichts der Tatsache, dass er bereits eine Leistungsverbesserung gemessen hat, indem er div durch Schicht ersetzt, denke ich, dass es ziemlich offensichtlich ist, dass er Timings läuft. – Crashworks

+0

AFAIK es ist eine weithin bekannte Angelegenheit über Computerberechnungen, die Verschiebung OPs sind viel schneller als Multiplikation, Teilung ist langsamer als Multiplikation (sie langsamer sogar auf Papier)). Addition/Subtraktion sind fast so schnell wie Verschiebungen - nur theoretisch verwenden sie ein bisschen mehr Transistoren, aber das spielt keine Rolle, und die CPU führt sie trotzdem in einem einzigen Zyklus aus. Multiplikation und Division benötigen mehr Zyklen – Mixaz

+0

Multiplikation und Division nehmen mehr Zyklen, da sie Addition/Subtraktion intern in nachfolgenden Iterationen verwenden. Ich erinnere mich, dass die ARM-Spezifikationen (zumindest für alte Versionen) darauf hinwiesen, dass die Division (ich erinnere mich nicht an die Multiplikation) unterschiedlich lange dauern kann, weil das – Mixaz

4

In der AVR instruction set, arithmetische Verschiebung nach rechts und links passieren ein Bit zu einem Zeitpunkt. Also, für diesen bestimmten Mikrocontroller, Verschiebung >> n bedeutet, der Compiler macht tatsächlich viele individuelle asr Ops, und ich denke, >>3 ist eine schneller als >>4.

Das macht den AVR übrigens ziemlich unüblich.

+0

nicht ungewöhnlich ist. Die meisten (wenn nicht alle) 8-Bit-Mikrocontroller haben keinen Barrel-Shifter und müssen ein Bit auf einmal verschieben. –

2

Es hängt davon ab, wie der Prozessor gebaut wird. 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 möglicherweise schneller als 3.

1

Zerlegen Sie zuerst dann 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 Anzahl der Menschen mit echten hinter dem Vorhang Wissen fällt in einer alarmierenden Rate in dieser Branche.

Klingt wie andere erklärten die echte Antwort hier, die Demontage hätte gezeigt, Single-Bit-Shift-Anweisung. 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.

0

In der Tat hat ATMega eine Swap-Nibble-Anweisung. So verschieben x << 4 sein kann schneller als x << 3

x << 3 implementiert wird von 3 Schichten links

x <<= 1; 
x <<= 1; 
x <<= 1; 

während x << 4 nur eine Swap benötigen und ein wenig klar

swap(x); // swap the top and bottom nibble AB <-> BA 
x &= 0xf0; 

oder

x &= 0x0f; 
swap(x); 

oder wenn du ma kannst Sicher sein, dass die oberen 4 Bits Null sind, dann ist nur ein Nibble Swap genug

+0

Hm, ich wusste nicht, dass x << 3 in AVR als 3-Shifts implementiert ist. Sind Sie sicher, dass AVR ein spezielles OP für eine einzelne Bitverschiebung hat? Auf ARM Swap und << 3 würde die gleiche Zeit (1 Zyklus) nehmen – Mixaz

+1

@Mixaz kein 8-Bit-Mikrocontroller Ich weiß, hat Barrel Shifter, so kann es nur 1 Bit pro Zyklus verschieben. Suchen Sie einfach nach AVR, PIC oder 8051 Befehlssatz und sehen Sie –

+0

Selbst einige 16-Bit-Mikrocontroller müssen immer noch 1 Bit verschieben. Der Befehlssatz von ARV wurde in den anderen Antworten gepostet, lies ihn zuerst –

Verwandte Themen