2017-02-27 2 views
1

Also habe ich erforscht, wie die Variable uint8 funktioniert und ich habe festgestellt, dass es tatsächlich nicht schneller ist als int! Um multiplizieren, dividieren, addieren oder subtrahieren zu können, muss das Programm uint8 in einen int umwandeln, der es ungefähr gleich schnell oder etwas langsamer macht.Warum gibt es keine Optimierung für uint8?

Wieso hat C++ das Multiplizieren, Dividieren, Addieren oder Subtrahieren nicht direkt in uint8 implementiert?

+1

Optimierungen sind im Allgemeinen plattformspezifisch. In den meisten Plattformen ist die CPU-Architektur größer als 8 Bit. Es verwendet physikalisch Werte größer als 'uint8'. Das liegt weit außerhalb des C++ - Standards. –

+1

Ich vermute, das ist die CPU, die auf 32/64Bits arbeitet, die es ändert, nicht C++. d. h. der Compiler kann nichts anderes tun, als wenn er auf Ihre Plattform abzielt. – fwgx

+0

@ FrançoisAndrieux Das ist richtig, aber ich frage mich, warum C++ keinen direkten Weg zum Addieren, Subtrahieren, Multiplizieren oder Teilen von Uint8 gemacht hat. –

Antwort

3

Wieso hat C++ das Multiplizieren, Dividieren, Addieren oder Subtrahieren nicht direkt in uint8 implementiert?

Da der optimale Weg dies ist Plattform-spezifisch.

meisten CPUs diese Operationen als Assembler-Anweisungen bereitzustellen, basierend auf ganzzahlige Werte von einer bestimmten Standardgröße (zB 32 Bits oder 64 Bits wie here für 16-Bit-Befehle dargestellt), sie können oder auch nicht solche Anweisungen für uint8 Werte haben .
Die Bitgröße ist normalerweise für die Cache-Auskleidungsmechanismen der CPU optimiert.

Die optimale Implementierung hängt also von den verfügbaren Ziel-CPU-Anweisungen ab und kann nicht vom C++ - Standard abgedeckt werden.

+0

@Kevin Das würde die ARM 16-Bit-Probe, die ich in meiner Antwort verlinkt habe, übereinstimmen. –

1

Ich bin mir nicht sicher, ob ein Compiler 8bit arithmetische Operationen für uint8_t erzeugen wird, wenn es funktioniert (ziemlich unwahrscheinlich, weil es unwahrscheinlich ist, dass es schneller ist).

@harold erwähnt, was ich vorher gesagt habe, ist nicht so morden jetzt ... Partielle Register Update-Problem ist jetzt nicht mehr so ​​ernst für 8bit-Operationen. So sind die meisten 8bit Operationen nicht schneller. Während 8bit Division ein wenig schneller ist und ich versuche herauszufinden, warum MS Compiler es nicht verwenden wird. (Nicht so sicher: Da das teilweise aktualisierende Problem nur größtenteils reduziert, nicht vollständig entfernt und sogar von AMD beibehalten wird, ist dieser eine Zyklusvorteil der 8bit-Teilung einfach nicht wert, missbraucht zu werden).

Original: Auf morden x86-Prozessoren, das Gesicht 8bit Operationen ein Problem namens partial register update, dass Sie nur einen Teil des gesamten Registers ändern, die in false dependency Ergebnisse, die ernsthaft Auswirkungen auf die Leistung.


Und FYI, auf der Sprachebene gibt es keine Arithmetik für ganzzahlige Typen kleiner als int in C++. Es gibt die usual arithmetic promotion, um den Typ zu heben.

+0

Die falschen Abhängigkeiten passieren nur bei AMD (vor Zen sowieso, wer weiß, was Zen tun könnte) und NetBurst, bei P3 und Core2 und seinen Nachkommen können die 8bit-Register unabhängig umbenannt werden und Probleme treten nur auf, wenn eine echte Abhängigkeit besteht auf einem "Split" -Register (also, mit dem vollen Register nach dem Update teilweise), und * sogar das * ist schnell auf Haswell und neuer – harold

+0

@harold Ratet mal, ich bin ernsthaft veraltet ... – BlueWanderer

+0

Nun, es ist immer noch ein Ding auf AMD für jetzt, also gehört es nicht mehr der Vergangenheit an – harold

Verwandte Themen