Функции __device__ и __host__
Узнайте, где может выполняться каждый вид функции.
«Функции __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 — локальная установка не требуется.
Все уроки этого курса
- Квалификатор функции __global__
- Функции __device__ и __host__
- Раздельные адресные пространства
- Жизненный цикл программы CUDA