사용 플래그는 애플리케이션이 리소스 데이터를 사용하여 가능한 가장 성능이 좋은 메모리 영역에 리소스를 배치하려는 방법을 나타냅니다. 리소스 데이터는 CPU 또는 GPU가 성능에 영향을 주지 않고 액세스할 수 있도록 리소스 간에 복사됩니다.
리소스가 비디오 메모리 또는 시스템 메모리에 생성되는 것으로 생각하거나 런타임에서 메모리를 관리해야 하는지 여부를 결정할 필요는 없습니다. WDDM(Windows 디스플레이 드라이버 모델)의 아키텍처를 사용하여 애플리케이션은 서로 다른 사용 플래그가 있는 Direct3D 리소스를 만들어 애플리케이션이 리소스 데이터를 사용하는 방법을 나타냅니다. 이 드라이버 모델은 리소스에서 사용하는 메모리를 가상화합니다. 예상되는 사용량을 감안할 때 가능한 가장 성능이 좋은 메모리 영역에 리소스를 배치하는 것은 운영 체제/드라이버/메모리 관리자의 책임입니다.
기본 사례는 GPU에서 리소스를 사용할 수 있도록 하는 것입니다. CPU에서 리소스 데이터를 사용할 수 있어야 하는 경우가 있습니다. 적절한 프로세서가 성능에 영향을 주지 않고 액세스할 수 있도록 리소스 데이터를 복사하려면 API 메서드의 작동 방식에 대한 지식이 필요합니다.
리소스 데이터 복사
리소스는 Direct3D에서 Create 호출을 실행할 때 메모리에 만들어집니다. 비디오 메모리, 시스템 메모리 또는 다른 종류의 메모리에서 만들 수 있습니다. WDDM 드라이버 모델은 이 메모리를 가상화하므로 애플리케이션은 더 이상 생성되는 메모리 리소스 종류를 추적할 필요가 없습니다.
GPU에서 즉시 액세스할 수 있도록 모든 리소스가 비디오 메모리에 배치되는 것이 이상적입니다. 그러나 CPU가 리소스 데이터를 읽거나 GPU가 CPU가 작성한 리소스 데이터에 액세스해야 하는 경우도 있습니다. Direct3D는 애플리케이션에 사용량 지정을 요청하여 이러한 다양한 시나리오를 처리한 다음 필요한 경우 리소스 데이터를 복사하는 몇 가지 방법을 제공합니다.
리소스를 만든 방법에 따라 항상 기본 데이터에 직접 액세스할 수 있는 것은 아닙니다. 즉, 리소스 데이터를 원본 리소스에서 적절한 프로세서에서 액세스할 수 있는 다른 리소스로 복사해야 합니다. Direct3D 측면에서 기본 리소스는 GPU에서 직접 액세스할 수 있으며, 동적 및 스테이징 리소스는 CPU에서 직접 액세스할 수 있습니다.
리소스를 만든 후에는 해당 사용량을 변경할 수 없습니다. 대신 한 리소스의 내용을 다른 사용량으로 만든 다른 리소스에 복사합니다. 한 리소스에서 다른 리소스로 리소스 데이터를 복사하거나 메모리에서 리소스로 데이터를 복사합니다.
리소스에는 매핑 가능한 것과 매핑 가능하지 않은 두 가지 주요 종류가 있습니다. 동적 또는 스테이징 사용으로 만든 리소스는 적용할 수 있지만 기본 또는 변경할 수 없는 사용으로 만든 리소스는 적용할 수 없습니다.
매핑할 수 없는 리소스 간에 데이터를 복사하는 것은 가장 일반적인 경우이며 성능이 최적화되었기 때문에 매우 빠릅니다. 이러한 리소스는 CPU에서 직접 액세스할 수 없으므로 GPU에서 신속하게 조작할 수 있도록 최적화됩니다.
성능은 리소스가 생성된 사용량에 따라 달라지므로 매핑 가능한 리소스 간에 데이터를 복사하는 것이 더 문제가 됩니다. 예를 들어 GPU는 동적 리소스를 상당히 빠르게 읽을 수 있지만 쓸 수 없으며 GPU는 준비 리소스를 직접 읽거나 쓸 수 없습니다.
기본 사용량이 있는 리소스에서 스테이징 사용량이 있는 리소스로 데이터를 복사하려는 애플리케이션은 주의해야 합니다. 이는 CPU가 데이터를 읽을 수 있도록 하려는 것인데, 이러한 경우에는 GPU에서 데이터를 다시 읽어오는 문제가 있을 수 있습니다. 아래의 , 리소스 데이터액세스 참조하세요.
리소스 데이터 액세스
리소스에 액세스하려면 리소스를 매핑해야 합니다. 매핑은 기본적으로 애플리케이션이 메모리에 대한 CPU 액세스 권한을 부여하려고 한다는 것을 의미합니다. CPU가 기본 메모리에 액세스할 수 있도록 리소스를 매핑하는 프로세스로 인해 성능 병목 현상이 발생할 수 있으므로 이 작업을 수행하는 방법과 시기에 주의해야 합니다.
애플리케이션이 잘못된 시간에 리소스를 매핑하려고 하면 성능이 중단됩니다. 애플리케이션이 작업이 완료되기 전에 작업 결과에 액세스하려고 하면 파이프라인 중단이 발생합니다.
잘못된 시간에 맵 작업을 수행하면 GPU와 CPU가 서로 동기화되도록 하여 성능이 심각하게 저하될 수 있습니다. 이 동기화는 GPU가 CPU에서 매핑할 수 있는 리소스로 복사를 완료하기 전에 애플리케이션이 리소스에 액세스하려는 경우에 발생합니다.
성능 고려 사항
PC는 하나 이상의 CPU와 하나 이상의 GPU라는 두 가지 주요 유형의 프로세서가 있는 병렬 아키텍처로 실행되는 컴퓨터로 생각하는 것이 가장 좋습니다. 모든 병렬 아키텍처와 마찬가지로, 각 프로세서가 유휴 상태가 되지 않도록 충분한 작업으로 각 프로세서를 예약하고 한 프로세서의 작업이 다른 프로세서의 작업을 기다리지 않을 때 최상의 성능을 달성합니다.
GPU/CPU 병렬 처리에 대한 최악의 시나리오는 한 프로세서가 다른 프로세서가 수행한 작업의 결과를 기다리도록 강제해야 한다는 것입니다. Direct3D는 복사 메서드를 비동기화하여 이 비용을 제거합니다. 메서드가 반환될 때까지 복사본이 반드시 실행되지는 않습니다.
이점은 애플리케이션이 CPU가 데이터에 액세스하고, 따라서 Map 함수가 호출될 때까지 실제로 데이터를 복사하는 성능 비용을 지불하지 않는다는 것입니다. 데이터가 실제로 복사된 후 Map 메서드가 호출되면 성능 손실이 발생하지 않습니다. 반면에 데이터를 복사하기 전에 Map 메서드가 호출되면 파이프라인 중단이 발생합니다.
Direct3D의 비동기 호출(대부분의 메서드, 특히 렌더링 호출)은 명령 버퍼에 저장된다. 이 버퍼는 그래픽 드라이버 내부이며 Microsoft Windows에서 사용자 모드에서 커널 모드로의 비용이 많이 드는 전환이 가능한 한 드물게 발생하도록 기본 하드웨어에 대한 호출을 일괄 처리하는 데 사용됩니다.
명령 버퍼가 플러시되어 다음과 같은 네 가지 상황 중 하나에서 사용자/커널 모드 스위치가 발생합니다.
- Present가 호출됩니다.
- Flush가 호출됩니다.
- 명령 버퍼가 가득 찼습니다. 크기는 동적이며 운영 체제 및 그래픽 드라이버에 의해 제어됩니다.
- CPU는 명령 버퍼에서 실행 대기 중인 명령의 결과에 접근해야 합니다.
위의 네 가지 상황 중 4번은 성능에 가장 중요합니다. 애플리케이션에서 리소스 또는 하위 리소스를 복사하는 호출을 실행하면 이 호출은 명령 버퍼에 큐에 대기됩니다.
그러면 애플리케이션이 명령 버퍼가 플러시되기 전에 복사 호출의 대상이었던 준비 리소스를 매핑하려고 하면 Copy 메서드 호출을 실행해야 할 뿐만 아니라 명령 버퍼의 다른 모든 버퍼링된 명령도 실행해야 하기 때문에 파이프라인 중단이 발생합니다. 이렇게 하면 GPU가 명령 버퍼를 비우고 마지막으로 CPU에 필요한 리소스를 채우는 동안 CPU가 준비 리소스에 액세스하기 위해 대기하므로 GPU 및 CPU가 동기화됩니다. GPU가 복사본을 완료하면 CPU가 준비 리소스에 액세스하기 시작하지만 이 시간 동안 GPU는 유휴 상태가 됩니다.
런타임에 이 작업을 자주 수행하면 성능이 크게 저하됩니다. 이러한 이유로 기본 사용으로 만든 리소스의 매핑은 주의하여 수행해야 합니다. 애플리케이션은 명령 버퍼가 비워질 때까지 충분히 오래 기다려야 하므로 해당 스테이징 리소스를 매핑하기 전에 모든 명령 실행을 완료해야 합니다.
애플리케이션은 얼마나 오래 기다려야 하나요? CPU와 GPU 간의 병렬 처리를 최대로 활용할 수 있기 때문에 프레임이 두 개 이상입니다. GPU가 작동하는 방식은 애플리케이션이 명령 버퍼에 대한 호출을 제출하여 프레임 N을 처리하는 동안 GPU가 이전 프레임 N-1의 호출을 실행하는 데 사용 중이라는 것입니다.
애플리케이션이 비디오 메모리에서 유래하는 리소스를 매핑하려고 하고, 프레임 N에서 리소스를 복사하려는 경우, 이 호출은 애플리케이션이 다음 프레임에 대한 호출을 제출할 때인 N+1 프레임에서 실제로 실행되기 시작합니다. 애플리케이션이 프레임 N+2를 처리할 때, 복사가 완료되어야 합니다.
프레임 | GPU/CPU 상태 |
---|---|
N |
|
N+1 |
|
N+2 |
|
N+3 |
|
N+4 | ... |
관련 항목