0Pricing
CUDA Academy · Урок

Финальная свёртка нескольких блоков

Объединяйте частичные суммы отдельных блоков.

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

Части этого урока еще не переведены и отображаются на английском.

Blocks Cannot Talk

A reduction within a block is easy, but blocks run independently and cannot synchronize with each other mid-kernel. So one launch cannot sum everything.

Each Block Produces a Partial

So every block reduces its own chunk to one number, a partial sum, and writes it to a small output array indexed by blockIdx.

if (tid == 0)
  out[blockIdx.x] = data[0];

Now You Have Fewer Values

With 1000 blocks you go from a million inputs to 1000 partials. The hard part is done; only a tiny array remains to combine.

Strategy One: Launch Again

The simplest finish is a second launch of the same kernel on the partials. Repeat until only one value is left.

Recursive Until One

Each pass shrinks the array by the block size. A few recursive launches reduce millions down to a single final sum.

Strategy Two: Atomics

Alternatively, thread 0 of each block can add its partial straight into one global total with atomicAdd, avoiding a second kernel.

if (tid == 0)
  atomicAdd(total, data[0]);

Atomics Trade Off

Atomics are simple and need only one launch, but many blocks contending on the same address can serialize. With few partials it is usually fine.

Strategy Three: Grid-Stride

A grid-stride loop lets each thread first sum many elements into a register, so far fewer blocks are needed before the final step.

for (int i = gid; i < n; i += gridDim.x * blockDim.x)
  sum += in[i];

Fewer Blocks, Less Overhead

Doing more work per thread up front means fewer partials and fewer launches. This often beats spawning one thread per element.

Zero the Total First

If you use atomics, remember to zero the global total before launching, or your sum starts from garbage left in that memory.

Pick by Problem Size

Small inputs love atomics for their simplicity; huge inputs favor a two-pass or grid-stride design. Measure on your data to choose.

Quick Check

Think about why a single kernel launch cannot sum the whole array directly.

Recap

Blocks each emit a partial sum, then you combine them with a second launch, atomics, or grid-stride. You can now reduce arrays of any size. 🏁

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

Урок «Финальная свёртка нескольких блоков» бесплатный?

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

Чему я научусь в уроке «Финальная свёртка нескольких блоков»?

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

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

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

Сколько времени занимает урок «Финальная свёртка нескольких блоков»?

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

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

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

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

  1. Идея дерева свёртки
  2. Устранение расхождения варпов
  3. Последовательная адресация
  4. Финальная свёртка нескольких блоков
← Назад к CUDA Academy