다음을 통해 공유


HLSL 셰이더 모델 6.0

HLSL 셰이더 모델 6.0에 추가된 웨이브 작업 내장 함수에 대해 설명합니다.

셰이더 모델 6.0

이전 셰이더 모델의 경우 HLSL 프로그래밍은 단일 실행 스레드만 노출합니다. 현재 GPU의 병렬 처리를 명시적으로 활용하기 위해 모델 6.0부터 새로운 웨이브 수준 작업이 제공됩니다. 많은 스레드가 동일한 코어의 잠금 단계에서 동시에 실행될 수 있습니다. 예를 들어 모델 6.0 내장 함수를 사용하면 동기화 범위가 SIMD 프로세서의 너비 내에 있거나 서로 상대적으로 원자성으로 알려진 다른 스레드 집합 내에 있는 경우 장벽 구문을 제거합니다.

잠재적인 사용 사례로는 스트림 압축, 감소, 블록 트랜스포즈, 비트닉 정렬 또는 FFT(Fast Fourier Transforms), 범주화, 스트림 중복 제거 및 유사한 시나리오가 있습니다.

일부 예외(각 함수에 대해 언급됨)가 있지만 대부분의 내장 함수는 픽셀 셰이더 및 컴퓨팅 셰이더에 표시됩니다. 함수는 API 수준 12에서 DirectX 기능 수준 12.0에 대한 요구 사항에 추가되었습니다.

이러한 함수의 <형식> 매개 변수 및 반환 값은 식의 형식을 의미하며, 지원되는 형식은 앱의 대상 셰이더 모델에도 다음 목록의 형식입니다.

  • half, half2, half3, half4
  • float, float2, float3, float4
  • double, double2, double3, double4
  • int, int2, int3, int4
  • uint, uint2, uint3, uint4
  • short, short2, short3, short4
  • ushort, ushort2, ushort3, ushort4
  • uint64_t, uint64_t2, uint64_t3, uint64_t4

일부 연산(예: 비트 연산자)은 정수 형식만 지원합니다.

용어

용어 정의
차선 단일 실행 스레드입니다. 버전 6.0 이전의 셰이더 모델은 언어 수준에서 이러한 모델 중 하나만 노출하므로 완전히 구현까지 병렬 SIMD 처리로 확장됩니다.
물결 프로세서에서 동시에 실행되는 레인(스레드) 집합입니다. 병렬로 실행되도록 보장하기 위해 명시적 장벽이 필요하지 않습니다. 비슷한 개념으로는 "워프"와 "웨이브프론트"가 있습니다.
비활성 레인 예를 들어 제어 흐름으로 인해 실행되지 않는 레인이거나 웨이브의 최소 크기를 채우기 위한 작업이 부족합니다.
활성 레인 실행이 수행되는 레인입니다. 픽셀 셰이더에는 도우미 픽셀 레인이 포함될 수 있습니다.
쿼드 2x2 정사각형에 정렬된 픽셀에 해당하는 4개의 인접 레인 집합입니다. x 또는 y의 차이점을 사용하여 그라데이션을 추정하는 데 사용됩니다. 웨이브는 여러 쿼드로 구성될 수 있습니다. 활성 쿼드의 모든 픽셀은 실행되지만("활성 레인"일 수 있음) 눈에 보이는 결과를 생성하지 않는 픽셀을 "도우미 레인"으로 지정합니다.
도우미 레인 픽셀 셰이더 쿼드의 그라데이션을 목적으로만 실행되는 레인입니다. 이러한 레인의 출력은 삭제되므로 대상 화면에 렌더링되지 않습니다.

음영 언어 내장 함수

이 셰이더 모델의 모든 작업이 다양한 내장 함수에 추가되었습니다.

웨이브 쿼리

단일 웨이브를 쿼리하기 위한 내장 함수입니다.

내장 설명 픽셀 셰이더 컴퓨팅 셰이더
WaveGetLaneCount 현재 웨이브의 레인 수를 반환합니다. * *
WaveGetLaneIndex 현재 웨이브 내에서 현재 레인의 인덱스 값을 반환합니다. * *
WaveIsFirstLane 인덱스가 가장 작은 현재 웨이브의 활성 레인에 대해서만 true를 반환합니다. * *

웨이브 투표

이 내장 함수 집합은 현재 웨이브에서 현재 활성 상태인 스레드의 값을 비교합니다.

내장 설명 픽셀 셰이더 컴퓨팅 셰이더
WaveActiveAnyTrue 현재 웨이브의 활성 레인에서 식이 true이면 true를 반환합니다. * *
WaveActiveAllTrue 현재 웨이브의 모든 활성 레인에서 식이 true이면 true를 반환합니다. * *
WaveActiveBallot 지정된 웨이브의 모든 활성 레인에 대한 부울 식 계산의 부호 없는 64비트 정수 비트 마스크를 반환합니다. * *

웨이브 브로드캐스트

이러한 내장 함수를 사용하면 현재 웨이브의 모든 활성 레인이 지정된 레인에서 값을 수신하여 효과적으로 브로드캐스트할 수 있습니다. 잘못된 레인의 반환 값이 정의되지 않았습니다.

내장 설명 픽셀 셰이더 컴퓨팅 셰이더
WaveReadLaneAt 지정된 웨이브 내에서 지정된 레인 인덱스의 식 값을 반환합니다. * *
WaveReadLaneFirst 인덱스가 가장 작은 현재 웨이브의 활성 레인에 대한 식 값을 반환합니다. * *

웨이브 감소

이러한 내장 함수는 웨이브의 모든 활성 레인에서 지정된 작업을 계산하고 최종 결과를 모든 활성 레인에 브로드캐스트합니다. 따라서 최종 출력은 웨이브 전체에서 균일하게 보장됩니다.

내장 설명 픽셀 셰이더 컴퓨팅 셰이더
WaveActiveAllEqual 식이 현재 웨이브의 모든 활성 레인에 대해 동일하면 true를 반환합니다(따라서 균질하게 표시됨). * *
WaveActiveBitAnd 현재 웨이브의 모든 활성 레인에서 식의 모든 값에 대한 비트 AND를 반환하고 결과를 웨이브의 모든 레인에 복제합니다. * *
WaveActiveBitOr 현재 웨이브의 모든 활성 레인에서 식의 모든 값에 대한 비트 OR을 반환하고 결과를 웨이브의 모든 레인에 복제합니다. * *
WaveActiveBitXor 현재 웨이브의 모든 활성 레인에서 식의 모든 값에 대한 배타적 비트 OR을 반환하고 결과를 웨이브의 모든 레인에 복제합니다. * *
WaveActiveCountBits 현재 웨이브의 모든 활성 레인에서 true로 평가되는 부울 변수의 수를 계산하고 결과를 웨이브의 모든 레인에 복제합니다. * *
WaveActiveMax 현재 웨이브의 모든 활성 레인에서 식의 최대값을 계산하고 결과를 웨이브의 모든 레인에 복제합니다. * *
WaveActiveMin 현재 웨이브의 모든 활성 레인에서 식의 최소값을 계산하고 결과를 웨이브의 모든 레인에 복제합니다. * *
WaveActiveProduct 식 값을 현재 웨이브의 모든 활성 레인에 곱하고 결과를 웨이브의 모든 레인에 복제합니다. * *
WaveActiveSum 현재 웨이브의 모든 활성 레인에서 식의 값을 합산하여 현재 웨이브의 모든 레인에 복제하고 결과를 웨이브의 모든 레인에 복제합니다. * *

웨이브 스캔 및 접두사

이러한 내장 함수는 각 레인에 작업을 적용하고 계산의 각 부분 결과를 해당 레인에 둡니다.

내장 설명 픽셀 셰이더 컴퓨팅 셰이더
WavePrefixCountBits 현재 레인보다 작은 인덱스를 사용하여 모든 활성 레인에서 true로 설정된 지정된 모든 부울 변수의 합계를 반환합니다. * *
WavePrefixSum 활성 레인에 있는 모든 값의 합계를 이 인덱스보다 작은 인덱스로 반환합니다. * *
WavePrefixProduct 지정된 웨이브 중 하나 이전의 레인에 있는 모든 값의 곱을 반환합니다. * *

쿼드 와이드 순서 섞기 작업

이러한 내장 함수는 여기에 정의된 대로 픽셀 셰이더 쿼드를 포함하는 것으로 알려진 웨이브의 값에 대한 교환 작업을 수행합니다. 쿼드의 픽셀 인덱스는 스캔 라인 또는 읽기 순서로 정의됩니다. 여기서 쿼드 내의 좌표는 다음과 같습니다.

+---------> X

| [0] [1]

| [2] [3]

v

Y

이러한 루틴은 컴퓨팅 셰이더 또는 픽셀 셰이더에서 작동합니다. 컴퓨팅 셰이더에서는 SIMD 웨이브 내에서 4의 균등하게 분할된 그룹으로 정의된 쿼드에서 작동합니다. 픽셀 셰이더에서는 WaveQuadLanes에서 캡처한 웨이브에 사용해야 합니다. 그렇지 않으면 결과가 정의되지 않습니다.

내장 설명 픽셀 셰이더 컴퓨팅 셰이더
QuadReadLaneAt 쿼드에서 균일해야 하는 quadLaneID [0..3]로 식별되는 현재 쿼드의 레인에서 읽은 지정된 소스 값을 반환합니다. *
QuadReadAcrossDiagonal 이 쿼드의 대각선 반대 레인에서 읽은 지정된 로컬 값을 반환합니다. *
QuadReadAcrossX X 방향으로 이 쿼드의 다른 레인에서 읽은 지정된 소스 값을 반환합니다. *
QuadReadAcrossy 이 쿼드의 다른 레인에서 읽은 지정된 원본 값을 Y 방향으로 반환합니다. *

하드웨어 기능

특정 하드웨어에서 웨이브 작업 기능을 사용할 수 있는지 확인하려면 ID3D12Device::CheckFeatureSupport호출하여 D3D12_FEATURE_DATA_D3D12_OPTIONS1 구조체의 설명과 사용을 확인합니다.