Gibt es eine Bandbreitenverbesserung von der Installation einer 32-Bit-Betriebssystem auf einem 64-Bit-Maschine?

StackOverflow https://stackoverflow.com/questions/254368

Frage

vor kurzem auf 64-Bit-Systemen wider , sagen dass für Programme, die in 4 Gigs Speicher passen „sie effektiv wegwerfen Hälfte des Cache“, weil die Zeiger sind doppelt so groß wie auf einem 32-Bit-System.

Meine Frage ist: kann dieses Problem durch die Installation einer 32-Bit-Betriebssystem auf einem 64-Bit-Maschine vermieden werden? Und gibt es irgendwelche Bandbreite intensive Benchmarks, die den Vorteil in diesem Fall zeigen?

War es hilfreich?

Lösung

Die Antwort lautet: Ja, es zu einem gewissen Grad kann, obwohl der Unterschied in der Leistung unwahrscheinlich ist, groß sein

.

Jede Benchmark dies zu testen hat vielen Zeiger Auflösung zu tun, was schwierig sein wird, aus dem Rauschen zu trennen. Entwerfen einer Benchmark, die nicht optimieren entfernt wird, ist schwierig. Dieser Artikel über fehlerhaftes Java-Benchmarks von jemandem als Antwort gepostet auf eine andere Frage, aber viele der darin beschriebenen Prinzipien wird diese Anwendung.

Andere Tipps

Die Bandbreite ist nicht wirklich der richtige Begriff hier. Was Knuth wirklich sprach war die Datendichte, wie es Fußabdruck zwischenzuspeichern bezieht. Stellen Sie sich vor, dass Sie einen 16 KB L1-Daten-Cache: Wenn Sie rein Zeiger zu speichern, die Sie speichern können 2 ^ 14/2 ^ 2 = 2 ^ 12 = 4096 32-Bit-Zeiger, aber nur 2048 64-Bit-Zeiger. Wenn die Leistung Ihrer Anwendung auf in der Lage, abhängig Strecke von mehr als 2K verschiedenen Puffern zu halten, können Sie einen echten Leistungsvorteil von einem 32-Bit-Adressraum sehen. Allerdings sind die meisten echten Code ist nicht auf diese Weise, und wirkliche Leistungsvorteile von einem Caching-System kommen oft von der Möglichkeit, gemeinsame integer cachen und Floating-Point-Datenstrukturen, nicht riesige Mengen von Zeigern. Wenn Ihr Arbeitssatz nicht Zeiger schwer, die Kehrseite der 64-Bit-vernachlässigbar, und die Oberseite wird viel offensichtlicher, wenn Sie eine Menge von 64-Bit-Integer-Arithmetik durchgeführt wird.

Ich glaube nicht, Knuth beanstandete 64-Bit-Systeme. Er sagte nur, dass auf einem System 64-Bit-Zeiger verwendet werden, das weniger als 4 GB RAM hat, ist idiotisch (zumindest wenn man viele Hinweise wie die, die in einer Doppel verknüpften Liste hat). Ich kann nicht sagen, dass ich mit ihm einverstanden sind, hier sind 3 verschiedene Möglichkeiten, die ergriffen werden können. Nehmen wir an, Sie haben eine 64-Bit-fähige CPU, die auch in 32-Bit-Modus wie ein Intel Core Duo laufen kann.

1 - Alles ist 32-Bit, das Betriebssystem, die Appz, alle von ihnen. So haben Sie 32-Bit-Zeiger, aber Sie können nicht die zusätzlichen Register / Befehle verwenden, die auf 64-Bit-Modus zur Verfügung stehen.

2 - Alles ist 64-Bit, das Betriebssystem, die Appz, alle von ihnen. So haben Sie 64-Bit-Zeiger und Sie können die zusätzlichen Register / Befehle verwenden, die auf 64-Bit-Modus zur Verfügung stehen. Aber wie Sie haben weniger als 4 GB RAM, 64-Bit-Zeiger scheint, wie idiotisch. Aber es ist?

3 - O ist 64-Bit und OS machen interessant sicher, dass alle Code- / Datenzeiger sind in dem 0x00000000 - 0xFFFFFFFF Bereich (Virtual Memory !!!). Das ABI läuft in eine sehr seltsamen Art und Weise, dass die gesamten Code / Datenzeiger im Speicher gehalten / Dateien sind 32-Bit breit, aber sie werden in 64-Bit-Register geladen als Null erweitert. Wenn es ein Code Lage ist zu springen, Compiler / ABI hat die erforderlichen Fix-ups und führt den eigentlichen 64-Bit-Sprung. Auf diese Weise Zeiger sind 32-Bit aber Appz können 64-Bit sein, das heißt, sie Verwendung der Register und Befehle 64-Bit machen. Dieser Prozess wird so etwas wie Thunk, denke ich ;-P

Meine Schlussfolgerung ist ::

Die dritte Option schien mir machbar, aber es ist kein einfaches Problem. In der Theorie kann es funktionieren, aber ich glaube nicht, dass es machbar ist. Und ich denke auch, dass sein Zitat „Wenn eine solche Zeigerwerte innerhalb einer Struktur erscheinen, sie nicht nur die Hälfte der Speicher verschwenden, sie effektiv entfernt Hälfte des Cache werfen.“ übertrieben ist ...

Ich habe irgendwo gesehen, dass die beste Mischung (auf x86-CPUs) ist ein 64-Bit-Betriebssystem und 32-Bit-Anwendungen zu nutzen.

mit einem 64-Bit-Betriebssystem erhalten Sie:

  • Möglichkeit, mehr als 4 GB Adressraum zu verarbeiten
  • mehr, größere Register in Datenkopieroperationen helfen

mit einer 32-Bit-Anwendung, die Sie bekommen:

  • kleiner Zeiger
  • weniger, kleinere Register auf Kontext speichern Schalter

Nachteile:

  • alle Bibliotheken müssen dupliziert werden. winziger von HD Raum-Standards.
  • alle geladenen Bibliotheken werden auf RAM dupliziert. nicht so winzig ...

überraschend, scheint es keinen Overhead zu sein, wenn Modi umzuschalten. Ich denke, das aus dem Userspace bricht auf Kernel das gleiche kostet, unabhängig von der Bitness des User-Space.

Natürlich gibt es einige Anwendungen, die von großem Adressraum profitieren. aber für alles andere, können Sie eine zusätzliche 5% mehr Leistung erhalten, indem bei 32-Bit bleiben.

und nein, ich diesen kleinen Speedup nicht. aber es funktioniert nicht „beleidigen“ ich auf einer 64-Bit-KUbuntu Maschine 32-Bit-FireFox läuft (wie ich auf einigen Foren gesehen habe)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top