Урок 8: циклы grid-stride и произвольное N
До сих пор мы предполагали, что один thread обрабатывает один элемент, а if (i < n) следит за границами. Но что происходит, когда n больше числа threads, которые мы запустили? При миллионе элементов и всего 262 144 threads половина массива так и не вычисляется. Решение — цикл grid-stride: каждый thr
Представьте 100 стульев, которые нужно расставить, но всего 10 помощников. Вместо того чтобы каждый расставлял один стул и уходил домой, каждый помощник начинает со своего стула и каждый раз прыгает на 10 стульев вперёд: 1, 11, 21... так 10 человек покрывают все 100 стульев.
- цикл grid-stride
- Шаблон, в котором каждый thread обрабатывает несколько элементов, прыгая между ними на размер всего грида, пока индекс не выйдет за n.
- stride
- Расстояние, на которое индекс прыгает вперёд: blockDim.x * gridDim.x, то есть общее число threads в гриде.
- gridDim
- Число blocks в гриде. gridDim.x * blockDim.x даёт общее число threads вдоль одного измерения.
- произвольное N
- Ввод любого размера, даже больше числа threads. Цикл grid-stride покрывает его, не меняя конфигурацию запуска.