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


HLSL Shader Model 6.0

Описание встроенных функций волновой операции, добавленных в модель шейдера HLSL 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.