CUDA Academy · Lektion

Koaleszierte vs. gestridete Lesezugriffe

Wie die Zuordnung von Threads zu Adressen eine Rolle spielt.

Lektion 2 von 413 Schritte

Koaleszierte vs. gestridete Lesezugriffe ist eine kostenlose CUDA Academy-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des CUDA Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der CUDA Academy-Kurs umfasst insgesamt 4 Lektionen.

Alles dreht sich um die Abbildung

Die Koaleszierung hängt davon ab, welche Adresse jeder Thread anspricht. Die Zuordnung von Thread zu Adresse entscheidet darüber, ob eine Transaktion den gesamten Warp bedient.

Das koaleszierte Muster

Wenn benachbarte Threads benachbarte Adressen lesen, deckt der Warp einen zusammenhängenden Bereich ab. Dieses übersichtliche Layout ist ein koaleszierter Zugriff.

int i = blockIdx.x * blockDim.x + threadIdx.x;
float v = data[i];

Warum es sich lohnt

Thread 0 greift auf Index 0 zu, Thread 1 auf Index 1 und so weiter. Alle 32 Adressen liegen in einer ausgerichteten Cache-Zeile, daher benötigt die GPU nur eine einzige Transaktion.

Der Stride kommt ins Spiel

Ein Stride ist der feste Abstand zwischen den Adressen, auf die aufeinanderfolgende Threads zugreifen. Sobald dieser Abstand größer als ein Element wird, beginnt die Koaleszierung zu scheitern.

float v = data[i * stride];

Stridierte Lesezugriffe verteilen sich

Bei einem Stride von 2 liest Thread 0 den Wert 0, Thread 1 den Wert 2 und Thread 2 den Wert 4. Der Warp erstreckt sich nun über doppelt so viel Speicher und benötigt daher mehr Transaktionen.

Die Kosten steigen

Bei doppeltem Stride werden ungefähr doppelt so viele Cache-Zeilen berührt. Große Strides können dazu führen, dass ein Warp viele Transaktionen benötigt, obwohl er aus jeder Cache-Zeile nur einen kleinen Teil verwendet.

Eine häufige Falle

Wenn Sie jedem Thread eine ganze Spalte einer im Zeilenformat gespeicherten Matrix zuweisen, entsteht ein riesiger Stride. Im Code sieht das ordentlich aus, verteilt aber stillschweigend jeden Warp über viele Speicherstellen.

float v = matrix[threadIdx.x * width + row];

Die Zuordnung transponieren

Oft besteht die Lösung einfach darin, den Index zu ändern, der sich mit dem Thread am schnellsten ändert. Lassen Sie aufeinanderfolgende Threads auf aufeinanderfolgende Speicherstellen zugreifen, und die Lesezugriffe werden wieder koalesziert.

float v = matrix[row * width + threadIdx.x];

Auch Offsets schaden

Selbst ein koalesziertes Muster leidet, wenn es in der Mitte einer Cache-Zeile beginnt. Ein nicht ausgerichteter Offset verschiebt den Warp über eine Grenze und teilt einen Lesezugriff in zwei auf.

In Warps denken

Um ein Zugriffsmuster zu beurteilen, betrachten Sie nicht nur einen Thread. Stellen Sie sich alle 32 Lanes gleichzeitig vor und fragen Sie sich, wie viele Cache-Zeilen ihre Adressen gemeinsam abdecken. 🔍

Die Faustregel

Lassen Sie dem sich am schnellsten ändernden Index threadIdx.x folgen. Diese eine Gewohnheit hält die meisten globalen Lesezugriffe kostenlos koalesziert.

Schnelltest

Wählen Sie das Zugriffsmuster aus, das am besten koalesziert.

Zusammenfassung

Sie haben gesehen, dass koaleszierte Lesezugriffe benachbarte Elemente zusammenhalten, während ein Stride sie über mehrere Cache-Zeilen verteilt. Lassen Sie threadIdx.x den sich am schnellsten ändernden Index bestimmen. 🎉

Kostenlos starten

Lerne C++ mit einem KI-Tutor — kostenlos

Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.

Kurse
30
Lektionen
120

Häufig gestellte Fragen

Ist die Lektion „Koaleszierte vs. gestridete Lesezugriffe“ kostenlos?

Ja — der vollständige Text von „Koaleszierte vs. gestridete Lesezugriffe“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des CUDA Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der CUDA Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Koaleszierte vs. gestridete Lesezugriffe“?

Wie die Zuordnung von Threads zu Adressen eine Rolle spielt. Du übst CUDA Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um CUDA Academy zu starten?

Keine Vorkenntnisse erforderlich. CUDA Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.

Wie lange dauert die Lektion „Koaleszierte vs. gestridete Lesezugriffe“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser CUDA Academy-Lektion Code schreiben und ausführen?

Ja. Jede CUDA Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Was eine Speichertransaktion ist
  2. Koaleszierte vs. gestridete Lesezugriffe
  3. Structure of Arrays vs. Array of Structs
  4. Die effektive Bandbreite messen
← Zurück zu CUDA Academy