CUDA Блоки и деформации - программирование
Подтвердить что ты не робот

CUDA Блоки и деформации

Хорошо, я знаю, что связанные вопросы задавались снова и снова, и я читал почти все, что я нашел об этом, но все еще неясно. Вероятно, потому, что я нашел и прочитал вещи, противоречащие друг другу (возможно, потому, что, будучи в разное время, они ссылались на устройства с разной вычислительной способностью, между которыми, кажется, был довольно разрыв). Я стараюсь быть более эффективным, чтобы сократить время выполнения, и поэтому мне нужно точно знать, сколько потоков/перекосов/блоков может выполняться одновременно параллельно. Также я думал об обобщении этого и вычислении оптимального количества потоков и блоков для передачи на мое ядро, основываясь только на количестве операций, которые, как я знаю, мне нужно делать (для более простых программ) и системных спецификациях.

У меня есть GTX 550Ti, btw с вычислительной способностью 2.1. 4 SMs x 48 ядер = 192 ядра CUDA.

Хорошо, так что мне непонятно:

Можно выполнить более одного блока AT ONCE (параллельно) на мультипроцессоре (SM)? Я читал, что до 8 блоков можно назначить SM, но ничего не известно о том, как они запускаются. Из-за того, что мое максимальное количество потоков на SM (1536) едва больше моего максимального количества потоков на блок (1024), я думаю, что блоки не запускаются параллельно (может быть, полторы?). Или, по крайней мере, нет, если у меня есть максимальное количество потоков на них. Также, если я задаю количество блоков, скажем, 4 (мое число SM), они будут отправляться на другой SM каждый? Или я не могу реально контролировать, как все это распространяется на аппаратное обеспечение, а затем это спорный вопрос, мое время выполнения зависит от капризов моего устройства...

Во-вторых, я знаю, что блок будет делить потоки на группы из 32 потоков, которые работают параллельно, называемые перекосами. Теперь эти перекосы (предполагающие, что они не имеют никакого отношения друг к другу) могут быть запущены параллельно? Поскольку в архитектуре Fermi указано, что 2 искажения выполняются одновременно, отправка одной инструкции из каждого warp в группу из 16 (?) Ядер, а где-то еще я читаю, что каждое ядро ​​обрабатывает warp, что объясняет максимальные потоки 1536 ( 32 * 48), но кажется немного. Может ли 1 CUDA-ядро обрабатывать 32 потока одновременно?

В более простой заметке, я прошу: (например, если я хочу суммировать 2 вектора в третьем, какую длину я должен им дать (nr операций) и как их разделить на блоки и потоки для моего устройства работать одновременно (параллельно) на полную мощность (без наличия простаивающих ядер или SM).

Прошу прощения, если это было задано раньше, и я не понял его или не видел. Надеюсь, ты поможешь мне. Спасибо!

4b9b3361

Ответ 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 потоков) за цикл. В зависимости от определения исполнения общие потоки в полете за цикл могут варьироваться от многих сотен до многих тысяч.

Ответ 2

Я хочу быть более эффективным, чтобы сократить время выполнения, и поэтому мне нужно точно знать, сколько потоков/перекосов/блоков может выполняться одновременно параллельно.

Короче говоря, количество потоков/перекосов/блоков, которые могут работать одновременно, зависит от нескольких факторов. В Руководстве по лучшей практике CUDA C есть запись в Оптимизация конфигурации выполнения, которая объясняет эти факторы и дает некоторые советы для рассуждений о том, как сформировать ваше приложение.

Ответ 3

Одна из концепций, которые потребовались для использования, - для меня - эффективность аппаратной поддержки для контекстного переключения на чипе CUDA.

Следовательно, контекстный коммутатор возникает при каждом доступе к памяти, что позволяет проводить вычисления для многих контекстов попеременно, в то время как другие ждут доступа к ним. ne способов, с помощью которых архитектуры GPGPU достигают производительности, - это возможность распараллеливать этот путь, в дополнение к распараллеливанию на кратных ядрах.

Наилучшая производительность достигается, когда ядро ​​не ожидает доступа к памяти, и достигается благодаря наличию достаточно контекстов для обеспечения этого.