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 может помочь определить частоту проблем с инструкциями, занятость и причины задержки, чтобы помочь разработчику определить этот баланс.
Размер блока потока может повлиять на производительность. Если ядро имеет большие блоки и использует барьеры синхронизации, то это может стать причиной сбоя в барьере. Это может быть облегчено уменьшением перекосов на блок нитей.