Frage

Moderne x86 CPUs haben die Fähigkeit, größere Seitengrößen als die Legacy-4K (dh 2 MB oder 4 MB) zu unterstützen, und es gibt OS Einrichtungen ( Linux , von Windows ) auf diese Funktionalität zugreifen zu können.

Der Microsoft Link oben Zuständen große Seiten „erhöhen die Effizienz des Übersetzungspuffers, die für häufig aufgerufene Speicherleistung erhöhen“. Welche ist nicht sehr hilfreich bei der Vorhersage, ob große Seiten, jede Situation zu verbessern. Ich bin in Beton interessiert, vorzugsweise quantifiziert, Beispiele, wo einige Programmlogik zu bewegen (oder eine ganze Anwendung) großen Seiten zu verwenden, hat sich in einem gewissen Leistungsverbesserung geführt. Jeder bekam keine Erfolgsgeschichten?

Da ist ein besonderer Fall, den ich kenne ich : mit sehr großen Seiten können dramatisch die Zeit reduzieren, musste Gabel einen großen Prozesses (vermutlich als die Anzahl von Aufzeichnungen TLB Kopieren benötigen um einen Faktor in der Größenordnung von 1000 reduziert wird). Ich bin daran interessiert, ob große Seiten können auch ein Vorteil in weniger exotischen Szenarien.

War es hilfreich?

Lösung 2

Ich habe versucht, einen Code zu ersinnen, die Abreibung des TLB mit 4k-Seiten, um die Gewinne zu untersuchen möglich von großen Seiten maximieren würde. Der Stoff, unten läuft 2,6-mal schneller (als 4K-Seiten), wenn 2MByte Seiten werden von libhugetlbfs malloc zur Verfügung gestellt (Intel i7, 64bit Debian Lenny); hoffentlich klar, was scoped_timer und random0n tun.

  volatile char force_result;

  const size_t mb=512;
  const size_t stride=4096;
  std::vector<char> src(mb<<20,0xff);
  std::vector<size_t> idx;
  for (size_t i=0;i<src.size();i+=stride) idx.push_back(i);
  random0n r0n(/*seed=*/23);
  std::random_shuffle(idx.begin(),idx.end(),r0n);

  {
    scoped_timer t
      ("TLB thrash random",mb/static_cast<float>(stride),"MegaAccess");
    char hash=0;
    for (size_t i=0;i<idx.size();++i) 
      hash=(hash^src[idx[i]]);
    force_result=hash;
  }

Eine einfachere "gerade Linie" Version mit nur hash=hash^src[i] nur 16% von großen Seiten gewonnen, aber (wilde Spekulation) Intel Phantasie Hardware Prefetching kann den 4K Fall werden helfen, wenn Zugriffe vorhersehbar ist (ich glaube, ich könnte disable Prefetching zu untersuchen, ob das wahr ist).

Andere Tipps

Der größte Unterschied in der Leistung wird kommen, wenn Sie sind weit auseinander liegenden zufälligen Zugriffen auf einen großen Bereich des Speichers zu tun - wobei „groß“ bedeutet viel größer ist als der Bereich, der durch alle kleinen Seiteneinträge in den TLBs abgebildet werden können (die in der Regel mehrere Ebenen in modernen Prozessoren).

Um die Dinge komplizierter zu machen, ist die Anzahl der TLB-Einträge für 4 kB-Seiten oft größer als die Anzahl der Einträge für 2MB Seiten, aber das ist sehr unterschiedlich von dem Prozessor. Es gibt auch eine Menge Unterschiede in wie viele „große Seite“ Einträge in der Stufe 2 TLB zur Verfügung stehen.

Zum Beispiel auf einer AMD Opteron Familie 10h Revision D ( "Istanbul") System, CPUID Berichte:

  • L1 DTLB: 4 KB Seiten: 48 Einträge; 2MB Seiten: 48 Einträge; 1GB Seiten: 48 Einträge
  • L2-TLB: 4 KB Seiten: 512 Einträge; 2MB Seiten: 128 Einträge; 1GB Seiten: 16 Einträge

Während auf einem Intel Xeon 56xx ( "Westmere") System, CPUID Berichte:

  • L1 DTLB: 4 KB Seiten: 64 Einträge; 2MB Seiten: 32 Einträge
  • L2-TLB: 4 KB Seiten: 512 Einträge; 2MB Seiten: keine

Beide können 2MB Karte (512 * 4 KB) mit kleinen Seiten vor Leiden Level 2 TLB-Fehler, während das Westmere-System 64 MB mit seinen 32 2MB TLB-Einträgen und das AMD-System kann 352MB die 176 2MB TLB-Einträge mit der Karte abbilden kann in seinem L1 und L2 TLBs. Jedes System wird eine signifikante Beschleunigung erhalten durch die Verwendung großer Seiten für Zufallszugriffe über Speicherbereiche, die viel größer als 2 MB sind und weniger als 64 MB. Das AMD-System sollte auch weiterhin eine gute Leistung zeigen, die Verwendung großer Seiten für viel größere Speicherbereiche.

Was Sie versuchen, in allen diesen Fällen zu vermeiden, ist der schlimmste Fall (Anmerkung 1) Szenario von allen vier Ebenen des x86_64 hierarchischen Adressübersetzung durchquert.
Falls keine der Adressübersetzung Caching-Mechanismen (Anmerkung 2) Arbeit, es erfordert:

  • 5 Fahrten in den Speicher zu laden Daten auf einer 4 kB-Seite zugeordnet,
  • 4 Fahrten in dem Speicher zu laden Daten abgebildet auf einer 2MB Seite, und
  • 3 Fahrten zu Speicherdaten Lesen auf einer Seite 1 GB abgebildet.

In jedem Fall ist die letzte Reise in dem Speicher, um die angeforderten Daten zu erhalten, während die anderen Fahrten erforderlich sind, um die verschiedenen Teile der Seite Übersetzungsinformationen zu erhalten. Die beste Beschreibung, die ich gesehen habe, ist in Abschnitt 5.3 von AMDs „AMD64 Architektur-Programmierhandbuch Band 2: System-Programmierung“ (Publikation 24593) http://support.amd.com/us/Embedded_TechDocs/24593.pdf

Anmerkung 1: Die Zahlen sind oben nicht wirklich die Schlimmste Fall. unter einer virtuellen Maschine ausgeführt macht diese Zahlen noch schlimmer. Laufen in einer Umgebung, die der Speicher die verschiedenen Ebenen der Seitentabellen halten bewirkt, auf die Festplatte getauscht zu bekommen macht Leistung viel schlimmer.

Hinweis 2: Leider ist auch dieses Maß an Detail zu wissen, ist nicht genug, denn alle modernen Prozessoren für die oberen Ebene der Seite Übersetzung Hierarchie zusätzliche Caches haben. Soweit ich diese sehr schlecht dokumentiert in der Öffentlichkeit berichten.

Ich habe Szenarien gesehen Verbesserung in einigen HPC / Grid - speziell Pakete Physik mit sehr, sehr großen Modellen auf Maschinen mit viel, viel RAM. Auch der Prozess das Modell laufen war das einzige, was aktiv an der Maschine. Ich vermute, haben allerdings nicht gemessen, dass bestimmte DB-Funktionen (zum Beispiel Massenimporte) würde auch profitieren.

Ich persönlich glaube, dass, wenn Sie ein sehr gut profilierte / verstanden Speicherzugriffsprofil haben, und es hat eine Menge von großem Speicherzugriff, ist es unwahrscheinlich, dass Sie keine signifikante Verbesserung sehen werden.

Dies ist immer geheim, aber Huge TLB Seiten machen einen signifikanten Unterschied auf der Intel Xeon Phi (MIC) Architektur, wenn die DMA-Speicher-Übertragungen zu tun (von Host Phi via PCIe). Diese Intel Link beschreibt, wie große Seiten ermöglichen . Ich fand DMA Übertragungsgrößen über 8 MB mit normaler TLB-Seitengröße (4K) gestartet Abnahme Leistungssteigerung von etwa 3 GB / s auf unter 1 GB / s, wenn die Übertragungsgröße 512 MB getroffen.

Nach der Aktivierung der großen TLB-Seiten (2MB) setzte sich die Datenrate auf über 5 GB erhöhen / s für DMA-Übertragungen von 512 MB.

Ich erhalte eine ~ 5% Speedup auf Servern mit viel Speicher (> = 64 GB) läuft große Prozesse. z.B. für einen 16 GB Java-Prozess, die 4M x 4 kB-Seiten ist aber nur 4k x 4 MB-Seiten.

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