HLSL Shader Model 6.0
Описание встроенных функций волновой операции, добавленных в модель шейдера HLSL 6.0.
- Модель шейдера 6.0
- Терминология
- Встроенные функции языка заливки
- Возможности оборудования
- Связанные темы
Модель шейдера 6.0
Для более ранних моделей шейдеров программирование HLSL предоставляет только один поток выполнения. Предоставляются новые операции на уровне волн, начиная с модели 6.0, чтобы явно воспользоваться преимуществами параллелизма текущих gpu. Многие потоки могут выполняться в режиме блокировки на одном ядре одновременно. Например, встроенные функции модели 6.0 позволяют устранить барьерные конструкции, когда область синхронизации находится в пределах ширины процессора SIMD или другого набора потоков, которые, как известно, являются атомарными относительно друг друга.
Возможные варианты использования: сжатие потока, сокращение, транспонирование блоков, битоничная сортировка или быстрые преобразования Фурье (FFT), группирование, дедупликация потоков и аналогичные сценарии.
Большинство встроенных функций отображаются в пиксельных шейдерах и вычислительных шейдерах, хотя существуют некоторые исключения (отмечены для каждой функции). Функции были добавлены в требования к уровню компонентов DirectX 12.0 в разделе API уровня 12.
Параметр <type> и возвращаемое значение для этих функций подразумевает тип выражения. Поддерживаемые типы — это типы из следующего списка, которые также присутствуют в модели целевого шейдера для вашего приложения:
- половина, половина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 полностью до реализации. |
Wave | Набор полос (потоков), выполняемых одновременно в процессоре. Чтобы гарантировать их параллельное выполнение, явные барьеры не требуются. К аналогичным понятиям относятся "warp" и "wavefront". |
Неактивный переулок | Полоса, которая не выполняется, например из-за потока управления, или недостаточной работы для заполнения минимального размера волны. |
Активный переулок | Полоса, для которой выполняется выполнение. В пиксельных шейдерах он может включать любые вспомогательные полосы пикселей. |
Quad | Набор из 4 смежных полос, соответствующих пикселям, расположенным в квадрате 2x2. Они используются для оценки градиентов путем разности в x или y. Волна может состоять из нескольких квадроциклов. Все пиксели в активном четырехугольнике выполняются (и могут быть "Активными полосами"), но те, которые не дают видимых результатов, называются вспомогательными полосами. |
Вспомогательный лейн | Полоса, которая выполняется исключительно с целью градиентов в четырехугольниках пиксельного шейдера. Выходные данные такой полосы будут удалены и поэтому не будут отображаться на целевой поверхности. |
Встроенные функции языка заливки
Все операции этой модели шейдера были добавлены в ряд встроенных функций.
Волновой запрос
Встроенные функции для запроса одной волны.
Intrinsic | Описание | Построитель текстуры | Вычислительный шейдер |
---|---|---|---|
WaveGetLaneCount | Возвращает количество полос в текущей волне. | * | * |
WaveGetLaneIndex | Возвращает индекс текущей полосы в пределах текущей волны. | * | * |
WaveIsFirstLane | Возвращает значение true только для активной полосы в текущей волне с наименьшим индексом. | * | * |
Волновое голосование
Этот набор встроенных функций сравнивает значения между потоками, которые в настоящее время активны из текущей волны.
Intrinsic | Описание | Построитель текстуры | Вычислительный шейдер |
---|---|---|---|
WaveActiveAnyTrue | Возвращает значение true, если выражение имеет значение true в любой активной полосе текущей волны. | * | * |
WaveActiveAllTrue | Возвращает значение true, если выражение имеет значение true во всех активных полосах текущей волны. | * | * |
WaveActiveBallot | Возвращает 64-разрядную целочисленную битовую маску без знака для вычисления логического выражения для всех активных полос в указанной волне. | * | * |
Волновая трансляция
Эти встроенные функции позволяют всем активным полосам в текущей волне получать значение из указанной полосы, эффективно транслируя его. Значение, возвращаемое недопустимой полосой, не определено.
Intrinsic | Описание | Построитель текстуры | Вычислительный шейдер |
---|---|---|---|
WaveReadLaneAt | Возвращает значение выражения для заданного индекса полосы в пределах указанной волны. | * | * |
WaveReadLaneFirst | Возвращает значение выражения для активной полосы текущей волны с наименьшим индексом. | * | * |
Сокращение волн
Эти встроенные функции вычисляют указанную операцию по всем активным полосам в волне и передают конечный результат всем активным полосам. Таким образом, окончательные выходные данные гарантированно однородны по всей волне.
Intrinsic | Описание | Построитель текстуры | Вычислительный шейдер |
---|---|---|---|
WaveActiveAllEqual | Возвращает значение true, если выражение одинаково для каждой активной полосы в текущей волне (и, таким образом, равномерно по ней). | * | * |
WaveActiveBitAnd | Возвращает побитовое значение AND всех значений выражения по всем активным полосам в текущей волне и реплицирует результат во все полосы в волне. | * | * |
WaveActiveBitOr | Возвращает побитовое ЗНАЧЕНИЕ ИЛИ всех значений выражения во всех активных полосах текущей волны и реплицирует результат во все полосы в волне. | * | * |
WaveActiveBitXor | Возвращает побитовое исключающее ИЛИ всех значений выражения во всех активных полосах текущей волны и реплицирует результат во все полосы в волне. | * | * |
WaveActiveCountBits | Подсчитывает количество логических переменных, которые оцениваются как истинные по всем активным полосам в текущей волне, и реплицирует результат на все полосы в волне. | * | * |
WaveActiveMax | Вычисляет максимальное значение выражения для всех активных полос в текущей волне и реплицирует результат на все полосы в волне. | * | * |
WaveActiveMin | Вычисляет минимальное значение выражения для всех активных полос в текущей волне и реплицирует результат на все полосы в волне. | * | * |
WaveActiveProduct | Умножает значения выражения по всем активным полосам в текущей волне и реплицирует результат на все полосы в волне. | * | * |
WaveActiveSum | Суммирует значение выражения по всем активным полосам в текущей волне и реплицирует его на все полосы в текущей волне и реплицирует результат на все полосы в волне. | * | * |
Сканирование волн и префикс
Эти встроенные функции применяют операцию к каждой полосе и оставляют каждый частичный результат вычисления в соответствующей полосе.
Intrinsic | Описание | Построитель текстуры | Шейдер вычислений |
---|---|---|---|
WavePrefixCountBits | Возвращает сумму всех указанных логических переменных, для всех активных полос с индексами меньше текущего. | * | * |
WavePrefixSum | Возвращает сумму всех значений в активных полосах с меньшими индексами, чем этот. | * | * |
WavePrefixProduct | Возвращает произведение всех значений в полосах до указанной волны. | * | * |
Операции с четырехугольным перемешиком
Эти встроенные функции выполняют операции переключения со значениями в пределах волны, которые, как известно, содержат четырехугольник пикселей, как определено здесь. Индексы пикселей в четырехугольнике определяются в порядке сканирования или чтения, где координаты в четырехугольнике:
+---------> X
| [0] [1]
| [2] [3]
v
Да
Эти подпрограммы работают либо в вычислительных шейдерах, либо в пиксельных шейдерах. В вычислительных шейдерах они работают в четырехугольниках, определенных как равномерно разделенные группы по 4 в пределах волны SIMD. В пиксельных шейдерах они должны использоваться для волн, захваченных WaveQuadLanes, в противном случае результаты не определены.
Intrinsic | Описание | Построитель текстуры | Шейдер вычислений |
---|---|---|---|
QuadReadLaneAt | Возвращает указанное исходное значение, считанное из полосы текущего четырехугольника, определяемого quadLaneID [0..3], который должен быть однородным для четырехугольника. | * | |
QuadReadAcrossDiagonal | Возвращает указанное локальное значение, которое считывается из диагонали противоположной полосы в этом четырехугольнике. | * | |
QuadReadAcrossX | Возвращает указанное исходное значение, считанное из другой полосы в этом четырехугольнике в направлении X. | * | |
QuadReadAcrossY | Возвращает указанное исходное значение, считанное из другой полосы в этом четырехугольнике в направлении Y. | * |
Возможности оборудования
Чтобы проверка, что функции волновых операций доступны на любом конкретном оборудовании, вызовите ID3D12Device::CheckFeatureSupport, отметив описание и использование структуры D3D12_FEATURE_DATA_D3D12_OPTIONS1.