Wie bestimmen Volkov und Demmel experimentell die Latenzen, Zeilengrößen und Seitengrößen einer GPU?

8

In "LU-, QR- und Cholesky-Faktorisierungen unter Verwendung der Vektorkapazitäten von GPUs" von Vasily Volkov und James Demmel gibt es eine interessante Möglichkeit, die Latenzen, Zeilengrößen und Seitengrößen eines Caches anhand eines Diagramms wie folgt zu interpretieren:

Abbildung 1 aus dem Papier

Anscheinend ist die Zeilengröße dort, wo der Cache ein Plateau beginnt (ungefähr 32 Bytes in diesem Beispiel). Woher kommt das?

Und woher wissen wir, dass bei der Seitengröße das zweite Plateau für den globalen Speicher beginnt?

Warum sinken die Latenzen schließlich mit einer ausreichend großen Schrittlänge? Sollten sie nicht weiter zunehmen?

Wenn dies tatsächlich funktioniert und es scheint, wäre das fantastisch, da wir viele undokumentierte Daten über den Cache einer GPU erhalten können.

John Hoffman
quelle
John, ich hoffe ich habe deine Frage hilfreich beantwortet. Könnten Sie bitte Ihre Frage bearbeiten, um ihr einen etwas aussagekräftigeren / durchsuchbareren Titel zu geben, sowie einen korrekten Verweis und ein Zitat auf das von Ihnen zitierte Papier geben? In Naturwissenschaften und Mathematik (und auf dieser Website) wird es als ziemlich schlecht angesehen, ein Bild aus einem Artikel zu verwenden, ohne die Autoren und den Titel aufzulisten.
Aron Ahmadia

Antworten:

8

Wenn dies tatsächlich funktioniert und es scheint, wäre das fantastisch, da wir viele undokumentierte Daten über den Cache einer GPU erhalten können.

Ein frustrierender Aspekt der Hochleistungsrechnerforschung ist das Durchsuchen aller undokumentierten Befehlssätze und Architekturfunktionen, wenn versucht wird, Code zu optimieren. In HPC ist der Beweis im Benchmark, ob es sich um High Performance Linpack oder STREAMS handelt. Ich bin mir nicht sicher, ob dies "großartig" ist, aber es ist definitiv, wie Hochleistungsverarbeitungseinheiten bewertet und bewertet werden.

Anscheinend ist die Zeilengröße dort, wo der Cache ein Plateau beginnt (ungefähr 32 Bytes in diesem Beispiel). Woher kommt das?

Sie scheinen mit den Leistungskonzepten der Cache-Hierarchie vertraut zu sein, die in Bryant und O'Hallarons Computersystemen als "Speicherberg" bezeichnet wird : Die Perspektive eines Programmierers , aber Ihre Frage weist auf einen Mangel an tiefem Verständnis dafür hin, wie jede Cache-Ebene selbst funktioniert funktioniert.

Erinnerungsberg

Denken Sie daran, dass ein Cache "Datenzeilen" enthält, dh Streifen zusammenhängenden Speichers, die mit einem Speicherort irgendwo im Hauptspeicher harmonisiert sind. Wenn wir innerhalb einer Zeile auf den Speicher zugreifen, wird der Cache "getroffen", und die mit dem Abrufen dieses Speichers verbundene Latenz wird als Latenz für diesen bestimmten Cache bezeichnet. Beispielsweise zeigt eine L1-Cache-Latenz von 10 Zyklen an, dass jedes Mal, wenn sich die angeforderte Speicheradresse bereits in einer der L1-Cache-Zeilen befindet, erwartet wird, dass sie in 10 Zyklen abgerufen wird.

Wie Sie der Beschreibung des Benchmarks für die Zeigerjagd entnehmen können, werden Schritte mit fester Länge durch den Speicher ausgeführt. NB: Dieser Benchmark würde in den vielen modernen CPUs mit "Stream-Detection" -Vorabrufeinheiten, die sich nicht wie einfache Caches verhalten, NICHT wie erwartet funktionieren.

Es ist dann sinnvoll, dass das erste wahrnehmbare Leistungsplateau (ab Schritt 1) ​​ein Schritt ist, der von früheren Cache-Fehlern nicht wiederverwendet wird. Wie lange muss ein Schritt dauern, bis er die zuvor abgerufene Cache-Zeile vollständig überschritten hat? Die Länge der Cache-Zeile!

Und woher wissen wir, dass bei der Seitengröße das zweite Plateau für den globalen Speicher beginnt?

In ähnlicher Weise ist das nächste Plateau, das über die Wiederverwendung hinausgeht, wenn die vom Betriebssystem verwaltete Speicherseite bei jedem Speicherzugriff ausgetauscht werden muss. Die Speicherseitengröße ist im Gegensatz zur Cache-Zeilengröße normalerweise ein Parameter, der vom Programmierer festgelegt oder verwaltet werden kann.

Warum sinken die Latenzen schließlich mit einer ausreichend großen Schrittlänge? Sollten sie nicht weiter zunehmen?

Dies ist definitiv der interessanteste Teil Ihrer Frage und erklärt, wie die Autoren die Cache-Struktur (Assoziativität und Anzahl der Sätze) basierend auf den zuvor gesammelten Informationen (Größe der Cache-Zeilen) und der Größe des Arbeitssatzes von postulieren Daten, über die sie schreiten. Erinnern Sie sich an den Versuchsaufbau, dass die Schritte das Array "umschließen". Für einen ausreichend großen Schritt ist die Gesamtmenge der Array-Daten, die im Cache gespeichert werden müssen (der sogenannte Arbeitssatz), kleiner, da mehr Daten im Array übersprungen werden. Um dies zu veranschaulichen, können Sie sich eine Person vorstellen, die ständig eine Treppe hoch und runter rennt und nur jeden vierten Schritt macht. Diese Person berührt weniger Gesamtschritte als jemand, der alle 2 Schritte macht. Diese Idee wird in der Zeitung etwas umständlich formuliert:

Wenn der Schritt sehr groß ist, verringert sich der Arbeitssatz, bis er wieder in den Cache passt. Diesmal entstehen Konfliktfehler, wenn der Cache nicht vollständig assoziativ ist.

Wie Bill Barth in seiner Antwort erwähnt, geben die Autoren in dem Artikel an, wie sie diese Berechnungen durchführen:

Die Daten in 1 legen einen vollständig assoziativen TLB mit 16 Einträgen (kein TLB-Overhead für 128 MB Array, 8 MB Schritt), einen assoziativen 20-Wege-L1-Cache (20 KB Array bei 1 KB Schritt passt in L1) und einen 24-Wege-TLB nahe Stellen Sie den assoziativen L2-Cache ein (zurück zur L2-Trefferlatenz für 768-KB-Array, 32-KB-Schritt). Dies sind die effektiven Zahlen, und die tatsächliche Implementierung kann unterschiedlich sein. Sechs 4-Wege-Set-assoziative L2-Caches stimmen ebenfalls mit diesen Daten überein.

Aron Ahmadia
quelle
0

Ich würde sagen, dass der Absatz auf Seite 3, der mit "Eine größere Latenzzeit weist auf mehr Cache-Fehler hin" beginnt. erklärt das meiste, was du fragst, ziemlich gut.

Bill Barth
quelle