Lässt es sich mit cremefarbenem Papier, einer Tönung, mehr Kontrast oder größerer Schrift besser lesen? Wählen Sie Ihre Farben und Ihre Schrift, einmalig für alle Seiten.

Kostenlose Lektion

GPU-Architektur: Grid, Block und Thread

Nach dieser Lektion: Ich kann erklären, wie eine GPU ihre Threads in Blöcken und einem Gitter ordnet.

Lektion, 60 Min.3 BefehleParallelverarbeitung-Lab: wie eine GPU denkt, ohne GPU, in JupyterLab

Wie eine GPU ihre Threads ordnet

Eine GPU (Graphics Processing Unit, Grafikprozessor) ist ein Chip, der eine kleine Funktion von tausenden Threads gleichzeitig ausführen lässt. Die Threads sind in Blöcken geordnet, die Blöcke in einem Gitter (Grid).

Jeder Thread muss selbst ausrechnen, welches Element ihm gehört. Genau diese Rechnung lernen Sie hier.

Am Ende dieser Lektion

Notiz

Ich kann erklären, wie eine GPU ihre Threads in Blöcken und einem Gitter ordnet.

Schlüsselwörter

BegriffWas er bedeutetBeispiel
Threadein kleiner Ablauf, der ein Element bearbeitet
Blockeine Gruppe von Threads, die zusammen gestartet wird
Gitteralle Blöcke eines Starts (Grid)
Blockgrößedie Zahl der Threads in einem Block256
Globaler Indexdie Nummer eines Threads im ganzen Gitter

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Auch hier gibt es keine GPU

Wichtig

Das Lab-Skript spielt den Start einer GPU in Python nach, Thread für Thread nacheinander. Es zeigt die Ordnung und die Rechnung, nicht die Geschwindigkeit.

Eine GPU hat sehr viele einfache Recheneinheiten

Eine CPU hat wenige starke Kerne, die ganz verschiedene Aufgaben erledigen. Eine GPU hat sehr viele einfache Recheneinheiten, die dieselbe Aufgabe auf vielen Daten ausführen.

Die kleine Funktion, die jeder Thread ausführt, heißt Kernel. Ein Start führt sie für jeden Thread einmal aus.

Globaler Index: Block mal Größe plus Thread

In jedem Block zählen die Threads wieder bei 0. Damit jeder ein eigenes Element findet, braucht er eine Nummer im ganzen Gitter.

Die Regel: globaler Index = Blocknummer mal Blockgröße plus Threadnummer. Block 1, Thread 2 und Blockgröße 4 ergeben 1 mal 4 plus 2, also 6.

Drei Blöcke zu je vier Threads

BlockThread 0Thread 1Thread 2Thread 3
00123
14567
2891011

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Die Tabelle in Python

Code: python
# Ein Start mit 3 Bloecken zu je 4 Threads.
bloecke = 3
block_groesse = 4

for block_nr in range(bloecke):
    for thread_nr in range(block_groesse):
        index = block_nr * block_groesse + thread_nr
        print("Block", block_nr, "Thread", thread_nr, "-> Index", index)
# Aendern Sie block_groesse auf 8 und bloecke auf 2.

Das Lab spielt einen Start nach

Das Skript kernel.py startet 3 Blöcke zu je 4 Threads für 10 Elemente und gibt für jeden Thread eine Zeile aus. Die Wörter „block“, „thread“ und „global index“ sind englisch.

Die letzten beiden Zeilen haben die Indizes 10 und 11. Dort gibt es kein Element, und der Thread tut nichts.

Ein simulierter Start im Lab

Befehl
docker exec jupyter python3 steps/kernel.py

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Block 2, Blockgröße 256, Thread 5

Befehl
docker exec jupyter python3 -c "print(2 * 256 + 5)"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Jedes Element braucht einen Thread

Zehn Elemente und Blöcke zu vier Threads: Zwei Blöcke reichen nicht, es wären nur acht Threads. Man braucht drei Blöcke, also zwölf Threads.

Man teilt die Elemente durch die Blockgröße und rundet auf. Die Threads ohne Element sind überzählig.

Blöcke und überzählige Threads

ElementeBlockgrößeBlöckeThreadsÜberzählig
1043122
84280
10002564102424

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Aufrunden von zehn durch vier

Befehl
docker exec jupyter python3 -c "print(-(-10 // 4))"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Ein häufiger Fehler

Warnung

Viele denken, die Threadnummer reiche aus, um das Element zu finden. Sie beginnt aber in jedem Block bei 0. Erst mit der Blocknummer ergibt sich der globale Index. Ohne sie bearbeiten alle Blöcke dieselben ersten Elemente.

Weiterführend

Ein Bild hat 1920 mal 1080 Bildpunkte, also 2.073.600. Wie viele Blöcke zu 256 Threads braucht man, und wie viele Threads sind überzählig?

Prüfen Sie es mit der Tabelle oben und mit dem Befehl zum Aufrunden.

Über dieses Lab und seinen Quellcode: Parallelverarbeitung-Lab: wie eine GPU denkt, ohne GPU, in JupyterLab

Sie unterrichten eine Gruppe? Weisen Sie dieses Modul Ihren Studierenden zu, mit Handbuch für Lehrende, automatisch geprüften Aufgaben und einem Lab für jede Person.