CUDA Academy · Урок

Раздельные адресные пространства

Почему указатель хоста недействителен на устройстве.

Урок 3 из 413 шагов

«Раздельные адресные пространства» — бесплатный урок CUDA Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения CUDA Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс CUDA Academy содержит 4 уроков всего.

Две отдельные области памяти

У CPU и GPU есть собственная RAM. Они не используют общее адресное пространство, и этот факт определяет всю работу CUDA. 🧠

Что означает адрес

Указатель — это всего лишь число, обозначающее ячейку памяти. Эта ячейка имеет смысл только в том адресном пространстве, где указатель был создан.

Указатели хоста локальны

Указатель, полученный из malloc, обозначает память хоста. На GPU такой ячейки нет, поэтому передача этого указателя ядру указывает в недопустимое место.

int* h = (int*)malloc(n * sizeof(int));

Указатели устройства тоже локальны

Указатель, полученный из cudaMalloc, обозначает память устройства. CPU не может читать её напрямую: разыменование на хосте приводит к сбою.

int* d;
cudaMalloc(&d, n * sizeof(int));

Классическая ошибка

Передача указателя хоста ядру успешно компилируется, но завершается ошибкой во время выполнения. Само число допустимо, но обозначенная им память находится не на GPU.

Почему это всё равно компилируется

Для C++ оба указателя выглядят как один и тот же тип, поэтому компилятор не выдаёт предупреждений. Несоответствие проявляется только тогда, когда GPU обращается к адресу.

Связывание с помощью cudaMemcpy

Чтобы перемещать данные между пространствами, необходимо явно копировать их с помощью cudaMemcpy. Автоматического общего доступа между ними нет.

cudaMemcpy(d, h, bytes, cudaMemcpyHostToDevice);

Помогает соглашение об именовании

Многие программисты добавляют префикс h_ к указателям хоста, а к указателям устройства — d_. Эта привычка предотвращает неприятные ошибки смешения.

float *h_a, *d_a;

Ядра видят пространство устройства

Внутри ядра каждый разыменовываемый указатель должен находиться в памяти устройства. Это единственное пространство, доступное потокам GPU.

Подсказка об унифицированной памяти

Позже вы познакомитесь с унифицированной памятью — одним указателем, действительным с обеих сторон. А пока строго разделяйте указатели хоста и устройства.

Ментальная модель

Представьте две комнаты без общих полок. Чтобы использовать данные из другой комнаты, необходимо перенести копию, а не просто указать через границу.

Быстрая проверка

Проверим, понимаете ли вы раздельные адресные пространства.

Итоги

Вы узнали, что хост и устройство находятся в раздельных адресных пространствах, указатели несовместимы, а cudaMemcpy используется для передачи данных через границу. ✅

Можно начать бесплатно

Изучай C++ с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
30
Уроки
120

Часто задаваемые вопросы

Урок «Раздельные адресные пространства» бесплатный?

Да — полный текст урока «Раздельные адресные пространства» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс CUDA Academy, подпишись на CoddyKit PRO. Курс CUDA Academy содержит 4 уроков всего.

Чему я научусь в уроке «Раздельные адресные пространства»?

Почему указатель хоста недействителен на устройстве. Ты практикуешь CUDA Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать CUDA Academy?

Предыдущий опыт не требуется. CUDA Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Раздельные адресные пространства»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке CUDA Academy?

Да. Каждый урок CUDA Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Квалификатор функции __global__
  2. Функции __device__ и __host__
  3. Раздельные адресные пространства
  4. Жизненный цикл программы CUDA
← Назад к CUDA Academy