Потоковые мультипроцессоры, блоки и потоки (CUDA) - PullRequest
63 голосов
/ 19 августа 2010

Какова связь между ядром CUDA, потоковым мультипроцессором и моделью блоков и потоков CUDA?

Что сопоставляется с тем, что и что распараллеливается и как?и что более эффективно, максимизировать количество блоков или количество потоков?


В настоящее время я понимаю, что на мультипроцессор приходится 8 ядер cuda.и что каждое ядро ​​cuda сможет одновременно выполнять один блок cuda.и все потоки в этом блоке выполняются последовательно в этом конкретном ядре.

Это правильно?

Ответы [ 4 ]

61 голосов
/ 19 августа 2010

Расположение потоков / блоков подробно описано в руководстве по программированию CUDA . В частности, в главе 4 говорится:

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

Каждый SM содержит 8 ядер CUDA, и в каждый момент времени они выполняют одну деформацию из 32 потоков - поэтому для выдачи одной инструкции для всей деформации требуется 4 такта. Вы можете предположить, что потоки в любой заданной деформации выполняются в режиме блокировки, но для синхронизации между деформациями необходимо использовать __syncthreads().

32 голосов
/ 15 июня 2016

Для GTX 970 имеется 13 потоковых мультипроцессоров (SM) со 128 ядрами Cuda каждый. Ядра Cuda также называются потоковыми процессорами (SP).

Вы можете определить сетки, которые отображают блоки в GPU.

Вы можете определить блоки, которые отображают потоки в потоковые процессоры (128 ядер Cuda на SM).

Одна основа всегда состоит из 32 потоков, и все потоки основы выполняются одновременно.

Чтобы использовать всю возможную мощность графического процессора, вам нужно гораздо больше потоков на SM, чем на SM. Для каждой вычислительной возможности существует определенное количество потоков, которые могут одновременно находиться в одном SM. Все блоки, которые вы определяете, ставятся в очередь и ждут, пока SM получит ресурсы (количество свободных SP), затем он загружается. СМ начинает выполнять Деформации. Так как один Деформация имеет только 32 Потока, а SM имеет, например, 128 SP, SM может выполнить 4 Деформации в данный момент времени. Дело в том, что если потоки обращаются к памяти, поток будет блокироваться до тех пор, пока его запрос памяти не будет удовлетворен. В цифрах: арифметические вычисления на SP имеют задержку 18-22 цикла, в то время как доступ к глобальной памяти без кэширования может занять до 300-400 циклов. Это означает, что если потоки одной деформации ожидают данных, будет работать только подмножество из 128 SP. Для этого планировщик переключается на выполнение другой деформации, если она доступна. И если этот варп блокирует, он выполняет следующий и так далее. Эта концепция называется скрытием латентности. Количество перекосов и размер блока определяют занятость (из скольких перекосов СМ может выбрать выполнение). Если занятость высока, маловероятно, что у SP нет работы.

Ваше утверждение, что каждое ядро ​​cuda будет выполнять по одному блоку за раз, неверно. Если вы говорите о потоковых мультипроцессорах, они могут выполнять деформации из всех потоков, находящихся в SM. Если один блок имеет размер 256 потоков, а ваш графический процессор позволяет 2048 потоков для каждого SM, то каждый SM будет иметь 8 блоков, из которых SM может выбирать деформации для выполнения. Все потоки выполненных основ выполняются параллельно.

Здесь вы найдете номера для различных вычислительных возможностей и архитектур GPU: https://en.wikipedia.org/wiki/CUDA#Limitations

Вы можете скачать лист расчета занятости от Nvidia Лист расчета занятости (от Nvidia) .

4 голосов
/ 26 мая 2017

Compute Work Distributor будет планировать блок потоков (CTA) на SM, только если SM имеет достаточно ресурсов для блока потоков (общая память, деформации, регистры, барьеры, ...). Ресурсы на уровне блоков потоков, такие как разделяемая память, выделяются. Выделение создает достаточные перекосы для всех потоков в блоке потоков. Менеджер ресурсов распределяет деформации, используя round robin для подразделов SM. Каждое подразделение SM содержит планировщик деформации, файл реестра и исполнительные блоки. После того, как деформация выделена подразделу, он останется в подразделе до тех пор, пока не завершится или не будет заменен переключением контекста (архитектура Pascal). При переключении контекста при восстановлении основы будет восстановлен тот же SM с тем же идентификатором деформации.

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

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

Как только деформация выделена подразделу и все ресурсы распределены, деформация считается активной, то есть планировщик деформации активно отслеживает состояние деформации. В каждом цикле планировщик деформации определяет, какие активные деформации останавливаются, а какие имеют право выдавать инструкцию. Планировщик деформации выбирает деформацию с наивысшим приоритетом и выдает 1-2 последовательные инструкции из деформации. Правила двойного выпуска специфичны для каждой архитектуры. Если деформация вызывает загрузку памяти, она может продолжать выполнять независимые инструкции, пока не достигнет зависимой инструкции. Деформация будет сообщать об остановке до завершения загрузки. То же самое верно для зависимых математических инструкций. Архитектура SM предназначена для сокрытия задержки ALU и памяти путем переключения между циклами между перекосами.

В этом ответе не используется термин «ядро CUDA», поскольку он вводит неверную ментальную модель. Ядра CUDA представляют собой конвейерные блоки с плавающей запятой одинарной точности / целочисленные. Частота проблем и задержка зависимости зависят от конкретной архитектуры. Каждое подразделение SM и SM имеют другие исполнительные блоки, включая блоки загрузки / хранения, блоки с плавающей запятой двойной точности, блоки с плавающей запятой половинной точности, блоки ветвления и т. Д.

Чтобы максимизировать производительность, разработчик должен понимать, как соотносятся блоки с деформациями и регистры / потоки.

Термин «занятость» - это отношение активных деформаций к максимальным деформациям на SM. Архитектура Kepler - Pascal (кроме GP100) имеет 4 планировщика деформации на SM. Минимальное количество деформаций на SM должно быть по меньшей мере равным количеству планировщиков деформаций. Если архитектура имеет зависимую задержку выполнения в 6 циклов (Максвелл и Паскаль), то для планирования задержки потребуется по меньшей мере 6 деформаций на планировщик, что составляет 24 на SM (24/64 = 37,5% занятости). Если потоки имеют параллелизм на уровне команд, это можно уменьшить. Почти все ядра выдают инструкции с переменной задержкой, такие как загрузка памяти, которая может занять 80-1000 циклов. Это требует более активных деформаций на планировщик деформации, чтобы скрыть задержку. Для каждого ядра существует компромисс между количеством перекосов и другими ресурсами, такими как разделяемая память или регистры, поэтому не рекомендуется оптимизировать загрузку на 100%, так как, скорее всего, будут сделаны некоторые другие жертвы. Профилировщик CUDA может помочь определить частоту проблем с инструкциями, занятость и причины задержки, чтобы помочь разработчику определить этот баланс.

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

0 голосов
/ 10 ноября 2018

На одном устройстве установлено несколько потоковых мультипроцессоров.
SM может содержать несколько блоков.Каждый блок может содержать несколько потоков.
SM имеет несколько ядер CUDA (как разработчик, вы не должны заботиться об этом, потому что он абстрагирован от деформации), который будет работать с потоком.СМ всегда работает на деформации потоков (всегда 32).Деформация будет работать только с потоком из одного блока.
SM и оба блока имеют ограничения по количеству потоков, количеству регистров и общей памяти.

...