Дистриб'ютор обчислювальної роботи запланує блок потоків (CTA) на SM, лише якщо SM має достатньо ресурсів для потокового блоку (спільна пам'ять, перекоси, регістри, бар'єри, ...). Виділяються ресурси рівня блоку, такі як спільна пам'ять. Розподіл створює достатню кількість перекосів для всіх потоків у потоковому блоці. Менеджер ресурсів розподіляє деформації з використанням кругової програми для підрозділів SM. Кожен підрозділ SM містить планувальник деформацій, файл реєстру та блоки виконання. Після того, як деформація призначена підрозділу, вона залишатиметься в підрозділі до завершення або попереднього вибору за допомогою перемикача контексту (архітектура Паскаля). У контекстному перемикачі відновлення деформація буде відновлена до того ж SM-ідентичного деформації.
Коли всі потоки в деформації завершені, планувальник деформацій чекає завершення всіх видатних інструкцій, виданих деформацією, і тоді менеджер ресурсів випускає ресурси рівня деформації, які включають ідентифікатор деформації та файл реєстрації.
Коли всі деформації в потоковому блоці завершені, тоді звільняються ресурси рівня блоку, і SM повідомляє Compute Work Distributor про те, що блок завершено.
Після того, як деформація виділена підрозділу, і всі ресурси виділено, деформація вважається активною, що означає, що планувальник деформацій активно відстежує стан деформації. На кожному циклі планувальник деформацій визначає, які активні деформації зупиняються, а які можуть видавати інструкції. Планувальник деформацій вибирає деформацію з найвищим пріоритетом та видає 1-2 послідовних інструкції з основи. Правила подвійного випуску специфічні для кожної архітектури. Якщо деформація видає навантаження на пам'ять, вона може продовжувати виконувати незалежні інструкції, поки не дійде до залежної інструкції. Потім деформація буде повідомляти про зупинку, поки завантаження не завершиться. Те саме стосується і залежних математичних інструкцій. Архітектура SM призначена для приховування як ALU, так і затримки пам'яті, перемикаючись за цикл між перекосами.
У цій відповіді не використовується термін CUDA core, оскільки це вводить неправильну розумову модель. Ядра CUDA є конвеєрними одиницями виконання одиничної точності з плаваючою комою / цілим числом. Частота видачі та затримка залежності характерні для кожної архітектури. Кожен підрозділ SM та SM мають інші одиниці виконання, включаючи одиниці завантаження / зберігання, одиниці з плаваючою комою з подвійною точністю, одиниці з плаваючою комою з половиною точності, одиниці філій тощо
Для того, щоб максимізувати продуктивність, розробник повинен розуміти компроміс між блоками та перекосами проти регістрів / потоків.
Термін заповнення - це відношення активних деформацій до максимальних деформацій на SM. Кеплер - архітектура Паскаля (крім GP100) має 4 планувальника деформацій на кожну SM. Мінімальна кількість деформацій на одну СМ повинна бути принаймні рівною кількості планувальників деформацій. Якщо архітектура має залежну затримку виконання 6 циклів (Максвелл та Паскаль), то для покриття затримки вам знадобиться принаймні 6 перекосів на планувальник, що становить 24 на СМ (24/64 = 37,5% зайнятості). Якщо потоки мають паралельність рівня інструкцій, це може бути зменшено. Майже всі ядра видають інструкції із змінною затримкою, такі як завантаження пам'яті, що може зайняти 80-1000 циклів. Це вимагає більш активних деформацій на кожен планувальник деформацій, щоб приховати затримку. Для кожного ядра існує компромісна точка між кількістю деформацій та іншими ресурсами, такими як спільна пам'ять або регістри, тому оптимізація для 100% заповнення не рекомендується, оскільки, ймовірно, буде зроблена інша жертва. Профілізатор CUDA може допомогти визначити швидкість видачі інструкцій, заповнення та причини зупинки, щоб допомогти розробнику визначити цей баланс.
Розмір блоку нитки може вплинути на продуктивність. Якщо ядро має великі блоки і використовує бар'єри синхронізації, то бар'єрний зрив може бути причиною зриву. Це можна полегшити, зменшивши викривлення на блок ниток.