0Pricing
CUDA Academy · Урок

Разворачивание циклов с помощью #pragma unroll

Сокращайте накладные расходы циклов и раскрывайте ILP.

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

У циклов есть скрытые издержки

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

Что делает разворачивание

Разворачивание цикла копирует его тело несколько раз на итерацию, поэтому цикл выполняется меньше раз. Та же работа выполняется с меньшим количеством подсчётов и переходов.

for (int i = 0; i < n; i += 2) {
    out[i]     = in[i]     * 2;
    out[i + 1] = in[i + 1] * 2;
}

Пусть это сделает компилятор

CUDA предоставляет подсказку, чтобы вам не приходилось копировать код вручную. Поместите #pragma unroll непосредственно перед циклом, и компилятор развернёт его за вас.

#pragma unroll
for (int i = 0; i < 4; i++)
    sum += a[i];

Задайте конкретный множитель

Можно запросить точное количество, записав число после директивы. #pragma unroll 4 разворачивает цикл по четыре итерации за раз.

#pragma unroll 4
for (int i = 0; i < n; i++)
    acc += w[i] * x[i];

Отключение разворачивания

Иногда полное разворачивание раздувает код или расходует регистры. Запись #pragma unroll 1 сообщает компилятору оставить цикл свёрнутым ровно в том виде, как он написан.

#pragma unroll 1
for (int i = 0; i < n; i++)
    process(i);

Постоянное число итераций помогает

Разворачивание лучше всего работает, когда число итераций известно во время компиляции. Фиксированное число итераций позволяет компилятору полностью преобразовать цикл в линейный код.

Разворачивание открывает возможности ILP

У скопированных итераций часто нет зависимостей друг от друга. Это даёт планировщику больше независимых инструкций для перекрытия и бесплатно скрывает задержку.

Меньше переходов — более быстрый путь

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

Компромисс с регистрами

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

Размер кода тоже растёт

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

Измеряйте, прежде чем доверять результату

Разворачивание — это рекомендация, а не магия. Всегда позволяйте профилировщику подтверждать, что выбранный множитель действительно ускоряет ваше ядро на вашем GPU.

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

Вы хотите, чтобы компилятор полностью развернул небольшой цикл с фиксированным числом итераций. Что нужно записать?

Итоги: меняем подсчёты на скорость

Вы узнали, что #pragma unroll сокращает накладные расходы цикла и открывает возможности ILP, но увеличивает затраты на регистры и размер кода. Измеряйте каждый множитель, чтобы убедиться в его пользе. 🧩

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

Урок «Разворачивание циклов с помощью #pragma unroll» бесплатный?

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

Чему я научусь в уроке «Разворачивание циклов с помощью #pragma unroll»?

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

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

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

Сколько времени занимает урок «Разворачивание циклов с помощью #pragma unroll»?

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

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

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

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

  1. Параллелизм на уровне инструкций
  2. Разворачивание циклов с помощью #pragma unroll
  3. Векторизованные загрузки с float4
  4. Регистровое давление и выгрузка
← Назад к CUDA Academy