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

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

У меня GTX 550Ti, кстати, с вычислительными возможностями 2.1. 4 SM x 48 ядер = 192 ядра CUDA.

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

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

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

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

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

3 ответа

Решение

Распределение и параллельное выполнение работ определяются конфигурацией запуска и устройством. В конфигурации запуска указываются размеры сетки, размеры блоков, регистры на поток и общая память на блок. На основании этой информации и устройства вы можете определить количество блоков и деформаций, которые могут выполняться на устройстве одновременно. При разработке ядра вы обычно смотрите на соотношение деформаций, которые могут быть активны на SM, к максимальному количеству деформаций на SM для устройства. Это называется теоретическим занятием. Калькулятор занятости CUDA можно использовать для изучения различных конфигураций запуска.

Когда сетка запускается, распределитель вычислительных работ растеризует сетку и распределяет блоки потоков по SM, а ресурсы SM будут выделяться для блока потоков. Многопоточные блоки могут выполняться одновременно на SM, если SM имеет достаточные ресурсы.

Для запуска деформации SM назначает деформацию планировщику деформации и выделяет регистры для деформации. В этот момент деформация считается активной деформацией.

Каждый планировщик варпа управляет набором варпов (24 на Ферми, 16 на Кеплера). Деформации, которые не застопорились, называются приемлемыми деформациями. В каждом цикле планировщик деформации выбирает приемлемые инструкции деформации и выдачи для деформации для исполнительных единиц, таких как единицы int / fp, единицы с плавающей запятой двойной точности, единицы специальных функций, единицы разрешения ветвей и единицы хранения нагрузки. Единицы исполнения конвейерны, что позволяет многим перекосам иметь 1 или более инструкций в полете за цикл. Деформации могут быть остановлены при выборке команд, зависимостях данных, зависимостях выполнения, барьерах и т. Д.

Каждое ядро ​​имеет свою оптимальную конфигурацию запуска. Такие инструменты, как Nsight Visual Studio Edition и NVIDIA Visual Profiler, могут помочь вам настроить конфигурацию запуска. Я рекомендую вам попытаться написать свой код гибко, чтобы вы могли попробовать несколько конфигураций запуска. Я бы начал с использования конфигурации, которая дает вам как минимум 50% занятости, а затем попытался бы увеличить и уменьшить занятость.

Ответы на каждый вопрос

В: Может ли более одного блока работать одновременно (параллельно) на многопроцессорном процессоре (SM)?

Да, максимальное количество зависит от вычислительных возможностей устройства. См. Таблицу 10. Технические характеристики на вычислительную способность: Максимальное количество резидентных блоков на мультипроцессор для определения значения. В общем, конфигурация запуска ограничивает значение времени выполнения. См. Калькулятор занятости или один из инструментов анализа NVIDIA для получения более подробной информации.

Q: Из того факта, что мое максимальное количество потоков на SM (1536) едва превышает мое максимальное количество потоков на блок (1024), я думаю, что блоки не работают параллельно (возможно, полтора с половиной?).

Конфигурация запуска определяет количество блоков на SM. Отношение максимального количества потоков в блоке к максимальному количеству потоков в SM установлено, чтобы дать разработчику больше гибкости в том, как они работают.

Q: Если я установлю количество блоков, скажем, 4 (мое количество SM), будут ли они отправляться на разные SM каждый? Или я не могу реально контролировать, как все это распространяется на оборудовании, и тогда это спорный вопрос, мое время выполнения будет зависеть от прихотей моего устройства...

Вы имеете ограниченный контроль над распределением работы. Вы можете искусственно управлять этим, ограничивая занятость, выделяя больше разделяемой памяти, но это продвинутая оптимизация.

Q: Во-вторых, я знаю, что блок разделит его потоки на группы из 32 потоков, которые работают параллельно, которые называются деформациями. Теперь эти перекосы (при условии, что они не имеют никакого отношения друг к другу) можно запускать параллельно?

Да, деформации могут работать параллельно.

Q: Потому что в архитектуре Fermi говорится, что 2 деформации выполняются одновременно

Каждый Fermi SM имеет 2 планировщика деформации. Каждый планировщик деформации может отправлять инструкцию (и) для 1 деформации за каждый цикл. Выполнение инструкций передается по конвейеру, поэтому во многих циклах может быть 1 или более инструкций в полете за цикл.

Q: Отправка одной инструкции от каждой деформации группе из 16 (?) Ядер, в то время как где-то еще я читал, что каждое ядро ​​обрабатывает деформацию, что объясняет максимальные потоки 1536 (32x48), но, кажется, немного. Может ли 1 ядро ​​CUDA обрабатывать 32 потока одновременно?

Да. Ядра CUDA - это число целочисленных и с плавающей запятой исполнительных блоков. У СМ есть другие типы исполнительных блоков, которые я перечислил выше. GTX550 - это устройство CC 2.1. В каждом цикле SM может посылать максимум 4 инструкции (128 потоков) за цикл. В зависимости от определения исполнения общее количество потоков в цикле может варьироваться от многих сотен до многих тысяч.

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

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

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

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

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

Другие вопросы по тегам