다음을 통해 공유


HLSL 셰이더 모델 6.0

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

셰이더 모델 6.0

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

잠재적 사용 사례로는 스트림 압축, 감소, 블록 전치, 바이토닉 정렬 또는 FFT(고속 푸리에 변환), 비닝(binning), 스트림 중복 제거 및 유사한 시나리오가 있습니다.

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

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

  • 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 처리를 구현까지 완전히 확장되도록 둡니다.
Wave 프로세서에서 동시에 실행되는 레인(스레드) 세트입니다. 병렬로 실행되도록 보장하기 위해 명시적 배리어가 필요하지 않습니다. 비슷한 개념으로는 "warp"와 "wavefront"가 있습니다.
비활성 레인 예를 들어 제어 흐름 또는 웨이브의 최소 크기를 채우기 위한 작업 부족으로 인해 실행되지 않는 레인입니다.
활성 레인 실행이 수행되는 레인입니다. 픽셀 셰이더에는 도우미 픽셀 레인이 포함될 수 있습니다.
쿼드 2x2 정사각형에 정렬된 픽셀에 해당하는 4개의 인접 레인 세트입니다. x 또는 y의 차이를 통해 그라데이션을 추정하는 데 사용됩니다. 웨이브는 여러 개의 쿼드로 구성될 수 있습니다. 활성 쿼드의 모든 픽셀이 실행되지만(해당 픽셀은 “활성 레인”일 수 있음) 가시적 결과를 생성하지 않는 픽셀은 “도우미 레인”입니다.
도우미 레인 픽셀 셰이더 쿼드에서 그라데이션을 위해서만 실행되는 레인입니다. 이러한 레인의 출력은 삭제되므로 대상 표면에 렌더링되지 않습니다.

셰이딩 언어 내장 함수

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

Wave Query

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

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

Wave Vote

이 내장 함수 세트는 현재 웨이브에서 현재 활성 상태인 스레드 간에 값을 비교합니다.

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

Wave Broadcast

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

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

Wave Reduction

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

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

Wave Scan 및 Prefix

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

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

쿼드 전체 순서 섞기 작업

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

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

| [0] [1]

| [2] [3]

v

Y

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

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

하드웨어 기능

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