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) | 否 |
相关主题