CPU 및 GPU 프레임 처리 시간 예측

CPU 및 GPU 프레임 처리 시간 (프레임 시간)을 추정하는 것은 앱의 성능을 파악하고 병목 현상을 찾는 데 필수적입니다. AGI로 앱을 프로파일링하면 시스템 프로파일러에서 프레임 시간을 추정하는 데 사용할 수 있는 트레이스 데이터를 제공합니다.

CPU 시간

AGI에서는 시스템 프로필의 CPU 트랙에서 총 CPU 프레임 시간과 활성 CPU 프레임 시간을 볼 수 있습니다.

총 CPU 시간

소요된 총 CPU 시간을 측정하려면 연속 프레임 제출 이벤트 사이의 시간이 포함된 시간 범위를 선택합니다. 프레임 제출 이벤트는 eglSwapBuffers (OpenGL용) 및 vkQueuePresentKHR(Vulkan용)입니다.

eglSwapBuffer 이벤트의 스크린샷
그림 1.eglSwapBuffer 이벤트 사이의 시간


vkQueuePresentKHR 이벤트의 스크린샷
그림 2.vkQueuePresentKHR 이벤트 사이의 시간

이 측정은 총 CPU 시간의 추정치이지만 반드시 활성 CPU 시간을 나타내는 것은 아닙니다. 예를 들어 GPU 바운드 앱에서 CPU는 새 프레임을 제출하기 전에 GPU가 작업을 완료할 때까지 기다릴 수 있습니다. 이는 dequeueBuffer, eglSwapBuffer (OpenGL용) 또는 vkQueuePresent (Vulkan용) 이벤트가 CPU 시간의 많은 부분을 차지할 때 자주 발생합니다. 대기 시간은 총 CPU 시간에 포함되지만 활성 CPU 시간에는 포함되지 않습니다.

dequeueBuffer 및 eglSwapBuffer 이벤트 중에 많은 유휴 상태를 보여주는 스크린샷
그림 3.eglSwapBuffer 이벤트 중에 많은 CPU가 유휴 상태입니다.dequeueBuffer

활성 CPU 시간

활성 CPU 시간은 CPU가 유휴 상태가 아닌 앱 코드를 실행하는 시점을 결정합니다.

활성 CPU 시간을 측정하려면 CPU 이벤트 바로 위에 있는 실행 중 슬라이스를 봅니다. 두 프레임 제출 이벤트 사이의 트레이스 부분 중 실행 중 상태에 있는 모든 부분을 계산합니다. 작업 스레드를 포함해야 합니다.

활성 CPU 시간을 측정하는 데 사용할 수 있는 두 기간의 CPU 시간 스크린샷
그림 5. 활성 CPU 시간을 측정하는 데 사용할 수 있는 두 기간의 CPU 시간


기본 스레드가 유휴 상태인 동안 다른 작업 스레드가 있는 멀티스레드 앱의 스크린샷
그림 6. 기본 스레드가 유휴 상태인 동안 다른 작업 스레드가 있는 다중 스레드 앱

활성 CPU 시간을 측정하는 또 다른 방법은 CPU 트랙에서 앱 슬라이스를 보는 것입니다. 이러한 슬라이스는 CPU가 실행 중인 시점을 나타내며 실행 중 슬라이스와 일치합니다.

CPU 트랙과 일치하는 고정된 스레드의 실행 상태를 보여주는 스크린샷
그림 7. 고정된 스레드의 실행 상태가 CPU 트랙과 일치합니다.

앱 슬라이스를 식별하려면 앱에 ATrace 마커를 추가하면 됩니다. 그러면 시스템 프로파일러의 CPU 트랙에 마커가 표시됩니다.

CPU 트랙에 표시된 ATrace 슬라이스의 스크린샷
그림 8. CPU 트랙에 표시된 ATrace 슬라이스

GPU 프레임 시간 추정

GPU 프레임 시간을 추정하려면 시스템 프로파일러에서 GPU 슬라이스 또는 GPU 카운터를 사용하면 됩니다. GPU 슬라이스를 사용하면 추정치가 더 정확합니다.

GPU 슬라이스

시스템 프로파일러에 GPU 슬라이스 정보가 있는 경우 앱이 단일 프레임과 연결된 작업에 소요하는 총 시간을 측정하여 매우 정확한 GPU 프레임 시간 정보를 얻을 수 있습니다.

Mali 기기

Mali 기기에서 GPU 슬라이스에는 프래그먼트, 비프래그먼트, 경우에 따라 보조 비프래그먼트 트랙이 있습니다. 덜 복잡한 프레임의 경우 프래그먼트 및 비프래그먼트 작업은 순차적이므로 활성 GPU 작업 간의 간격을 찾아 한 프레임의 작업을 다른 프레임의 작업과 구분할 수 있습니다.

또는 GPU에 제출되는 작업을 잘 알고 있다면 제출된 렌더링 패스의 패턴을 식별하여 프레임이 시작되고 종료되는 시점에 관한 정보를 얻을 수 있습니다.

순서대로 실행되는 여러 프레임의 스크린샷
그림 9. 순서대로 실행되는 여러 프레임
AGI가 개별 프레임의 작업에 확대된 스크린샷
그림 10. 개별 프레임의 작업을 확대한 모습

GPU 워크플로가 더 많이 병렬화된 앱의 경우 각 슬라이스의 선택 창에서 동일한 submissionID 를 가진 모든 프레임을 찾아 GPU 프레임 시간을 얻을 수 있습니다.

Vulkan 기반 앱의 경우 여러 제출을 사용하여 프레임을 구성할 수 있습니다. 각 제출의 슬라이스가 포함된 Vulkan 이벤트 트랙을 사용하여 제출 ID를 추적합니다. 제출 슬라이스를 선택하면 제출에 해당하는 모든 GPU 활동 슬라이스가 강조표시됩니다.

하나의 프레임에 대한 작업이 다른 프레임과 겹칠 수 있는 병렬화된 GPU 워크로드의 스크린샷
그림 11. 한 프레임의 작업이 다른 프레임의 작업과 겹칠 수 있는 병렬화된 GPU 워크로드


프레임에 대해 선택된 여러 Vulkan 이벤트의 스크린샷
그림 12. 프레임에 선택된 여러 Vulkan 이벤트

Adreno 기기

Adreno 기기에서 GPU 슬라이스는 GPU 대기열 0 트랙에 표시되며 항상 순차적으로 표시되므로 프레임의 렌더링 패스를 나타내는 모든 슬라이스를 보고 이를 사용하여 GPU 프레임 시간을 측정할 수 있습니다.

순서대로 실행되는 여러 프레임의 스크린샷
그림 13. 순서대로 실행되는 여러 프레임
여러 렌더링 패스가 있는 프레임에서 AGI가 확대된 스크린샷
그림 14. 여러 렌더링 패스가 있는 프레임을 확대한 모습

앞에서 설명한 Mali 시나리오와 마찬가지로 앱이 Vulkan을 사용하는 경우 Vulkan 이벤트 트랙은 프레임을 실행하기 위해 제출되는 작업에 관한 정보를 제공합니다. 렌더링 패스를 강조표시하려면 프레임과 연결된 Vulkan 이벤트 슬라이스를 클릭합니다.

프레임의 Vulkan 이벤트가 선택된 Vulkan 기반 앱의 스크린샷
그림 15. 프레임의 Vulkan 이벤트가 선택된 Vulkan 기반 앱

앱이 GPU 바운드인 경우 GPU 프레임 경계를 구분하기가 더 어려운 시나리오가 있습니다. 이러한 시나리오에서 GPU에 제출되는 작업을 잘 알고 있다면 렌더링 패스가 실행되는 패턴을 식별하고 이 정보에서 프레임 경계를 결정할 수 있습니다.

프레임 경계를 식별하는 데 도움이 되는 렌더링 패스 패턴이 있는 GPU 바운드 앱의 스크린샷
그림 16. 프레임 경계를 식별하는 데 도움이 되는 렌더링 패스 패턴이 있는 GPU 바운드 앱

GPU 카운터

트레이스에서 GPU 슬라이스 정보를 사용할 수 없는 경우 GPU 카운터 트랙을 사용하여 GPU 프레임 시간을 추정할 수 있습니다.

Mali 기기

Mali 기기에서는 GPU 사용률 트랙을 사용하여 GPU 프레임 시간을 추정할 수 있습니다. 앱이 GPU 집약적이지 않은 경우 활동이 지속적으로 높은 것이 아니라 GPU 활동이 높고 낮은 기간이 규칙적으로 있습니다. GPU 사용률 트랙을 사용하여 GPU 프레임 시간을 추정하려면 트랙에서 활동이 높은 기간의 지속 시간을 측정합니다.

Mali 기기에서 GPU 사용률 및 GPU 대기열 트랙의 스크린샷
그림 17. Mali 기기의 GPU 사용률 및 GPU 대기열 트랙

앱이 GPU 집약적인 경우 GPU 사용률이 지속적으로 매우 높을 수 있습니다. 이 경우 프래그먼트 대기열 사용률비프래그먼트 대기열 사용률 트랙을 사용하여 GPU 활동을 모니터링하고 GPU 프레임 시간을 추정할 수 있습니다. 프래그먼트비프래그먼트 트랙에서 패턴을 찾으면 프레임 경계가 대략 어디에 있는지 파악하고 이를 사용하여 GPU 프레임 시간을 측정할 수 있습니다.

프래그먼트 트랙과 프래그먼트가 아닌 트랙의 스크린샷
그림 18. 프래그먼트비프래그먼트 트랙

Adreno 기기

Adreno 기기에서 앱이 GPU 집약적이지 않은 경우 이전 섹션의 Mali 기기와 동일한 방식으로 GPU 프레임 시간을 추정할 수 있습니다.

Adreno 기기의 GPU 사용률 비율 및 GPU 대기열 트랙 스크린샷
그림 19. Adreno 기기의 GPU 사용률(%) 및 GPU 대기열 트랙

앱이 GPU 집약적이고 애플리케이션의 GPU 사용률이 지속적으로 높은 경우 초당 정점 명령어초당 프래그먼트 명령어 트랙을 사용하여 GPU 프레임 시간을 추정할 수 있습니다. 이러한 트랙의 활동 수준에서 패턴을 찾으면 프레임 경계가 대략 어디에 있는지 파악하고 이를 사용하여 GPU 프레임 시간을 측정할 수 있습니다.

Vertex 안내 / 두 번째 트랙의 스크린샷
그림 20. 초당 정점 명령어 트랙

다음과 같은 다른 트랙도 비슷한 정보를 제공할 수 있습니다.

  • 초당 음영 처리된 정점
  • 초당 음영 처리된 프래그먼트
  • 정점 음영 처리 시간(%)
  • 프래그먼트 음영 처리 시간(%)