본문으로 바로가기

[DX12] 4.2 CPU와 GPU의 상호작용

category Computer Science/DirectX 2024. 4. 21. 16:15

4.2 CPU와 GPU의 상호작용

  • CPU와 GPU는 병렬로 동작하기 때문에 최대한의 성능을 내기 위해서는 동기화를 최소화할 방법이 필요

4.2.1 명령 대기열과 명령 목록

  • CPU는 그리기 명령들이 담긴 명령 목록(command list)을 Direct3D API를 통해서 GPU의 명령 대기열(command queue)에 제출
  • GPU는 명령 대기열에서 명령들을 뽑아서 실행.

  • GPU와 CPU 간에 병목이 발생하는 경우
    • 명령 대기열이 꽉 찬 경우: GPU는 돌지만 CPU가 대기하게 됨.
    • 명령 대기열이 빈 경우: CPU는 돌지만 GPU는 대기하게 됨.
  • 고성능 응용 프로그램의 목표는 GPU와 CPU가 대기 없이 성능을 최대로 발휘하도록 하는 것

4.2.2 CPU/GPU 동기화

CPU와 GPU는 병렬로 동작하기 때문에 동기화 이슈가 발생할 수 있음. CPU가 명령 대기열에 추가한 명령의 리소스를 GPU가 읽기 전에 CPU에서 변경하는 경우 GPU는 변경된 리소스를 사용. 이런 문제의 해결책으로 울타리(Fence) 객체 ID3D12Device::CreateFence사용해서 GPU가 명령 대기열을 비울 때까지 CPU가 기다리는 동기화 기법을 사용할 수 있다.

4.2.3 자원 상태 전이

  • 자원 위험 상황(resource hazard)를 막기 위해서 자원은 현재 상태를 가질 수 있다.
  • 자원 위험 상황이란 자원에 자료가 다 기록되지 않았는데 자료를 읽으려는 상황.
  • 리소스는 기본 상태로 시작해서 렌더 대상 상태, 셰이더 자원 상태 등으로 전이 가능.
  • 자원의 상태 전이는 응용 프로그램이 Direct3D에 알려야 함.

4.2.4 명령 목록을 이용한 다중 스레드 활용

  • 물체가 많은 장면을 하나의 명령 목록으로 그리려 한다면 명령 목록을 구축하는 데 많은 CPU 시간이 소요됨.
  • 물체가 많은 장면은 여러 개의 명령 목록으로 병렬로 구축하면 시간을 줄일 수 있음.
  • 다중 스레드로 명령 목록 구축시 규칙
    • 각 스레드는 각자의 명령 목록과 명령 할당자를 가진다.
    • 명령 대기열은 모든 스레드가 공유한다.
    • 성능상의 이유로 응용 프로그램은 동시에 기록할 수 있는 명령 목록들의 최대 개수를 초기화 시점에 설정한다.

 

 


출처:

한빛미디어 출판 <DirectX 12를 이용한 3D 게임 프로그래밍 입문>