다음을 통해 공유


GPU 캡처를 사용하여 프레임 분석

GPU(또는 프레임) 캡처는 애플리케이션이 수행하는 모든 Direct3D 12 API 호출을 일반적으로 단일 프레임으로 기록합니다(GPU 캡처 참조). PIX는 이러한 API 호출을 재생하여 API 호출 매개 변수, 파이프라인 및 리소스 상태, 리소스 콘텐츠 등에 대한 정보를 표시할 수 있습니다.

게임이 잘못된 방법으로 Direct3D 12를 호출하는 경우 PIX가 GPU 캡처를 성공적으로 수행하는 것은 항상 불가능합니다. PIX는 잘못된 사용 패턴의 경우에도 견고하도록 최선의 노력을 기울이고 있지만, 이는 필연적으로 가비지 인, 가비지 아웃의 경우일 수 밖에 없습니다. GPU 캡처를 수행하는 데 어려움이 있는 경우 D3D12 디버그 계층 및 GPU 기반 유효성 검사를 사용하여 잘못된 API 호출을 찾아 수정합니다.

GPU 캡처

연결 보기에서 원하는 프로세스를 시작하거나 연결합니다(관련 GPU 캡처 옵션이 선택되어 있는지 확인).

필요에 따라 GPU 캡처 옵션을 구성합니다. 캡처를 수행하려면 PIX에서 GPU 캡처 가져오기 단추를 클릭하거나 Alt+인쇄 화면(또는 PIX 설정에서 구성할 수 있는 F11)을 누릅니다. PIX UI에 캡처의 썸네일이 표시됩니다. 이 시점에서 원하는 경우 애플리케이션을 종료할 수 있습니다. 썸네일을 클릭하여 캡처를 엽니다.

프로그래밍 방식 캡처

WinPixEventRuntime을 사용하여 프로그래밍 방식으로 캡처를 수행할 수 있습니다. 자세한 내용은 프로그래밍 방식 캡처 블로그 게시물을 참조하세요.

이벤트 보기를 사용하여 API 호출 보기

이벤트 보기에는 GPU 캡처에 기록된 모든 API 호출이 표시됩니다. 게임에서 사용한 각 Direct3D 12 큐(그래픽, 컴퓨팅 또는 복사)에 대한 별도의 목록이 있습니다.

이벤트 목록은 선택적으로 정규식을 사용하여 필터링할 수 있습니다(레이블이 .*단추를 클릭). 기본적으로 GPU 하드웨어에 대한 실제 렌더링 작업을 초래한 이벤트만 표시하며, 이후 작업에서 사용할 상태를 준비하는 것이 아니라 표시됩니다. 비 GPU 이벤트를 포함하려면 레이블이 지정된 단추를 클릭합니다. G.

API 호출 매개 변수의 전체 집합과 같은 각 이벤트에 대한 자세한 내용은 이벤트 세부 정보 보기에서 확인할 수 있습니다. 이 보기는 기본적으로 파이프라인 탭에 포함되지만 주 PIX 창의 오른쪽 위 모서리에 있는 레이아웃 디자인 모드 단추를 통해 현재 레이아웃에 추가할 수도 있습니다.

프레임 프로파일링

GPU 캡처가 열려 있는 상태에서 개요 탭으로 전환합니다. 여기에서 캡처에 대한 몇 가지 기본 세부 정보를 볼 수 있습니다.

프로파일링을 시작하려면 타이밍 데이터를 수집해야 합니다. 이렇게 하려면 이벤트 보기의 오른쪽 위에 있는 타이밍 데이터 수집 단추를 클릭하거나 여기를 클릭하여 분석을 시작하고 타임라인 보기에서 타이밍 데이터 텍스트를 수집합니다. 캡처에서 GPU 작업을 재생하고 실행 기간(애플리케이션에 있는 경우 PixEvents주석이 추가됨)과 같은 기본 타이밍 데이터를 수집합니다. 완료되면 점유율 정보 및 기타 GPU 관련 카운터와 같은 타임라인 레인에서 그래프로 표시할 추가 데이터를 수집할 수 있습니다.

최상의 결과를 위해 PIX가 타이밍 데이터를 수집하는 동안에는 컴퓨터와 상호 작용하지 마세요. GPU를 사용할 수 있는 다른 애플리케이션을 닫습니다.

이벤트 보기에서 API 호출로 세분화되는 카운터를 볼 수도 있습니다. 카운터를 사용하거나 사용하지 않도록 설정하려면 이벤트 목록 카운터 단추(이벤트 보기의 오른쪽 위)를 클릭합니다.

타이밍 데이터

GPU 타이밍 정보의 두 가지 소스가 있습니다.

  1. GPU가 각 작업 부분을 처리하기 시작할 때 파이프 시작 타임스탬프가 보고됩니다. 이 데이터는 적합한 그래픽 드라이버가 있는 Windows 10 빌드 14393 이상(또는 그 이상)을 실행하는 경우에만 사용할 수 있습니다(블로그 게시물 요구 사항 참조). 파이프 시작 타임스탬프를 사용할 수 없는 경우 타이밍 데이터를 수집하는 데 시간이 더 오래 걸립니다.
  2. GPU가 각 작업 부분의 처리를 완료한 경우 EOP(파이프 끝) 타임스탬프가 보고됩니다.

GPU는 대규모 병렬 및 깊이 파이프라인되므로 둘 이상의 작업이 동시에 실행되고 인접한 작업이 겹치는 것이 일반적입니다. PIX는 하드웨어의 병렬 실행 모델에 대한 인사이트를 제공할 수 있는 두 가지 방법으로 시간을 측정합니다.

  1. 실행 기간은 파이프 시작에서 각 개별 작업의 파이프 끝 타임스탬프로 측정됩니다. 이러한 방식으로 측정할 때 이전 항목과 병렬로 실행되는 GPU 작업 항목은 GPU의 경합으로 인해 격리된 상태로 실행된 경우보다 더 오래 나타날 수 있습니다.
  2. EOP 기간은 이전 항목의 EOP(파이프 끝) 타임스탬프에서 이 항목의 EOP 타임스탬프로 측정됩니다. 따라서 이전 항목과 병렬로 실행되는 작업 항목은 격리 상태로 실행된 경우보다 짧게 표시되며, 일부 항목은 이전 항목과 완전히 병렬로 완료된 경우 0 기간으로 보고될 수도 있습니다.

타임라인 보기에는 각 GPU 작업의 타이밍을 보여 주는 하나 이상의 레인이 표시됩니다. 게임에서 사용하는 각 큐(그래픽, 컴퓨팅 또는 복사)에 대한 EOP 기간 데이터를 포함하는 별도의 레인과 모든 큐에서 결합된 실행 기간 데이터(사용 가능한 경우)를 보여 주는 단일 레인이 있습니다.

PIX GPU 캡처 타임라인 보기의 타이밍 정보

Windows의 PIX는 현재 GPU 캡처의 타이밍을 분석하는 동안 다른 큐의 GPU 작업과 겹치지 않습니다. 겹치는 비동기 컴퓨팅 타이밍 데이터를 보려면 타이밍 캡처를 사용하는 것이 좋습니다. GPU 캡처에서 게임이 비동기 컴퓨팅을 사용하여 렌더링 및 컴퓨팅 작업을 동시에 실행하는 경우 PIX는 대신 먼저 하나를 측정한 다음 다른 항목을 측정합니다. 이로 인해 원래 게임 내에서 실행되는 방법과 비교하여 작업의 각 부분에 대해 보고된 기간이 짧아질 수 있지만(GPU의 경합 감소로 인해) 총 시간(병렬 처리 감소로 인해)이 길어질 수 있습니다.

GPU 카운터 및 점유율

PIX는 GPU 플러그 인을 통해 IHV에서 제공하는 하드웨어별 성능 카운터를 노출합니다. 이러한 카운터는 이벤트 목록 카운터 보기(이벤트 보기의 오른쪽 위에서 사용하도록 설정하는 단추) 또는 타임라인 카운터 보기(타임라인 보기의 오른쪽 위에서 사용하도록 설정하는 단추)에서 사용하도록 설정하고 수집할 수 있습니다.

일부 GPU에서 PIX는 점유 정보를 수집할 수도 있습니다. GPU는 일반적으로 각 수준에서 리소스를 공유할 수 있는 반복 블록의 계층 구조로 생성됩니다. 예를 들어 가상 GPU는 다음과 같이 구조화될 수 있습니다.

예제 GPU 블록 그림

GPU는 셰이더 작업을 웨이브로 분리하여 셰이더를 실행합니다(워프 또는 웨이브 프런트라고도 함). 위의 다이어그램에서 각 파란색 블록은 하나의 웨이브를 실행할 수 있습니다. 각 녹색 블록은 최대 4개의 웨이브를 실행할 수 있습니다.

모든 블루스가 단일 레지스터 집합을 공유하므로 워크로드에 모든 레지스터가 필요한 경우 한 번에 하나의 웨이브만 녹색 블록에서 실행할 수 있습니다. 이 경우 녹색 블록의 점유율은 4의 총 가능한 점유율 중 1이 됩니다.

언제든지 모든 녹색 블록이 다른 수의 웨이브를 실행할 수 있습니다. 위의 4개의 녹색 블록 중 하나는 3개의 파도, 다른 2개의 파도 및 나머지 1개의 파동을 실행할 수 있습니다. PIX는 이 모든 데이터를 단일 값(이 예제의 최대 점유율 3)으로 끓입니다.

이는 최대 점유를 셰이더 스테이지로 구분하여 표시하는 점유 레인의 PIX 에 표시됩니다. 이는 GPU가 병렬로 수행할 수 있는 작업의 양을 나타내는 것입니다. 막대가 높을수록 GPU 사용률이 향상됩니다.

PIX GPU 캡처 타임라인 보기의 GPU 카운터

렌더링 문제 디버깅

GPU 캡처가 열려 있는 상태에서 파이프라인 탭으로 전환합니다. 해당 탭에는 이벤트 보기, 여러 상태 및 리소스 검사기 보기 및 파이프라인 보기가 포함됩니다.

이벤트 보기에서 이벤트를 선택하면 다양한 보기, 특히 루트 서명, 파이프라인 상태 및 바인딩된 리소스를 검사하는 데 사용할 수 있는 파이프라인 보기가 채워집니다. 파이프라인 뷰는 셰이더 디버깅의 진입점이기도 합니다.

대부분의 기능을 수행하려면 분석을 시작해야 합니다. PIX가 타이밍 데이터, 상태 정보 및 리소스를 수집하는 방법을 분석합니다. 분석을 시작하는 방법에는 여러 가지가 있지만 전역적인 방법은 애플리케이션의 오른쪽 위에 있는 분석 재생 시작 단추를 사용하는 것입니다. 원하는 GPU가 선택되어 있는지 확인합니다.

Direct3D 12 개체, 매개 변수 및 상태 보기

이벤트 보기에서 이벤트를 선택한 후 상태 및 파이프라인 보기(파이프라인 탭에 있는)는 해당 이벤트 당시 Direct3D 상태의 세부 정보를 표시합니다. 파이프라인, 셰이더 코드, 입력, 출력 및 현재 바인딩된 rendertarget에 바인딩된 리소스를 볼 수 있습니다.

Direct3D 파이프라인 상태

파이프라인 보기에서 VS 출력 보기

셰이더 디버깅

적절한 이벤트를 선택하고 분석을 실행한 후 셰이더를 디버그할 수 있습니다. 파이프라인 보기에는 셰이더 디버깅을 시작하는 여러 가지 방법이 있습니다.

  1. 원하는 셰이더 단계에서 셰이더 항목을 선택하고 녹색 재생 단추를 클릭합니다. 디버그 세션을 시작하기 전에 적절한 셰이더 매개 변수(예: 꼭짓점 셰이더의 인스턴스 및 꼭짓점 ID 또는 픽셀 셰이더의 픽셀 좌표)를 구성해야 합니다.
  2. 리소스 뷰어(예: VS 출력 또는 SRV/UAV/RTV)를 마우스 오른쪽 단추로 클릭하고 적절한 디버그 옵션을 선택합니다.
  3. 적절한 리소스(예: SRV/UAV/RTV)를 볼 때 픽셀 세부 정보 보기에서 픽셀 디버그 단추를 클릭합니다.

디버깅할 때 셰이더 원본을 볼 수 없는 경우 디버그 정보가 누락된 것일 수 있습니다. 애플리케이션에 대한 셰이더 PDB를 생성하고 해당 PDB를 로드하도록 PIX를 구성했는지 확인합니다.

셰이더 편집 및 계속

HLSL 셰이더 코드는 PIX 내에서 직접 편집할 수 있으므로 변경 내용이 렌더링 결과 또는 성능에 미치는 영향을 즉시 확인할 수 있습니다. 이는 셰이더를 프로토타입으로 만들고 최적화하는 데 유용할 수 있습니다. 다른 아이디어를 시도할 때 소요 시간을 크게 줄일 수 있기 때문입니다.

셰이더를 선택한 후 원하는 코드를 편집한 다음 적용 편집>을 클릭합니다. 다른 보기(예: OM RTV 0)는 변경 효과를 표시하도록 업데이트됩니다. 셰이더 코드 편집과 동시에 rendertarget 결과를 보기 위해 둘 이상의 파이프라인 뷰 인스턴스를 나란히 도킹하는 것이 유용할 수 있습니다.

변경된 내용을 정확히 추적하지 못하면 셰이더 코드를 마우스 오른쪽 단추로 클릭하고 원본으로 Diff를 선택합니다.

Windows의 PIX는 수정된 셰이더를 캡처 파일에 다시 저장하는 것을 아직 지원하지 않습니다.

시각화 도우미 디버그

Rendertarget 시각화 도우미는 rendertarget의 콘텐츠를 검사할 때 파이프라인 보기에서 사용할 수 있습니다. 기본 이미지 시각화 도우미는 이미지를 정상적으로 표시하며 시각화 보기에서 다른 시각화를 선택하여 변경할 수 있습니다.

픽셀 기록

픽셀과 유사한 리소스(예: RTV, UAV 또는 깊이 버퍼)의 경우 픽셀 기록을 사용하여 특정 픽셀에 영향을 주는 모든 작업을 볼 수 있습니다. 원하는 픽셀을 마우스 오른쪽 단추로 클릭하고 픽셀 기록 표시를 선택하거나 픽셀 세부 정보보기에서 픽셀 기록 단추를 클릭하여 액세스할 수 있습니다.

주의 사항 및 기타 참고 사항

  • 게임이 잘못된 방법으로 Direct3D 12를 호출하는 경우 PIX가 GPU 캡처를 성공적으로 수행하는 것은 항상 불가능합니다. PIX는 잘못된 사용 패턴의 경우에도 견고하도록 최선의 노력을 기울이고 있지만, 이는 필연적으로 가비지 인, 가비지 아웃의 경우일 수 밖에 없습니다. GPU 캡처를 수행하는 데 어려움이 있는 경우 D3D12 디버그 계층 및 GPU 기반 유효성 검사를 사용하여 잘못된 API 호출을 찾아 수정합니다.
  • Windows GPU 캡처는 일반적으로 다른 GPU 하드웨어 및 드라이버 버전에서 이식 가능하지 않습니다. 대부분의 경우 한 컴퓨터에서 캡처한 캡처는 동일한 하드웨어 제품군의 다른 유사한 GPU에서 올바르게 재생되며 일부 게임의 캡처는 완전히 다른 제조업체의 GPU에서 작동할 수도 있지만 드라이버 업그레이드와 같은 사소한 항목이 이전 캡처와의 호환성을 손상시킬 수도 있습니다. PIX는 GPU와 드라이버가 정확히 같을 때만 재생이 성공할 수 있도록 보장할 수 있으므로 PIX는 완벽한 일치 항목이 없는 경우 분석을 시작하기 전에 경고합니다. 자신의 위험에 해당 경고를 지나서 진행합니다.
  • PIX에는 여러 GPU에 대한 지원이 제한되어 있습니다. 애플리케이션이 사용한 어댑터 수에 관계없이 항상 단일 어댑터에서 GPU 캡처를 재생합니다. PIX를 사용하면 PIX 도구 모음의 드롭다운 어댑터에서 재생 어댑터를 선택할 수 있습니다. 애플리케이션에서 하나의 어댑터만 사용하는 경우 PIX는 재생 어댑터를 자동으로 선택하려고 시도합니다.
  • 비결정적 ExecuteIndirect 워크로드의 경우 재생 시간 ExecuteIndirect 인수 버퍼 설정 사용을 사용하도록 설정할 수 있습니다 .