it-swarm.com.de

Sind 64-Bit-Programme größer und schneller als 32-Bit-Versionen?

Ich nehme an, ich konzentriere mich auf x86, aber generell bin ich an der Umstellung von 32 auf 64 Bit interessiert.

Logischerweise kann ich sehen, dass Konstanten und Zeiger in einigen Fällen größer sind, so dass Programme wahrscheinlich größer werden. Und der Wunsch, Speicher für Word-Grenzen aus Effizienzgründen zuzuweisen, würde mehr Weißraum zwischen den Zuweisungen bedeuten.

Ich habe auch gehört, dass der 32-Bit-Modus des x86 seinen Cache beim Kontextwechsel aufgrund möglicher überlappender 4G-Adressräume leeren muss.

Was sind die wirklichen Vorteile von 64 Bit?

Und als Zusatzfrage wäre 128 Bit noch besser? 

Bearbeiten:

Ich habe gerade mein erstes 32/64 Bit Programm geschrieben. Es erstellt verknüpfte Listen/Bäume mit 16-Byte-Objekten (32-Bit-Version) oder 32-Byte-Objekten (64-Bit-Version) und druckt viel auf stderr - kein wirklich nützliches Programm und kein typisches, aber es ist mein erstes.

Größe: 81128 (32b) v 83672 (64b) - also kein großer Unterschied

Geschwindigkeit: 17s (32b) v24s (64b) - läuft auf einem 32-Bit-Betriebssystem (OS-X 10.5.8)

Aktualisieren:

Ich stelle fest, dass ein neues Hybrid-x32-ABI (Application Binary Interface) entwickelt wird, das 64b umfasst, aber 32b-Zeiger verwendet. Bei einigen Tests führt dies zu einem kleineren Code und einer schnelleren Ausführung als 32b oder 64b. 

https://sites.google.com/site/x32abi/

73
philcolbourn

Wenn Sie nicht auf mehr Speicherplatz zugreifen müssen, der durch die 32b-Adressierung möglich ist, sind die Vorteile gering, wenn überhaupt.

Wenn Sie mit einer 64-Bit-CPU arbeiten, erhalten Sie die gleiche Speicherschnittstelle, unabhängig davon, ob Sie 32- oder 64-Bit-Code ausführen (Sie verwenden den gleichen Cache und den gleichen BUS).

Während die x64-Architektur über einige weitere Register verfügt, die einfachere Optimierungen ermöglichen, wird dies häufig dadurch bekämpft, dass Zeiger jetzt größer sind und die Verwendung von Strukturen mit Zeigern zu einem höheren Speicherverkehr führt. Ich würde den Anstieg der Gesamtspeicherauslastung für eine 64b-Anwendung im Vergleich zu einer 32b-Anwendung auf 15-30% schätzen.

24
Suma

Ich sehe normalerweise eine Verbesserung der Geschwindigkeit um 30% für rechenintensiven Code auf x86-64 im Vergleich zu x86. Dies ist höchstwahrscheinlich auf die Tatsache zurückzuführen, dass wir 16 × 64-Bit-Universalregister und 16 × SSE-Register anstelle von 8 × 32-Bit-Universalregister und 8 × SSE -Register haben. Dies ist mit dem Intel ICC-Compiler (11.1) auf einem x86-64-Linux - die Ergebnisse mit anderen Compilern (z. B. gcc) oder mit anderen Betriebssystemen (z. B. Windows) können natürlich unterschiedlich sein.

38
Paul R

Unabhängig von den Vorteilen würde ich vorschlagen, dass Sie Ihr Programm immer für die Standard-Word-Größe des Systems (32-Bit oder 64-Bit) kompilieren, denn wenn Sie eine Bibliothek als 32-Bit-Binärdatei kompilieren und auf einem 64-Bit-Format bereitstellen Sie werden jeden, der eine Verknüpfung mit Ihrer Bibliothek herstellen möchte, dazu zwingen, ihre Bibliothek (und alle anderen Bibliotheksabhängigkeiten) als 32-Bit-Binärcode bereitzustellen, wenn die 64-Bit-Version der Standard ist. Dies kann für jeden ein Ärgernis sein. Stellen Sie im Zweifelsfall beide Versionen Ihrer Bibliothek bereit.

Was die praktischen Vorteile von 64-Bit anbelangt, liegt der offensichtlichste Vorteil darin, dass Sie einen größeren Adressraum erhalten. Wenn Sie also eine MMAP-Datei verwenden, können Sie mehr davon auf einmal ansprechen (und größere Dateien in den Arbeitsspeicher laden). Ein weiterer Vorteil ist, dass, wenn der Compiler gute Arbeit leistet, viele arithmetische Operationen parallelisiert werden können (z. B. zwei Paare von 32-Bit-Zahlen in zwei Registern platzieren und zwei Additionen in einer einzigen Add-Operation ausführen) und big Zahlberechnungen werden schneller ausgeführt. Das ganze 64-Bit vs. 32-Bit-Ding hilft Ihnen jedoch nicht bei asymptotischer Komplexität. Wenn Sie also Ihren Code optimieren möchten, sollten Sie sich eher die Algorithmen als die konstanten Faktoren wie diese anschauen.

BEARBEITEN:
Bitte ignorieren Sie meine Aussage über den parallelisierten Zusatz. Dies wird nicht durch eine gewöhnliche Add-Anweisung ausgeführt. Ich verwirrte das mit einigen der vektorisierten/SSE-Anweisungen. Ein genauerer Vorteil neben dem größeren Adressraum ist, dass es mehr Universalregister gibt, was bedeutet, dass mehr lokale Variablen in der CPU-Registerdatei verwaltet werden können, was viel schneller abgerufen werden kann, als wenn Sie die Variablen in das Verzeichnis einfügen Programmstack (was normalerweise bedeutet, in den L1-Cache zu gehen).

14

Neben mehr Registern verfügt 64-Bit standardmäßig über SSE2. Das bedeutet, dass Sie tatsächlich einige Berechnungen parallel durchführen können. Die Erweiterungen SSE hatten auch andere Leckereien. Ich denke jedoch, der Hauptvorteil besteht darin, nicht auf das Vorhandensein der Erweiterungen prüfen zu müssen. Bei x64 steht SSE2 zur Verfügung. ... wenn mein Gedächtnis mir recht tut.

3
amokcrow

Nur wenn Sie Ihre Anwendung auf 64 Bit verschieben möchten, benötigen Sie mehr Speicher für Anwendungen wie große Datenbanken oder ERP - Anwendungen mit mindestens 100 gleichzeitigen Benutzern, bei denen die 2-GB-Grenze ziemlich schnell überschritten wird, wenn Anwendungen für eine bessere Leistung zwischengespeichert werden. Dies ist insbesondere bei Windows-Betriebssystemen der Fall, bei denen integer und long immer noch 32-Bit sind (sie haben die neue Variable _int64. Nur Zeiger sind 64-Bit. Tatsächlich ist WOW64 unter Windows x64 stark optimiert, sodass 32-Bit-Anwendungen unter 64-Bit-Windows mit geringen Nachteilen laufen Betriebssystem: Meine Erfahrung unter Windows x64 ist eine 32-Bit-Anwendungsversion, die 10-15% schneller als 64-Bit ausgeführt wird, da in früheren Fällen zumindest für proprietäre Speicherdatenbanken Zeigerarithmatisierungen für die Verwaltung des B-Baums verwendet werden können (der prozessorintensivste Teil eines Datenbanksystems). Computing-intensive Anwendungen, die große Dezimalzahlen für höchste Genauigkeit erfordern, die ein Double bei 32-64-Bit-Betriebssystemen nicht bieten kann. Diese Anwendungen können _int64 anstelle der Software-Emulation nativ verwenden die Möglichkeit, großen Speicher für das Zwischenspeichern von Abfrageplänen usw. zu verwenden.

2
GirishK

Im spezifischen Fall von x68 bis x68_64 ist das 64-Bit-Programm etwa gleich groß, wenn nicht etwas kleiner, benötigt etwas mehr Speicher und läuft schneller. Meistens liegt das daran, dass x86_64 nicht nur 64-Bit-Register hat, sondern auch doppelt so viele. x86 verfügt nicht über genügend Register, um die kompilierten Sprachen so effizient wie möglich zu machen, so dass der x86-Code viele Anweisungen und Speicherbandbreite ausgibt, um Daten zwischen Registern und Speicher hin und her zu verschieben. x86_64 hat viel weniger davon und benötigt daher etwas weniger Speicherplatz und ist schneller. In x86_64 sind auch Fließkomma- und Bit-Twiddling-Vektor-Anweisungen wesentlich effizienter.

Im Allgemeinen ist 64-Bit-Code jedoch nicht unbedingt schneller und in der Regel sowohl für die Code- als auch für die Speicherverwendung zur Laufzeit größer.

2
Andrew McGregor

Für jeden Speicherabruf werden mehr Daten zwischen der CPU und RAM übertragen (64 statt 32 Bits), sodass 64-Bit-Programme schneller sein können, vorausgesetzt, sie werden geschrieben, damit sie dies richtig nutzen.

1
Rune Aamodt

Ich programmiere eine Schachengine. Die beste Bewegungsextraktion mit einer Minimax-basierten Baumsuche bis Tiefe 9 (von einer bestimmten Position aus) dauerte in der Win32-Konfiguration ~ 17,0 Sekunden, und nach dem Umschalten auf x64 dauert es jetzt ~ 10,3 Sekunden. Das sind 41% der Beschleunigung!

0
bloody

Alle Anwendungen, die eine CPU-Nutzung erfordern, wie z. B. Transcoding, Anzeigeleistung und Medienwiedergabe (Audio oder Video), werden (an diesem Punkt) sicherlich erforderlich sein und von der Verwendung von 64 Bit gegenüber 32 Bit profitieren, da die CPU mit dem reinen Umgang fertig werden kann Datenmenge, die darauf geworfen wird. Es ist weniger eine Frage des Adressraums als vielmehr der Umgang mit den Daten. Ein 64-Bit-Prozessor mit 64-Bit-Code wird eine bessere Leistung erbringen, insbesondere bei mathematisch schwierigen Dingen wie Transcoding und VoIP-Daten. Tatsächlich sollte jede Art von "mathematischen" Anwendungen von der Verwendung von 64-Bit-CPUs und Betriebssystemen profitieren. Widerlege mich.

0
Dave Vanian