Существует бесчисленное множество статей и вопросов SO, объясняющих, какие размеры сетки и блоков ядра должны быть установлены и как оптимизировать эти значения, но в статьях, похоже, никогда не упоминаются ограничения SM. Насколько я понимаю, SM может выполнять максимум 1536 потоков и максимум 8 блоков. Конечно, эти значения имеют какое-то значение в таких расчетах, так почему бы им не встречаться чаще?
Например. если размер блока моего ядра составляет 128 потоков, то каждый SM будет запускать только 1024 потока из возможных 1536, что является весьма недостаточным использованием.
Или, может быть, это только я, и этот конкретный момент лампочки занял так много времени, в то время как все остальные «просто знают», что нужно учитывать эти вещи!
Различные архитектуры графических процессоров имеют разные ограничения потоков SM. Обычно встречается 1536, но существуют также 1024 и 2048, в зависимости от арх. SM обычно не ограничиваются 8 блоками, не знаю, откуда вы это взяли. В руководстве по программированию есть таблица, охватывающая эти ограничения, не говоря уже о многочисленных публикациях в Интернете. Размер блока 128 не должен вызывать проблем (сам по себе) и может легко заполнить SM на графическом процессоре, независимо от того, имеет ли он предел в 1024, 1536 или 2048. Проблема, на которую я иногда указываю, заключается в том, что 1024 потока на блок будут недостаточно использоваться. SM с лимитом 1536.
«[Почему] они не возникают чаще?» кажется странным мета-вопросом для SO. Я согласен, что хороший ответ относительно размера блока должен упоминать эти ограничения. Лично я цитирую их, когда сталкиваюсь с людьми, пытающимися использовать очень мало потоков на блок. Одна из причин может заключаться в том, что даже до достижения этих пределов с менее чем 2-3 деформациями на блок часто начинается низкая производительность из-за неэффективного доступа к памяти, учитывая размер страниц памяти (1024 байт). Таким образом, при наличии ядра с привязкой к памяти с линейным шаблоном доступа и доступом 4 байт (8 байт) требуется как минимум 256 (128) потоков на блок.
Кстати, этот аргумент исходит от Стивена Джонса (архитектор CUDA) из Nvidia в его выступлении на GTC 2022 Как работает программирование CUDA , поэтому я доверяю этой информации, но раньше я спрашивал себя, почему нельзя найти эту информацию в «CUDA Best». Практические рекомендации» вместо просто «От 128 до 256 потоков на блок — хороший начальный диапазон для экспериментов с разными размерами блоков»....
tl;dr: Эти цифры появляются не так часто, потому что:
Теперь более длинная версия:
Насколько я понимаю, SM может выполнять максимум 1536 потоков и максимум 8 блоков.
Предполагая, что вы имеете в виду графические процессоры NVIDIA с вычислительными возможностями 8,6–8,9, и глядя на таблицу вычислительных возможностей CUDA , мы находим:
и я предполагаю, что отсюда у вас получилось число 1536. (Все-таки не 8 блоков на СМ, а 16 или 24).
Тем не менее, если мы посмотрим на вычислительные возможности 8.0, например. на картах А40 это 2048 резидентных потоков, а не 1536; и 32 жилых блока. То же самое касается вычислительных возможностей 9.0. Итак, как написал @RobertCrovella в этом комментарии, это очень зависит от архитектуры.
но - даже если вы исправите микроархитектуру графического процессора - это все равно неправильные цифры!
Максимальный размер блока не равен максимальному количеству потоков, которые могут находиться в SM. Вполне типично, что несколько блоков постоянно находятся в SM, при этом деформации из разных блоков планируются в зависимости от доступности. CUDA всегда (?) определяла максимальный размер блока в 1024 потока — не больше и не меньше, независимо от микроархитектуры.
Что касается максимального размера сетки — это скорее «числовые ограничения». За этим же столом вы найдете:
Эти максимумы не зависят от размера блока в потоках или от максимального размера блока в потоках. И хотя они в принципе зависят от вашей микроархитектуры (например, NVIDIA могла бы сделать карту, поддерживающую 128К блоков по оси Y сетки) — на практике эти значения не менялись уже много лет.
Эти значения зависят от архитектуры. Серверные ускорители последних поколений имели 2048 потоков на SM, то есть значения даже не одинаковы для всех карт Ampere. Смотрите эту таблицу.