Урок 4: Подбор размера сетки — достаточно потоков для N
В каждом запуске GPU скрыта небольшая задачка на подсчёт: у вас есть n элементов для обработки, но потоки приходят блоками фиксированного размера — так сколько блоков нужно, чтобы покрыть их все, не пропустив последние? Именно об этом данный урок: как убедиться, что потоков достаточно. Вы уже умеете
Нужно развезти 1000 человек на автобусах по 256 мест. 1000 разделить на 256 — это примерно 3,9, но нельзя заказать 3,9 автобуса — нужно 4 целых, иначе последние пассажиры останутся. Формула округления вверх всегда округляет до целого автобуса. Правда, в четвёртом автобусе останется несколько свободных мест — это те самые лишние потоки, которые просто тихо сидят.
- деление с округлением вверх
- Деление, которое всегда округляет вверх. В целых числах оно выражается как (n + d - 1) / d, чтобы получить число групп, покрывающее все n элементов.
- потоки на блок
- Количество потоков в каждом блоке (второе число в <<<>>>). Распространённое значение — 256. Это знаменатель в формуле числа блоков.
- размер сетки
- Количество запускаемых блоков, numBlocks. Выбирается так, чтобы общее число потоков (numBlocks умножить на threadsPerBlock) было не меньше n.
- проверка границ
- Условие if (i < n) внутри ядра, из-за которого лишние потоки (те, чей индекс выходит за n) не обращаются к памяти.