Getrennte Adressräume
Warum ein Host-Pointer auf dem Device ungültig ist.
Getrennte Adressräume ist eine kostenlose CUDA Academy-Lektion auf CoddyKit. Dies ist Lektion 3 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.
Zwei getrennte Speicher
CPU und GPU besitzen jeweils ihren eigenen Arbeitsspeicher. Sie teilen sich keinen gemeinsamen Adressraum, und diese Tatsache prägt CUDA grundlegend. 🧠
Was eine Adresse bedeutet
Ein Pointer ist lediglich eine Zahl, die einen Speicherplatz bezeichnet. Dieser Speicherplatz ist nur in dem Adressraum gültig, in dem er erstellt wurde.
Host-Pointer sind lokal
Ein Pointer aus malloc bezeichnet Host-Speicher. Auf der GPU gibt es keinen solchen Speicherplatz. Wenn Sie ihn an einen Kernel übergeben, zeigt er daher auf keine gültige Stelle.
int* h = (int*)malloc(n * sizeof(int));Auch Device-Pointer sind lokal
Ein Pointer aus cudaMalloc bezeichnet Device-Speicher. Die CPU kann ihn nicht direkt lesen; eine Dereferenzierung auf dem Host führt zum Absturz.
int* d;
cudaMalloc(&d, n * sizeof(int));Der klassische Fehler
Die Übergabe eines Host-Pointers an einen Kernel wird problemlos kompiliert, schlägt aber zur Laufzeit fehl. Die Zahl ist gültig, doch der bezeichnete Speicher befindet sich nicht auf der GPU.
Warum es trotzdem kompiliert wird
Für C++ sehen beide Pointer wie derselbe Typ aus, daher bleibt der Compiler still. Der Typkonflikt wird erst sichtbar, wenn die GPU auf die Adresse zugreift.
Mit cudaMemcpy überbrücken
Um Daten zwischen den Speicherbereichen zu übertragen, müssen Sie sie explizit mit cudaMemcpy kopieren. Es gibt keine automatische gemeinsame Nutzung über diese Grenze hinweg.
cudaMemcpy(d, h, bytes, cudaMemcpyHostToDevice);Eine Namenskonvention hilft
Viele Programmierer versehen Host-Pointer mit dem Präfix h_ und Device-Pointer mit d_. Diese Gewohnheit verhindert schmerzhafte Verwechslungen.
float *h_a, *d_a;Kernel sehen den Device-Speicher
Innerhalb eines Kernels muss jeder dereferenzierte Pointer im Device-Speicher liegen. Nur auf diesen Speicherbereich können GPU-Threads zugreifen.
Hinweis zum Unified Memory
Später lernen Sie den Unified Memory kennen, bei dem ein Pointer auf beiden Seiten gültig ist. Vorerst müssen Sie Host- und Device-Pointer strikt getrennt halten.
Das mentale Modell
Stellen Sie sich zwei Räume ohne gemeinsame Regale vor. Um Daten im anderen Raum zu verwenden, müssen Sie eine Kopie hinübertragen, statt einfach über die Grenze zu zeigen.
Schnellüberprüfung
Stellen wir sicher, dass Sie getrennte Adressräume verstehen.
Zusammenfassung
Sie haben gelernt, dass Host und Device in getrennten Adressräumen leben, Pointer nicht austauschbar sind und cudaMemcpy Daten über diese Grenze überträgt. ✅
Häufig gestellte Fragen
Ist die Lektion „Getrennte Adressräume“ kostenlos?
Ja — der vollständige Text von „Getrennte Adressräume“ 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 „Getrennte Adressräume“?
Warum ein Host-Pointer auf dem Device ungültig ist. 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 3 von 4.
Wie lange dauert die Lektion „Getrennte Adressräume“?
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
- Der Funktionsqualifizierer __global__
- __device__- und __host__-Funktionen
- Getrennte Adressräume
- Der Lebenszyklus eines CUDA-Programms