sync (sm5 - asm)

线程组同步或内存屏障。

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

 

备注

同步 具有_uglobal、_ugroup、_g和_t选项。

在像素着色器中,仅允许 sync_uglobal

在计算着色器中,必须指定 (_uglobal 或 _ugroup*) 和/或 _g。 此外,_t是可选的。

_uglobal

全局 u# (UAV) 内存围栏。

在此线程访问任何后续 u# 内存之前,此线程按程序顺序读取/写入的所有 u# 内存都会对整个 GPU 上的所有线程可见。 在一种情况下,定义的整个 GPU 部分将替换为小于全局的范围,如下所述。

这适用于在当前着色器阶段绑定的所有 UAV 内存。

计算着色器或像素着色器中提供了_uglobal。

对于着色器尚未声明为“全局一致”的任何绑定 UAV,_uglobal u# 内存围栏仅在该 UAV 的当前计算着色器线程组中具有可见性,就像它是_ugroup而不是_uglobal一样。 此问题仅适用于计算着色器,因为像素着色器必须将所有 UAV 声明为全局一致。

_ugroup

线程组范围 u# (UAV) 内存围栏。

在此线程访问任何后续 u# 内存之前,此线程按程序顺序读取或写入的所有 u# 内存都会对线程组中的所有线程可见。

这适用于在当前着色器阶段绑定的所有 UAV 内存。

_ugroup仅在计算着色器中可用。

如果公开了_ugroup,则对于某些实现。 指定_ugroup而不是_uglobal的优点是 同步 操作可以更快地完成。

其他实现不区分_ugroup和_uglobal,因此这两个操作是等效的,并且行为类似于_uglobal。 应用程序可以通过请求所需的最窄 同步 范围来指定其意图。

即使特定 UAV 声明为全局一致,如果不需要全局屏障,_ugroup 同步 操作也会在该 UAV 上更有效地运行。

_g

g# (线程组共享内存) 围栏。

在此线程访问任何后续 g# 内存之前,此线程按程序顺序读取或写入的所有 g# 内存都会对线程组中的所有线程可见。

这适用于当前线程组的所有 g# 共享内存。

_g仅在计算着色器中可用。

_t

线程组同步。单个线程组中的所有线程 (可以共享对一组共享寄存器空间) 的访问权限的所有线程都将执行到达到此指令的点,然后任何线程才能继续。

_t不能放置在动态流控制中, (分支,这些分支在线程组) 中可能有所不同,但可以存在于统一流控制中,其中组中的所有线程都选取相同的路径。

_t仅在计算着色器中可用。

下面是计算着色器“sync”变体的列表。

  • 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帮助程序像素 (,它仅支持) 或丢弃的像素的导数,可能会也可能不会有任何影响。 如果放弃操作是在放弃之后发出写入,则不允许帮助程序或丢弃的像素写入 UAV。 不允许从 UAV 返回的值参与派生计算。 因此,对于帮助器像素,还是当在放弃后发出时,是否遵循sync_u是没有意义的。

cs_4_0和cs_4_1支持此指令。

此指令适用于以下着色器阶段:

顶点 外壳 Geometry 像素 计算
x x

 

由于 UAV 在 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)