Предварительная версию Shader Model 6.10 в рамках обновления DirectX Agility SDK 1.720 не стало революцией, но принесло ряд целенаправленных улучшений для современных рабочих нагрузок — от нейросетевого рендеринга до крупномасштабных вычислительных задач.
Новый набор матричных API, объединённых под названием LinAlg, стандартизирует операции линейной алгебры прямо на уровне шейдеров. Это позволяет эффективно выполнять вычисления, связанные с нейросетевым рендерингом и обработкой изображений, без привлечения отдельных вычислительных ядер. Особенность в том, что матричные операции теперь доступны из отдельных потоков шейдеров в графическом конвейере реального времени.
API вводит две новые встроенные функции: GetGroupWaveIndex() и GetGroupWaveCount(). Они дают вычислительным, меш- и амплификационным шейдерам прямое представление о структуре «волны» внутри группы потоков. Первая возвращает индекс текущей волны, вторая — общее количество волн, выполняющих группу. Это устраняет необходимость в небезопасных обходных путях (например, делении SV_GroupIndex на WaveGetLaneCount()) и обеспечивает корректную работу на любом GPU с любым размером волны.
Снято многолетнее ограничение в 32 КБ (28 КБ для меш-шейдеров) на общую память группы. Разработчики теперь могут запрашивать фактический аппаратный лимит через новый вызов MaxGroupSharedMemoryPerGroup, а в точке входа шейдера указывать требуемый объём памяти с помощью атрибута [GroupSharedLimit()]. Это позволяет использовать полную ёмкость современных GPU, открывая путь к алгоритмам с крупными тайловыми вычислениями, программной растеризацией и большими матричными задачами, которые раньше упирались в ограничения спецификации, а не «железа».
Добавлены две полезные функции:
Старая модель ResourceBarrier не умела выражать зависимости между однотипными операциями (например, копирование → копирование), что приводило к последовательному выполнению и простоям GPU. Новые API позволяют по-настоящему перекрывать независимые операции, а разработчики берут на себя явную синхронизацию только там, где есть реальные конфликты (например, перекрывающиеся регионы одного буфера). Также добавлены команды ClearTextureSubresources и FillBuffers для пакетной очистки и заполнения, а также ClearBoundRenderTargetViews для очистки прямо привязанных целей рендеринга.
Обновление продолжает тенденцию к смещению акцента в пользу современных архитектур:
Более старые архитектуры выпадают из списка поддержки, что знаменует собой дальнейшее движение Microsoft в сторону оптимизации API под возможности современного «железа» в ущерб обратной совместимости.
Разработчики получают более эффективные инструменты для нейросетевого рендеринга, трассировки лучей и крупномасштабных вычислительных эффектов. Поддержка линейной алгебры в шейдерах открывает новые возможности для ML на GPU. Снятие ограничений на общую память групп позволяет реализовывать алгоритмы, которые раньше были невозможны.
Для пользователей эти улучшения означают более предсказуемую производительность и лучшее использование возможностей их видеокарт в будущих играх и приложениях, однако только при условии, что они используют современные GPU. Владельцы старого оборудования, скорее всего, не увидят выгоды от этих изменений.
Источник: www.playground.ru