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) | нет |
Связанные темы