타이밍(Direct3D 12 그래픽)
이 섹션에서는 타임스탬프 쿼리와 GPU 및 CPU 타임스탬프 카운터 조정에 대해 설명합니다.
애플리케이션은 명령별 큐 기준으로 GPU 타임스탬프 빈도를 쿼리할 수 있습니다( ID3D12CommandQueue::GetTimestampFrequency 메서드 참조).
반환되는 빈도는 Hz(틱 수/초) 단위로 측정됩니다. 지정된 명령 큐가 타임스탬프를 지원하지 않는 경우( 쿼리 섹션의 테이블 참조) 이 API가 실패하고 E_FAIL 반환합니다. D3D12_COMMAND_LIST_TYPE_DIRECT 및 D3D12_COMMAND_LIST_TYPE_COMPUTE 항상 타임스탬프를 지원합니다. D3D12_COMMAND_LIST_TYPE_COPY 선택적으로 D3D12_FEATURE_DATA_D3D12_OPTIONS3::CopyQueueTimestampQueriesSupported 멤버가 TRUE인 경우 타임스탬프를 지원 합니다.
D3D12를 사용하면 애플리케이션이 QueryPerformanceCounter
를 호출하여 얻은 결과와 타임스탬프 쿼리에서 얻은 결과를 연결할 수 있습니다. 이 기능은 ID3D12CommandQueue::GetClockCalibration을 호출하여 사용하도록 설정합니다.
타임스탬프는 GPU가 이전의 모든 워크로드로 완료되는 시점에 GPU에 의해 샘플링됩니다. 이는 Direct3D 11에서 채택한 것과 동일한 동작입니다(GitHub의 Direct3D 11.3 기능 사양에서 D3D11_QUERY_TIMESTAMP 참조) . 즉, 타임스탬프 쿼리는 Direct3D 12의 BOP(하위 파이프) 작업입니다.
GetClockCalibration은 지정된 명령 큐에 대한 GPU 타임스탬프 카운터를 샘플링하고 거의 동시에 QueryPerformanceCounter
를 통해 CPU 카운터를 샘플링합니다. 지정된 명령 큐가 타임스탬프를 지원하지 않으면 이 API가 다시 실패합니다(E_FAIL 반환). 쿼리 항목의 표 참조).
GPU 및 CPU 타임스탬프 카운터는 이 프로세서의 클럭 속도에 직접 관련되는 것이 아니라 타임스탬프 틱에서 작동합니다.
타임스탬프 쿼리를 통해 명령 목록의 일부로 타임스탬프를 가져올 수 있습니다(명령 큐의 CPU 쪽 호출이 아닌). 일반적으로 쿼리에 대한 자세한 내용은 쿼리를 참조하세요.
모든 타임스탬프 쿼리는 실제 쿼리에 D3D12_QUERY_TYPE_TIMESTAMP 형식을 사용합니다. 그러나 하드웨어 제한으로 인해 D3D12_COMMAND_LIST_TYPE_DIRECT 및 D3D12_COMMAND_LIST_TYPE_COMPUTE D3D12_COMMAND_LIST_TYPE_COPY 사용하는 것과 다른 D3D12_QUERY_HEAP_TYPE 사용합니다.
직접 및 컴퓨팅 큐는 D3D12_QUERY_HEAP_TYPE_TIMESTAMP 사용합니다.
복사 큐는 D3D12_QUERY_HEAP_TYPE_COPY_QUEUE_TIMESTAMP 사용합니다.
복사 큐 쿼리는 D3D12_FEATURE_DATA_D3D12_OPTIONS3::CopyQueueTimestampQueriesSupported 멤버가 TRUE인 경우에만 지원됩니다.
ID3D12GraphicsCommandList::ResolveQueryData를 통해 확인된 타임스탬프 쿼리는 ID3D12CommandQueue::GetClockCalibration에서 반환되는 것처럼 틱을 나타내는 UINT64이므로 길이를 초 단위로 가져오려면 큐 빈도로 나누어야 합니다.
중요
정확도를 위해 타임스탬프의 두 번째 또는 밀리초 간격을 계산할 때 부동 소수점 산술 연산을 사용합니다. 예를 들어 queriedTicks / Frequency
대신 queriedTicks / (double)Frequency
을 사용합니다.