하위 하드웨어의 컴퓨팅 셰이더

Direct3D 11은 대부분의 Direct3D 10.x 하드웨어에서 작동하는 컴퓨팅 셰이더 를 사용하는 기능을 제공하며 작업에는 몇 가지 제한 사항이 있습니다. 컴퓨팅 셰이더 기술을 DirectCompute 기술이라고도 합니다. 이 항목에서는 Direct3D 10 하드웨어의 Direct3D 11 앱에서 컴퓨팅 셰이더 를 사용하는 방법에 대해 설명합니다.

하위 하드웨어에서 컴퓨팅 셰이더를 지원하는 것은 Direct3D 10.x와 호환되는 디바이스에만 해당됩니다. Direct3D 9.x 하드웨어에서는 컴퓨팅 셰이더를 사용할 수 없습니다.

Direct3D 10.x 하드웨어가 컴퓨팅 셰이더를 지원하는지 검사 ID3D11Device::CheckFeatureSupport를 호출합니다. CheckFeatureSupport 호출에서 D3D11_FEATURE_D3D10_X_HARDWARE_OPTIONS 값을 Feature 매개 변수에 전달하고, D3D11_FEATURE_DATA_D3D10_X_HARDWARE_OPTIONS 구조체에 대한 포인터를 pFeatureSupportData 매개 변수에 전달하고, D3D11_FEATURE_DATA_D3D10_X_HARDWARE_OPTIONS 구조체의 크기를 FeatureSupportDataSize 매개 변수에 전달합니다. Direct3D 10.x 하드웨어가 컴퓨팅 셰이더를 지원하는 경우 CheckFeatureSupportD3D11_FEATURE_DATA_D3D10_X_HARDWARE_OPTIONS ComputeShaders_Plus_RawAndStructuredBuffers_Via_Shader_4_x멤버에서TRUE를 반환합니다.

10Level9 참조 섹션에는 다양한 ID3D11DeviceID3D11DeviceContext 메서드가 다양한 10Level9 기능 수준에서 작동하는 방식의 차이점이 나열되어 있습니다.

UAV(순서가 지정되지 않은 액세스 뷰)

원시(RWByteAddressBuffer) 및 Structured(RWStructuredBuffer) 순서가 지정되지 않은 액세스 뷰는 하위 하드웨어에서 지원되며 다음과 같은 제한 사항이 있습니다.

  • ID3D11DeviceContext::CSSetUnorderedAccessViews를 통해 한 번에 하나의 UAV만 파이프라인에 바인딩될 수 있습니다.
  • 원시 UAV의 기본 오프셋은 Direct3D 11 하드웨어에 필요한 16바이트 맞춤 대신 256바이트 경계에 맞춰야 합니다.

형식화된 UAV는 하위 하드웨어에서 지원되지 않습니다. 여기에는 Texture1D, Texture2DTexture3D UAV가 포함됩니다.

하위 하드웨어의 픽셀 셰이더는 순서가 지정되지 않은 액세스를 지원하지 않습니다.

셰이더 리소스 뷰(SRV)

셰이더 리소스 뷰로서의 원시 및 구조적 버퍼는 Direct3D 11 하드웨어에 있는 것처럼 읽기 전용 액세스를 위해 하위 하드웨어에서 지원됩니다. 이러한 리소스 유형은 꼭짓점 셰이더, 기하 도형 셰이더, 픽셀 셰이더 및 컴퓨팅 셰이더에 대해 지원됩니다.

스레드 그룹

컴퓨팅 셰이더는 스레드 그룹 내에서 여러 스레드에서 병렬로 실행할 수 있습니다.

스레드 그룹은 다음과 같은 제한 사항과 함께 하위 하드웨어에서 지원됩니다.

스레드 그룹 차원

하위 하드웨어에 대해 정의된 스레드 그룹은 X 및 Y 차원 768로 제한됩니다. Direct3D 11 하드웨어의 최대값인 1024보다 작습니다. 최대 Z 차원 64는 변경되지 않습니다.

그룹의 총 스레드 수(X × Y × Z)는 768개로 제한됩니다. 이는 Direct3D 11 하드웨어의 경우 1024의 제한보다 작습니다.

이러한 숫자를 초과하면 셰이더 컴파일이 실패합니다.

Two-Dimensional 스레드 인덱스

스레드 그룹 내의 특정 스레드는 (x,y,z)에 의해 지정된 3D 벡터를 사용하여 인덱싱됩니다.

하위 하드웨어에서 작동하는 컴퓨팅 셰이더의 경우 스레드 그룹은 두 차원만 지원합니다. 즉, 3D 벡터의 Z 값은 항상 1이어야 합니다.

이 제한은 특히 다음 사항에 적용됩니다.

스레드 그룹 공유 메모리(TGSM)

스레드 그룹 공유 메모리는 하위 하드웨어에서 16Kb로 제한됩니다. 이는 Direct3D 11 하드웨어에서 사용할 수 있는 32Kb보다 작습니다.

컴퓨팅 셰이더 스레드는 자체 TGSM 지역에만 쓸 수 있습니다. 이 쓰기 전용 지역은 최대 크기가 256바이트 이하이며 그룹에 대해 선언된 스레드 수가 증가함에 따라 최대 크기가 감소합니다.

다음 표에서는 그룹의 스레드 수에 대한 TGSM 영역의 스레드당 최대 크기를 정의합니다.

그룹의 스레드 수 스레드당 최대 TGSM 크기
0-64 256
65-68 240
69-72 224
73-76 208
77-84 192
85-92 176
93-100 160
101-112 144
113-128 128
129-144 112
145-168 96
169-204 80
205-256 64
257-340 48
341-512 32
513-768 16

 

컴퓨팅 셰이더 스레드는 모든 위치에서 TGSM을 읽을 수 있습니다.

D3DCompile with D3DCOMPILE_SKIP_OPTIMIZATION

D3DCompileD3DCOMPILE_SKIP_OPTIMIZATION 컴파일 옵션과 함께 cs_4_0 셰이더 대상으로 전달할 때 E_NOTIMPL 반환합니다. cs_5_0 셰이더 대상은 D3DCOMPILE_SKIP_OPTIMIZATION 작동합니다.

하위 하드웨어의 Direct3D 11