Как комментирует @talonmies, ваша математика не совсем корректна. Но ключевым моментом является то, что SM содержит баланс многих различных типов ресурсов. Чем лучше ваши параметры запуска ядра и ядра соответствуют этому балансу, тем лучше ваша производительность.
Я не проверял числа для Kepler (вычислительная способность 3.x), но для Fermi (2.x) SM может отслеживать 48 параллельных перекосов (1536 потоков) и 8 параллельных блоков. Это означает, что если вы выбрали низкое количество потоков для ваших блоков, 8 параллельных блоков станут ограничивающим фактором для размещения в вашем ядре. Например, если вы выбрали 32 потока на блок, вы получите до 256 (8 * 32) одновременных потоков, запущенных на SM, в то время как SM может работать до 1,536 потоков (48 * 32).
В калькуляторе занятости вы можете увидеть, что такое различные аппаратные ограничения, и он скажет вам, какой из них станет ограничивающим фактором вашего конкретного ядра. Вы можете поэкспериментировать с вариациями параметров запуска, использования общей памяти и использования регистров, чтобы узнать, как они влияют на ваше размещение.
Занятость - это еще не все, что касается производительности. Увеличение занятости приводит к увеличению способности скрывать задержку передачи памяти. Когда пропускная способность памяти насыщена, увеличение занятости еще больше не помогает. В игре есть и другой эффект. Увеличение размера блока может уменьшение заполняемость, но в то же время увеличение количество параллелизма уровня инструкций (ILP), доступное в вашем ядре. В этом случае уменьшение занятости может повысить производительность.
@Roger Dahl: Я полагаю, что вы можете дать мне хорошее объяснение, спасибо :) – stonestrong
Сначала укажите, что файл регистра, на который вы ссылаетесь, содержит 32k * регистров *, а не 32kb. Это значительно меняет вашу математику. – talonmies