AsyncCompute

다양한 GPU 작업을 인터리브 방식으로 끼워넣어 효율을 향상시키는 하드웨어 기능인 AsyncCompute, 비동기 계산에 대한 글입니다.

Windows
MacOS
Linux

이제 Rendering Hardware Interface (RHI)는 Xbox One에 비동기 계산 (AsyncCompute) 을 지원합니다. 미사용 GPU 리소스(컴퓨트 유닛, 레지스터, 대역폭)를 활용하기 좋은 방식으로, 렌더링과 함께 dispatch() 호출을 비동기 실행하는 것입니다. 비동기 계산은 별도의 컨텍스트를 사용하며, 컨텍스트 계산 및 렌더링 동기화를 위한 RHI 함수를 제공합니다. 비동기 계산으로 이득을 볼 수 있는 영역을 확인하는 데는 Dr PIX 가 좋습니다. 예를 들어 특정 렌더링 패스에서 CU 절반이 미사용되는 경우, 그 CU 를 비동기 계산 작업에 활용 가능할 수도 있습니다. 비동기 계산에는 몇 가지 제약이 있습니다:

  • UAV 카운터가 있는 버퍼는 지원되지 않습니다 (이는 XDK 의 한계로, D3D 경고를 생성합니다).

  • 비동기 계산 작업은 PIX GPU 캡처에 나타나지 않습니다 (타이밍 캡처에 나타나기는 합니다). PIX 는 그래픽 즉시 컨텍스트(graphics immediate context)만 캡처합니다 (플랫폼 한계입니다).

  • 자동 파이프라인 플러시는 드라이버에 제공되지 않습니다. 플러시가 필요하면 RHICSManualGpuFlush 를 명시적으로 호출해 줘야 합니다. (예: 한 디스패치가 기존 디스패치에 종속된 경우)

API

  • RHIBeginAsyncComputeJob_DrawThread (EAsyncComputePriority Priority) 렌더링 스레드에서 비동기 계산 작업을 시작합니다. 우선순위를 사용하여 (ID3D11XComputeContext::SetLimits 를 통해) 잡에 할당할 셰이더 리소스 수를 결정합니다. 사용되는 우선순위는 AsyncComputePriority_High 와 AsyncComputePriority_Default, 두 가지입니다.

  • RHIEndAsyncComputeJob_DrawThread 비동기 계산 작업을 끝냅니다. 동기화에 사용되는 32 비트 Fence Index 를 반환, 또는 계산이 꺼져있거나 활성화된 계산 작업이 없는 경우 -1 을 반환합니다.

  • RHIGraphicsWaitOnAsyncComputeJob 그래픽 즉시 컨텍스트에 명령을 삽입하여 비동기 작업 완료시까지 블록합니다. -1 을 전달하면 일찍 빠져나옵니다.

RHIBeginAsyncComputeJob_DrawThread 와 RHIEndAsyncComputeJob_DrawThread 호출 사이에 RHI 는 비동기 계산 상태가 됩니다. 이 시간 도중, 비동기 계산 컨텍스트를 통해 지원되는 RHI 명령이 실행됩니다. 지원되지 않는 함수는 어서트가 발생합니다.

활성화/비활성화

비동기 계산 기능의 활성화 내지 비활성화는 컴파일 시간에 #define USE_ASYNC_COMPUTE_CONTEXT 로 합니다. 실행시간에는 r.AsyncCompute 콘솔 변수로 가능합니다. 비동기 계산이 비활성화되면, 비동기 계산 블록 내 디스패치는 그래픽 명령 버퍼에서 동기 실행됩니다. PC 에서는 USE_ASYNC_COMPUTE_CONTEXT 가 0 으로 정의되어 있는데, D3D11.1 에서는 지원되지 않기 때문입니다.

PIX

비동기 계산 컨텍스트 작업은 GPU 캡처에 캡처되지 않으므로, 이러한 캡처는 비동기 계산 활성화시 GPU 퍼포먼스를 잘못 파악하게 될 수 있습니다. 그래픽 디버깅이 목적이라면, 위의 콘솔 변수를 사용하여 비동기 계산을 꺼야 합니다. 비동기 계산은 PIX 타이밍 캡처에 지원됩니다. 타임라인에 다음과 같이 나타납니다:

PixTimingCapture.png

감사 인사 및 향후 계획

이 기능은 라이온헤드 스튜디오가 구현한 것으로, Xbox One 렌더링 최적화를 위한 툴로서 활용하고자 하고 있습니다.

더욱 많은 API 가 하드웨어 기능을 노출함에 따라 시스템의 크로스 컴파일 대상도 늘리고자 합니다. 비동기 계산을 활용하는 기능은 (콘솔 변수 / 디파인) 없이도 다른 플랫폼에서의 실행, 편리한 디버깅 및 프로파일링을 위해 언제든 실행 가능합니다. 비동기 계산 사용시에는 주의를 기울여야 하는데, 퍼포먼스를 더욱 예측할 수 없거나 동기화에 더욱 많은 코딩 노력이 필요할 수 있기 때문입니다.

Tags
Select Skin
Light
Dark

Welcome to the new Unreal Engine 4 Documentation site!

We're working on lots of new features including a feedback system so you can tell us how we are doing. It's not quite ready for use in the wild yet, so head over to the Documentation Feedback forum to tell us about this page or call out any issues you are encountering in the meantime.

We'll be sure to let you know when the new system is up and running.

Post Feedback