Распределитель вычислений рассчитает блок потока (CTA) на SM только в том случае, если SM имеет достаточные ресурсы для блока потока (разделяемая память, перекосы, регистры, барьеры, ...). Ресурсы уровня потока, такие как разделяемая память. Выделение создает достаточное количество перекосов для всех потоков в блоке потоков. Диспетчер ресурсов распределяет циклические циклические переходы в подразделы SM. Каждое дочернее подразделение SM содержит планировщик warp, файл регистрации и исполнительные блоки. Как только декомпозиция распределяется на дочернее подразделение, она будет оставаться на дочернем подразделении до тех пор, пока она не завершится или не будет пресечена контекстным переключателем (архитектура Pascal). При восстановлении контекстного переключателя warp будет восстановлен на тот же самый SM-идентификатор warp-id.
Когда все потоки в warp завершены, планировщик warp ожидает завершения всех выдающихся инструкций, выданных warp, а затем диспетчер ресурсов выпускает ресурсы уровня warp, которые включают warp-id и файл регистра.
Когда все перекосы в блоке потока завершены, освобождаются ресурсы уровня блока, а SM уведомляет Распределителя рабочих вычислений, что блок завершен.
После того, как деформация выделена дочернему элементу и выделены все ресурсы, деформация считается активной, что означает, что планировщик основы активно отслеживает состояние основы. На каждом цикле планировщик деформаций определяет, какие активные перекосы застопорились и которые могут выдавать инструкцию. Планировщик варпа выбирает наивысший приоритет, подходящий для основы, и выдает 1-2 последовательных инструкций из основы. Правила для двойной проблемы специфичны для каждой архитектуры. Если warp выдает нагрузку на память, он может продолжать выполнять независимые инструкции, пока не достигнет зависимой команды. Варп будет сообщать о застое, пока загрузка не завершится. То же самое верно для зависимых математических инструкций. Архитектура SM предназначена для скрыть как ALU, так и задержку памяти путем переключения за цикл между перекосами.
Этот ответ не использует термин ядро CUDA, так как это вводит неправильную ментальную модель. Сердечники CUDA представляют собой конвейерные одноточечные системы с плавающей запятой/целыми числами. Частота выпуска и зависимость зависят от каждой архитектуры. В каждом подразделении SM и SM есть другие исполнительные блоки, включая блоки загрузки/хранения, блоки с плавающей точкой с двойной точностью, блоки с плавающей точкой с половинной точностью, блоки филиалов и т. Д.
Чтобы максимизировать производительность, разработчик должен понимать компромисс между блоки против перекосов против регистров/потоков.
Термин «занятость» - это отношение активных перекосов к максимальным искажениям на SM. Архитектура Kepler - Pascal (кроме GP100) имеет 4 планировщика деформации для каждого SM. Минимальное количество перекосов на SM должно быть, по крайней мере, равным количеству планировщиков warp. Если у архитектуры есть зависящая задержка выполнения 6 циклов (Максвелл и Паскаль), то для покрытия латентности вам понадобится по меньшей мере 6 перекосов на планировщик, который равен 24 на SM (24/64 = 37,5% занятости). Если в потоках имеется параллелизм уровня инструкций, это может быть уменьшено. Почти все ядра выдают команды с переменной задержкой, такие как нагрузки на память, которые могут занимать 80-1000 циклов. Это требует более активных перекосов для каждого планировщика деформации, чтобы скрыть латентность. Для каждого ядра есть точка отскока между количеством перекосов и других ресурсов, таких как разделяемая память или регистры, поэтому оптимизация для 100% занятости не рекомендуется, поскольку, вероятно, будет сделана другая жертва.Профилировщик CUDA может помочь определить причины проблем с обучением, занятость и причины останова, чтобы помочь разработчику определить этот баланс.
Размер блока резьбы может влиять на производительность. Если ядро имеет большие блоки и использует барьеры для синхронизации, то барьерные стойла могут стать поворотными причинами. Это можно уменьшить, уменьшив количество перекосов на блок потока.
Только одно дополнение: на новых устройствах имеется 32 (Compute Capability 2.0) или 48 (2.1) сердечников CUDA на SM. Фактическое число на самом деле не имеет большого значения для программирования, размер основы равен 32 и имеет тот же смысл (т. Е. Выполняется в режиме блокировки). – Tom
И на самом деле Compute Capability 3.0 (Kepler) теперь увеличивает сердечники/SM чрезвычайно - до 192! – Edric
Я все еще не понимаю. Таким образом, это всегда 1 warp на ядро, а количество перекосов на SM равно количеству ядер на SM? И как блоки потоков блокируются? Блоки всегда состоят из целых чисел перекосов? Если, например, каждый блок содержит 3 искажения, значит ли это, что я использую 3 ядра на заданном SM? –