Поделиться через


Модель шейдера HLSL 6.0

Описывает встроенные волны операции, добавленные в модель 6.0 шейдера HLSL.

Модель шейдера 6.0

Для более ранних моделей шейдеров программирование HLSL предоставляет только один поток выполнения. Новые операции на уровне волны предоставляются, начиная с модели 6.0, чтобы явно воспользоваться параллелизмом текущих GPU. Многие потоки могут выполняться в блокировке на одном и том же ядре одновременно. Например, встроенные компоненты модели 6.0 позволяют устранить барьерные конструкции, если область синхронизации находится в пределах ширины процессора SIMD или другого набора потоков, которые, как известно, являются атомарными относительно друг друга.

Возможные варианты использования: сжатие потоков, сокращение, транспонирование блоков, битоник сортировка или быстрые преобразования Фурье (FFT), binning, потоковая отмена дублирования и аналогичные сценарии.

Большинство встроенных элементов отображаются в шейдерах пикселей и вычислительных шейдерах, хотя существуют некоторые исключения (отмеченные для каждой функции). Функции были добавлены в требования для уровня компонентов DirectX 12.0 на уровне API 12.

Параметр <> и возвращаемое значение для этих функций подразумевает тип выражения, поддерживаемые типы — это те из следующего списка, которые также присутствуют в целевой модели шейдера для приложения:

  • половина, половина2, половина3, половина4
  • float, float2, float3, float4
  • double, double2, double3, double4
  • int, int2, int3, int4
  • uint, uint2, uint3, uint4
  • short, short2, short3, short4
  • ushort, ushort2, ushort3, ushort4
  • uint64_t, uint64_t2, uint64_t3, uint64_t4

Некоторые операции (например, побитовые операторы) поддерживают только целые типы.

Терминология

термин определения
Переулок Один поток выполнения. Модели шейдера до версии 6.0 предоставляют только одну из этих моделей на уровне языка, оставляя расширение до параллельной обработки SIMD полностью до реализации.
Волна Набор полос (потоков) выполняется одновременно в процессоре. Явные барьеры не требуются, чтобы гарантировать, что они выполняются параллельно. Аналогичные понятия включают "warp" и "wavefront".
Неактивный лейн Полоса, которая не выполняется, например из-за потока управления или недостаточной работы для заполнения минимального размера волны.
Активный лейн Полоса, для которой выполняется выполнение. В шейдерах пикселей он может включать любые вспомогательные полосы пикселей.
Четырехугольный двор Набор из 4 смежных полос, соответствующих пикселям, расположенным в квадрате 2x2. Они используются для оценки градиентов, различаясь в X или Y. Волна может состоять из нескольких квадверов. Все пиксели в активном квадрате выполняются (и могут быть "Активные полосы"), но те, которые не создают видимые результаты, называются вспомогательными полосами.
Вспомогательный Лейн Полоса, которая выполняется исключительно для градиентов в квадратах шейдера пикселей. Выходные данные такой полосы будут удалены, поэтому не отображаются на целевой поверхности.

Встроенные функции языка заливки

Все операции этой модели шейдера добавлены в ряд встроенных функций.

Запрос волны

Встроенные компоненты для запроса одной волны.

встроенные описание шейдер пикселей шейдер вычислений
WaveGetLaneCount Возвращает количество полос в текущей волне. * *
WaveGetLaneIndex Возвращает индекс текущей полосы в пределах текущей волны. * *
WaveIsFirstLane Возвращает значение true только для активной полосы в текущей волне с наименьшим индексом * *

Голосовая волна

Этот набор встроенных значений сравнивает значения между потоками, активными в настоящее время из текущей волны.

встроенные описание шейдер пикселей шейдер вычислений
WaveActiveAnyTrue Возвращает значение true, если выражение имеет значение true в любой активной полосе в текущей волне. * *
WaveActiveAllTrue Возвращает значение true, если выражение имеет значение true во всех активных полосах в текущей волне. * *
WaveActiveBallot Возвращает 64-разрядную целочисленную битовую маску целого числа без знака для вычисления логического выражения для всех активных полос в указанной волне. * *

Трансляция волн

Эти встроенные функции позволяют всем активным полосам в текущей волне получать значение от указанной полосы, эффективно вещая его. Возвращаемое значение из недопустимой полосы не определено.

встроенные описание шейдер пикселей шейдер вычислений
WaveReadLaneAt Возвращает значение выражения для заданного индекса полосы в пределах указанной волны. * *
WaveReadLaneFirst Возвращает значение выражения для активной полосы текущей волны с наименьшим индексом. * *

Уменьшение волны

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

встроенные описание шейдер пикселей шейдер вычислений
WaveActiveAllEqual Возвращает значение true, если выражение одинаково для каждой активной полосы в текущей волне (и, следовательно, однородно по нему). * *
WaveActiveBitAnd Возвращает побитовое значение И всех значений выражения во всех активных полосах в текущей волне и реплицирует результат ко всем полосам в волне. * *
WaveActiveBitOr Возвращает битовую ИЛИ всех значений выражения во всех активных полосах в текущей волне и реплицирует результат ко всем полосам в волне. * *
WaveActiveBitXor Возвращает побитовое эксклюзивное ИЛИ всех значений выражения во всех активных полосах в текущей волне и реплицирует результат ко всем полосам в волне. * *
WaveActiveCountBits Подсчитывает количество логических переменных, которые оцениваются как истинные во всех активных полосах в текущей волне, и реплицирует результат ко всем полосам в волне. * *
WaveActiveMax Вычисляет максимальное значение выражения во всех активных полосах в текущей волне и реплицирует результат ко всем полосам в волне. * *
WaveActiveMin Вычисляет минимальное значение выражения во всех активных полосах в текущей волне и реплицирует результат ко всем полосам в волне. * *
WaveActiveProduct Умножает значения выражения вместе по всем активным полосам в текущей волне и реплицирует результат ко всем полосам в волне. * *
WaveActiveSum Суммирует значение выражения по всем активным полосам в текущей волне и реплицирует его ко всем полосам в текущей волне и реплицирует результат ко всем полосам в волне. * *

Сканирование волн и префикс

Эти встроенные функции применяют операцию к каждой полосе и оставляют каждый частичный результат вычисления в соответствующей полосе.

встроенные описание шейдер пикселей шейдер вычислений
WavePrefixCountBits Возвращает сумму всех логических переменных, заданных как true для всех активных полос с индексами меньше текущей полосы. * *
WavePrefixSum Возвращает сумму всех значений в активных полосах с меньшими индексами, чем это. * *
WavePrefixProduct Возвращает произведение всех значений в полосах перед этой одной из указанных волн. * *

Операции с перетасовками с четырьмя ширины

Эти встроенные функции выполняют операции замены значений по всей волне, известной как четыре шейдера пикселей, как определено здесь. Индексы пикселей в квадрате определяются в порядке сканирования или чтения, где координаты в квадрате:

+---------> X

| [0] [1]

| [2] [3]

v

Y

Эти подпрограммы работают в вычислительных шейдерах или шейдерах пикселей. В вычислительных шейдерах они работают в четырехквадрах, определенных как равномерно разделенные группы 4 в пределах волны SIMD. В шейдерах пикселей они должны использоваться на волнах, захваченных WaveQuadLanes, в противном случае результаты не определены.

встроенные описание шейдер пикселей шейдер вычислений
QuadReadLaneAt Возвращает указанное исходное значение, считываемое из полосы текущей квадратной четверия, определяемой quadLaneID [0..3], которая должна быть равномерной в квадрате. *
QuadReadAcrossDiagonal Возвращает указанное локальное значение, которое считывается из диагонали противоположной полосе в этом квадрате. *
QuadReadAcrossX Возвращает указанное исходное значение, считываемое из другой полосы в этом квадрате в направлении X. *
QuadReadAcrossY Возвращает указанное исходное значение, считываемое из другой полосы в этом квадрате в направлении Y. *

Возможности оборудования

Чтобы убедиться, что функции операции волн доступны на любом оборудовании, вызовите ID3D12Device::CheckFeatureSupport, отметив описание и использование структуры D3D12_FEATURE_DATA_D3D12_OPTIONS1.