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


sync (sm5 - asm)

Синхронизация группы потоков или барьер памяти.

sync[_uglobal|_ugroup][_g][_t]

 

Комментарии

Синхронизация имеет параметры _uglobal, _ugroup, _g и _t.

В пиксельном шейдере разрешены только sync_uglobal .

В вычислительном шейдере необходимо указать (_uglobal или _ugroup*) и (или) _g. _t дополнительно является необязательным.

_uglobal

Глобальный забор памяти u# (UAV).

Все предыдущие операции чтения и записи в памяти u# в этом потоке в программном порядке становятся видимыми для всех потоков на всем GPU до того, как этот поток обращается к памяти u#. Вся часть ОПРЕДЕЛЕНИЯ GPU заменяется менее чем глобальной область в одном случае, описанном ниже.

Это относится ко всей памяти UAV, привязанной на текущем этапе шейдера.

_uglobal доступно в вычислительном шейдере или пиксельном шейдере.

Для всех связанных БПЛА, которые не были объявлены шейдером как глобально когерентные, _uglobal забор памяти u# имеет видимость только в текущей группе потоков шейдера вычислений для этого БПЛА, как если бы он _ugroup, а не _uglobal. Эта проблема относится только к вычислительному шейдеру, так как пиксельный шейдер должен объявлять все БПЛА как глобально согласованные.

_ugroup

Группа потоков область забор памяти u# (UAV).

Все предыдущие операции чтения или записи памяти u# этим потоком в программном порядке становятся видимыми для всех потоков в группе потоков до того, как этот поток обращается к памяти U#.

Это относится ко всей памяти UAV, привязанной на текущем этапе шейдера.

_ugroup доступно только в вычислительном шейдере.

Если _ugroup предоставляется, для некоторых реализаций. Преимущество указания _ugroup вместо _uglobal заключается в том, что операция синхронизации может быть выполнена быстрее.

Другие реализации не отличают _ugroup от _uglobal, поэтому обе операции эквивалентны и ведут себя так же, как _uglobal. Приложения могут указывать свое намерение, запрашивая самую узкую область синхронизации.

Даже если конкретный БПЛА объявлен как глобально согласованный, операция синхронизации _ugroup будет работать более эффективно на этом БПЛА, если глобальный барьер не требуется.

_g

g# (общая память группы потоков).

Все предыдущие операции чтения или записи памяти g# этим потоком в программном порядке становятся видимыми для всех потоков в группе потоков до того, как этот поток обращается к памяти g#.

Это относится ко всей общей памяти g# текущей группы потоков.

_g доступно только в вычислительном шейдере.

_t

Синхронизация групп потоков. Все потоки в одной группе потоков (те, которые могут совместно использовать доступ к общему набору общего пространства регистров) будут выполняться до момента, когда они достигнут этой инструкции, прежде чем любой поток сможет продолжить работу.

_t не может размещаться в динамическом управлении потоком (ветви, которые могут различаться в пределах группы потоков), но могут присутствовать в едином элементе управления потоком, где все потоки в группе выбирают один и тот же путь.

_t доступно только в вычислительном шейдере.

Ниже приведен список вариантов синхронизации шейдера вычислений.

  • sync_g
  • sync_ugroup*
  • sync_uglobal
  • sync_g_t
  • sync_ugroup_t*
  • sync_uglobal_t
  • sync_ugroup_g*
  • sync_uglobal_g
  • sync_ugroup_g_t*
  • sync_uglobal_g_t

*Варианты с _ugroup могут не быть целевыми для компилятора HLSL согласно предыдущему обсуждению в разделе _ugroup выше.

Список вариантов синхронизации шейдера пикселей включает только sync_uglobal.

Ограничения памяти предотвращают изменение порядка затронутых инструкций компиляторами или оборудованием через границу.

Несколько операций чтения с одного адреса вызовом шейдера, которые не разделены барьерами памяти или записью в адрес, могут быть свернуты вместе. Это относится и к операциям записи. Доступы, разделенные барьером, не могут быть объединены или перемещены через барьер.

Границы памяти не нужны для правильной работы атомарных операций с заданным адресом различными потоками. Ограждения необходимы, когда атомарные операции и (или) операции загрузки и хранения должны быть синхронизированы относительно друг друга, так как они появляются в отдельных потоках с точки зрения других потоков.

В пиксельном шейдере инструкции по отмене подразумевают sync_uglobal ограждение, в этом случае инструкции не могут быть переупорядочены между отбрасываемыми. sync_uglobal во вспомогательных пикселях (которые выполняются только для поддержки производных) или отброшенные пиксели могут иметь или не иметь никакого влияния. Вспомогательным или отброшенным пикселям запрещено записывать данные в БПЛА, если в случае отмены операции записи выдаются после сброса. Возвращаемые значения из БПЛА не могут участвовать в производных вычислениях. Таким образом, учитывается ли sync_u для вспомогательных пикселей или при выдаче после сброса является спорным.

cs_4_0 и cs_4_1 поддерживают эту инструкцию.

Эта инструкция применяется к следующим этапам шейдера:

Вершина Корпуса Домен Geometry Пиксель Вычисления
X X

 

Так как БПЛА доступны на всех этапах шейдера для Direct3D 11.1, sync_uglobal вариант этой инструкции применяется ко всем этапам шейдера для среды выполнения Direct3D 11.1, которая доступна начиная с Windows 8.

Вершина Корпуса Домен Geometry Пиксель Вычисления
X X X X X X

 

Минимальная модель шейдера

Эта инструкция поддерживается в следующих моделях шейдеров:

Модель шейдера Поддерживается
Модель шейдера 5 да
Модель шейдера 4.1 нет
Модель шейдера 4 нет
Модель шейдера 3 (DirectX HLSL) нет
Модель шейдера 2 (DirectX HLSL) нет
Модель шейдера 1 (DirectX HLSL) нет

 

Сборка модели шейдера 5 (DirectX HLSL)