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 部分全体は、次に説明する 1 つのケースでグローバル未満のスコープに置き換えられます。
これは、現在のシェーダー ステージでバインドされているすべての UAV メモリに適用されます。
_uglobalは、コンピューティング シェーダーまたはピクセル シェーダーで使用できます。
シェーダーによってグローバルコヒーレントとして宣言されていないバインドされた UAV の場合、_uglobal u# メモリ フェンスは、_uglobalではなく_ugroupされているかのように、その UAV の現在のコンピューティング シェーダー スレッド グループ内でのみ可視性を持っています。 ピクセル シェーダーはすべての UAV をグローバルコヒーレントとして宣言する必要があるため、この問題はコンピューティング シェーダーにのみ適用されます。
_ugroup
スレッド グループ スコープ u# (UAV) メモリ フェンス。
プログラムの順序でこのスレッドによる以前の u# メモリの読み取りまたは書き込みはすべて、後続の u# メモリがこのスレッドからアクセスする前に、スレッド グループ内のすべてのスレッドに表示されます。
これは、現在のシェーダー ステージでバインドされているすべての UAV メモリに適用されます。
_ugroupは、コンピューティング シェーダーでのみ使用できます。
_ugroupが公開されている場合は、一部の実装について。 _uglobalの代わりに_ugroupを指定する利点は、 同期 操作をより迅速に完了できることです。
他の実装では_ugroupが_uglobalと区別されないため、両方の操作は同等であり、_uglobalのように動作します。 アプリケーションは、必要な 同期 の最も狭いスコープを要求することで、意図を指定できます。
特定の UAV がグローバルコヒーレントとして宣言されている場合でも、グローバル バリアが不要な場合、_ugroup 同期 操作はその UAV でより効率的に機能します。
_g
g# (スレッド グループ共有メモリ) フェンス。
プログラムの順序でこのスレッドによる以前の g# メモリの読み取りまたは書き込みはすべて、後続の g# メモリがこのスレッドからアクセスする前に、スレッド グループ内のすべてのスレッドに対して表示されます。
これは、現在のスレッド グループのすべての g# 共有メモリに適用されます。
_gは、コンピューティング シェーダーでのみ使用できます。
_t
スレッド グループの同期。1 つのスレッド グループ内のすべてのスレッド (共有レジスタ領域の共通セットへのアクセスを共有できるスレッド) は、スレッドを続行する前に、この命令に到達するまで実行されます。
_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を持つバリアントは、前述の「_ugroup」セクションの前述の説明に従って、HLSL コンパイラの対象にすることはできません。
ピクセル シェーダー同期バリアントの一覧には、sync_uglobalのみが含まれます。
メモリ フェンスは、影響を受ける命令が、フェンス全体でコンパイラまたはハードウェアによって並べ替えられるのを防ぎます。
メモリ バリアまたはアドレスへの書き込みによって分離されていないシェーダー呼び出しによって、同じアドレスから複数の読み取りを折りたたむことができます。 書き込みの場合も同様です。 バリアで区切られたアクセスは、バリアをマージしたり、バリアを越えて移動したりすることはできません。
異なるスレッドによって特定のアドレスに対するアトミック操作が正しく機能するためには、メモリ フェンスは必要ありません。 フェンスは、アトミック操作や読み込み/ストア操作が他のスレッドの観点から個々のスレッドに表示されるため、相互に同期する必要がある場合に必要です。
ピクセル シェーダーでは、 破棄 命令はsync_uglobalフェンスを意味します。その命令は 破棄全体で並べ替えることはできません。 ヘルパー ピクセル内のsync_uglobal (派生物をサポートするためにのみ実行されます) または破棄されたピクセルは、影響を与える場合と影響を受ける可能性があります。 破棄の場合、破棄後に書き込みが発行された場合、ヘルパーまたは破棄されたピクセルが UAV に書き込むことはできません。 UAV から返される値は、派生計算に寄与できません。 したがって、ヘルパー ピクセルに対してsync_uが適用されるか、破棄後に発行されるかは moot です。
cs_4_0とcs_4_1はこの命令をサポートします。
この命令は、次のシェーダー ステージに適用されます。
Vertex | Hull | Domain | ジオメトリ | ピクセル | Compute |
---|---|---|---|---|---|
X | X |
UAV は Direct3D 11.1 のすべてのシェーダー ステージで使用できるため、この命令のsync_uglobalバリアントは、Windows 8以降で使用できる Direct3D 11.1 ランタイムのすべてのシェーダー ステージに適用されます。
Vertex | Hull | Domain | ジオメトリ | ピクセル | Compute |
---|---|---|---|---|---|
X | X | X | X | X | X |
最小シェーダー モデル
この命令は、次のシェーダー モデルでサポートされています。
シェーダー モデル | サポートされています |
---|---|
シェーダー モデル 5 | はい |
シェーダー モデル 4.1 | no |
シェーダー モデル 4 | no |
シェーダー モデル 3 (DirectX HLSL) | no |
シェーダー モデル 2 (DirectX HLSL) | no |
シェーダー モデル 1 (DirectX HLSL) | no |
関連トピック