Модель шейдера HLSL 6.0
Описывает встроенные волны операции, добавленные в модель 6.0 шейдера HLSL.
- модель шейдера 6.0
- терминологии
- встроенные языка заливки
- запросов волн
- голосования волн
- трансляция волн
- уменьшения волн
- сканирование волн и префикс
- операций с четырехсторонняя перетасовка
- возможности оборудования
- связанные разделы
Модель шейдера 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.
Связанные разделы
- Руководство по программированию для HLSL
- встроенные модели шейдера 6