Когда вы меняете размер сетки, вы меняете общее количество потоков.Таким образом, фокусируясь на общем количестве потоков, основной целью является максимальная пропускная способность потоков в потоковом режиме для графического процессора, на котором вы работаете.
Код графического процессора, который стремится максимизировать использование графического процессора, на котором он работает., должен попытаться иметь как минимум столько потоков.Меньше может быть плохо, больше вряд ли будет иметь большое значение.
Эта цель легко рассчитать.Для большинства графических процессоров это число в 2048 раз превышает количество SM в вашем графическом процессоре.( Графические процессоры Тьюринга снизили максимальную нагрузку на поток для SM с 2048 до 1024 ).
Вы можете узнать количество SM в вашем GPU во время выполнения, используя вызов cudaGetDeviceProperties()
(изучите пример кода deviceQuery
).
Как только выузнайте количество SM, умножьте его на 2048. Это количество потоков, запускаемых в вашей сетке.На этом уровне настройки / аппроксимации не должно быть необходимости изменять настроенное количество потоков в блоке.
Это правда, что ваш конкретный код может не достичь 2048 потоков на каждом SM (этосвязанные с обсуждением размещение ).Однако, для упрощенной цели, это ничего не повредит.Если вы уже знаете реальную возможность занятости вашего кода или использовали API занятости , чтобы определить его, то вы можете уменьшить свою цель с 2048 потоков на SM до некоторого меньшего числа.Но такое уменьшение, вероятно, не сильно улучшит производительность вашего кода, если вообще сделает.