Ответ 1
Распределение и параллельное выполнение работы определяются конфигурацией запуска и устройством. В конфигурации запуска указаны размеры сетки, размеры блоков, регистры на поток и общая память на блок. На основе этой информации и устройства вы можете определить количество блоков и перекосов, которые могут выполняться на устройстве одновременно. При разработке ядра вы обычно смотрите на соотношение деформаций, которые могут быть активны на SM, до максимального количества перекосов на SM для устройства. Это называется теоретическим заполнением. Калькулятор занятости CUDA можно использовать для изучения различных конфигураций запуска.
Когда сетка запущена, дистрибьютор вычислительной работы растрирует сетку и распределяет блоки потоков для SM, а ресурсы SM будут выделены для блока потока. Несколько блоков потоков могут выполняться одновременно на SM, если SM имеет достаточные ресурсы.
Чтобы запустить warp, SM назначает warp планировщику warp и выделяет регистры для warp. На этом этапе деформация считается активной деформацией.
Каждый планировщик warp управляет набором перекосов (24 на Ферми, 16 на Кеплере). Деформации, которые не застопорены, называются подходящими перекосами. На каждом цикле планировщик warp выбирает подходящие инструкции и инструкции для варпа для блоков исполнения, таких как блоки int/fp, единицы с плавающей запятой двойной точности, специальные функциональные блоки, блоки разрешения ветвей и единицы хранения нагрузки. Исполнительные блоки конвейерны, что позволяет нескольким деформациям иметь 1 или более инструкций в полете в каждом цикле. Деформации могут быть остановлены на выборке команд, зависимостях данных, зависимостях выполнения, барьерах и т.д.
Каждое ядро имеет другую оптимальную конфигурацию запуска. Такие инструменты, как Nsight Visual Studio Edition и NVIDIA Visual Profiler, могут помочь вам настроить вашу конфигурацию запуска. Я рекомендую вам написать свой код гибким образом, чтобы вы могли попробовать несколько конфигураций запуска. Я бы начал с использования конфигурации, которая дает вам по меньшей мере 50% занятости, а затем попробуйте увеличить и уменьшить занятость.
Ответы на каждый вопрос
Q: Можно ли выполнить более одного блока AT ONCE (параллельно) на мультипроцессоре (SM)?
Да, максимальное число основано на вычислительной способности устройства. См. Таблицу 10. Технические характеристики для каждой возможности расчета: максимальное количество блоков резидентов на многопроцессорный компьютер для определения значения. В общем случае конфигурация запуска ограничивает значение времени выполнения. Подробнее см. Калькулятор занятости или один из инструментов анализа NVIDIA.
Q: Из-за того, что мое максимальное количество потоков на SM (1536) едва больше моего максимального количества потоков на блок (1024), я бы подумал, что блоки не запускаются параллельно (может быть, 1 с половиной?).
Конфигурация запуска определяет количество блоков на SM. Отношение максимальных потоков на каждый блок к максимальным потокам на SM устанавливается таким образом, чтобы разработчик мог более гибко работать с разделом.
Q: Если я задал количество блоков, скажем, 4 (мое число SM), они будут отправляться на другой SM каждый? Или я не могу реально контролировать, как все это распространяется на аппаратное обеспечение, а затем это спорный вопрос, мое время выполнения зависит от капризов моего устройства...
У вас ограниченный контроль над распределением работы. Вы можете искусственно контролировать это, ограничивая занятость, выделяя большую общую память, но это расширенная оптимизация.
Q: Во-вторых, я знаю, что блок будет делить потоки на группы из 32 потоков, которые работают параллельно, называемые перекосами. Теперь эти перекосы (предполагающие, что они не имеют никакого отношения друг к другу) также могут проходить параллельно?
Да, деформации могут выполняться параллельно.
Q: Поскольку в архитектуре Ферми указано, что 2 искажения выполняются одновременно
Каждый Fermi SM имеет 2 планировщика перекосов. Каждый планировщик деформации может отправлять инструкции для 1 деформирования каждого цикла. Выполнение инструкции конвейерно, так много перекосов могут иметь 1 или более инструкций в полете в каждом цикле.
Q: Отправка одной инструкции из каждой основы в группу из 16 (?) ядер, а где-то еще я читаю, что каждое ядро обрабатывает деформацию, что объясняет максимальные потоки 1536 (32x48), но кажется немного. Может ли 1 CUDA-ядро обрабатывать 32 потока одновременно?
Да. CUDA-ядра - это число целых и целочисленных блоков. У SM есть другие типы исполнительных блоков, которые я перечислял выше. GTX550 - это устройство CC 2.1. На каждом цикле SM имеет возможность отправлять не более 4 инструкций (128 потоков) за цикл. В зависимости от определения исполнения общие потоки в полете за цикл могут варьироваться от многих сотен до многих тысяч.