다음을 통해 공유


동기화(sm5 - asm)

스레드 그룹 동기화 또는 메모리 장벽.

동기화[_uglobal|_ugroup][_g][_t]

 

설명

동기화에는 _uglobal, _ugroup, _g 및 _t 옵션이 있습니다.

픽셀 셰이더에서는 sync_uglobal만 허용됩니다.

컴퓨팅 셰이더에서 (_uglobal 또는 _ugroup*) 및/또는 _g를 지정해야 합니다. _t는 선택 사항입니다.

_uglobal

Global u#(UAV) 메모리 펜스입니다.

이 스레드에 의해 프로그램 순서로 이루어진 모든 이전 u# 메모리 읽기/쓰기는 이 스레드에 의한 모든 후속 u# 메모리 액세스 전에 전체 GPU의 모든 스레드에 가시적이 됩니다. 아래 설명된 한 가지 사례에서 정의의 전체 GPU 부분은 전역보다 작은 범위로 대체됩니다.

이는 현재 셰이더 단계에서 바인딩된 모든 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

스레드 그룹 동기화입니다. 단일 스레드 그룹 내의 모든 스레드(공유 레지스터 공간의 공통 집합에 대한 액세스를 공유할 수 있는 스레드)는 스레드를 계속하기 전에 이 명령에 도달하는 지점까지 실행됩니다.

_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가 도우미 픽셀에 적용되는지 또는 삭제 후 발급될 때 적용되는지 여부는 무시됩니다.

cs_4_0 및 cs_4_1이 이 명령을 지원합니다.

이 명령은 다음 셰이더 단계에 적용됩니다.

꼭짓점 Hull 도메인 기하 도형 픽셀 컴퓨팅
X X

 

UAV는 Direct3D 11.1의 모든 셰이더 단계에서 사용할 수 있으므로 이 명령의 sync_uglobal 변형은 Windows 8부터 사용할 수 있는 Direct3D 11.1 런타임의 모든 셰이더 단계에 적용됩니다.

꼭짓점 Hull 도메인 기하 도형 픽셀 컴퓨팅
X X X X X X

 

최소 셰이더 모델

이 명령은 다음 셰이더 모델에서 지원됩니다.

셰이더 모델 지원 여부
셰이더 모델 5
셰이더 모델 4.1 아니요
셰이더 모델 4 아니요
셰이더 모델 3(DirectX HLSL) 아니요
셰이더 모델 2(DirectX HLSL) 아니요
셰이더 모델 1(DirectX HLSL) 아니요

 

셰이더 모델 5 어셈블리(DirectX HLSL)