CUDA Academy · Урок

Функции __device__ и __host__

Узнайте, где может выполняться каждый вид функции.

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

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

За пределами ядра

Ядра являются точками входа, но большая часть кода находится во вспомогательных функциях. CUDA предоставляет ещё два квалификатора, указывающих, где может выполняться обычная функция. Познакомимся с ними.

Квалификатор __device__

Функция __device__ выполняется на GPU и может вызываться только из другого кода GPU, например из ядра или другой функции устройства.

__device__ int square(int x) {
    return x * x;
}

Вспомогательные функции для ядер

Считайте функции __device__ набором инструментов GPU. Они делают ядра более понятными, храня логику, которую повторно используют потоки устройства.

Квалификатор __host__

Квалификатор __host__ означает обычный код CPU. Он используется по умолчанию, поэтому обычные функции C++ уже являются функциями хоста.

__host__ void setup() {
    // runs on the CPU
}

По умолчанию — хост

Если не указывать квалификаторы, функция по умолчанию предназначена только для хоста. Поэтому обычный C++ по-прежнему компилируется внутри файла .cu.

Обе стороны одновременно

Объедините два квалификатора, и функция будет скомпилирована для обеих сторон. nvcc создаст одну версию для CPU и одну для GPU.

__host__ __device__ int dbl(int x) {
    return x + x;
}

Зачем компилировать для двух сторон?

Пометка вспомогательной функции как __host__ __device__ позволяет использовать одну и ту же математику в эталонном коде CPU и внутри ядер без дублирования. ✨

Правила вызова

Код хоста не может вызывать функцию __device__, а код устройства не может вызывать функцию, предназначенную только для хоста. Компилятор контролирует эту границу.

Без __global__ на устройстве

Функцию __device__ нельзя запускать. Только ядра __global__ принимают запуск с тройными угловыми скобками от хоста.

Встраивание для ускорения

Компилятор часто встраивает небольшие функции __device__, поэтому выделение логики во вспомогательные функции обычно ничего не стоит во время выполнения.

Выбирайте правильную пометку

Выбирайте её по месту выполнения: __device__ — для вспомогательных функций GPU, __host__ — для кода CPU, а оба квалификатора — когда логика общая.

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

Пора проверить, как вы усвоили квалификаторы устройства и хоста.

Итоги

Вы узнали, что __device__ выполняется на GPU, __host__ — на CPU, значение по умолчанию — хост, а объединение обоих квалификаторов позволяет использовать одну функцию в обоих мирах. 🎯

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

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

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

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

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

Урок «Функции __device__ и __host__» бесплатный?

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

Чему я научусь в уроке «Функции __device__ и __host__»?

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

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

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

Сколько времени занимает урок «Функции __device__ и __host__»?

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

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

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

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

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