Ước tính thời gian xử lý khung hình của CPU và GPU

Việc ước tính thời gian xử lý khung hình CPU và GPU (thời gian kết xuất khung hình) là điều cần thiết để hiểu rõ hiệu suất của ứng dụng và xác định nút thắt cổ chai. Khi bạn phân tích một ứng dụng bằng AGI, Trình phân tích hệ thống sẽ cung cấp dữ liệu theo dõi mà bạn có thể sử dụng để ước tính thời gian khung hình.

Thời gian CPU

Trong AGI, bạn có thể xem tổng thời gian khung CPU và thời gian khung CPU đang hoạt động trong kênh CPU của một hồ sơ hệ thống.

Tổng thời gian CPU

Để đo lường tổng thời gian CPU đã dùng, hãy chọn phạm vi thời gian bao gồm thời gian giữa các sự kiện gửi khung hình liên tiếp. Các sự kiện gửi khung hình là eglSwapBuffers (dành cho OpenGL) và vkQueuePresentKHR (dành cho Vulkan).

Ảnh chụp màn hình các sự kiện eglSwapBuffer.
Hình 1. Khoảng thời gian giữa hai sự kiện eglSwapBuffer.


Ảnh chụp màn hình của sự kiện vkQueuePresentKHR.
Hình 2. Khoảng thời gian giữa hai sự kiện vkQueuePresentKHR.

Thông tin đo lường này là ước tính tổng thời gian CPU,nhưng không nhất thiết phải đại diện cho thời gian CPU đang hoạt động. Ví dụ: trong các ứng dụng liên kết với GPU, CPU có thể chờ GPU hoàn tất công việc trước khi gửi một khung mới. Điều này thường xảy ra khi một sự kiện dequeueBuffer, eglSwapBuffer (đối với OpenGL) hoặc vkQueuePresent (đối với Vulkan) chiếm phần lớn thời gian CPU. Thời gian chờ được tính vào tổng thời gian CPU, nhưng không tính vào thời gian CPU đang hoạt động.

Ảnh chụp màn hình cho thấy một lượng lớn thời gian rảnh trong các sự kiện dequeueBuffer và eglSwapBuffer.
Hình 3. CPU ở trạng thái rảnh trong các sự kiện dequeueBuffereglSwapBuffer.

Thời gian CPU hoạt động

Thời gian CPU đang hoạt động xác định thời điểm CPU đang chạy mã ứng dụng mà không ở trạng thái rảnh.

Để đo lường thời gian CPU đang hoạt động, hãy xem các lát cắt Đang chạy ngay phía trên các sự kiện CPU. Đếm tất cả các phần của dấu vết giữa hai sự kiện gửi khung hình ở trạng thái Đang chạy. Đảm bảo rằng bạn thêm các luồng đang hoạt động.

Ảnh chụp màn hình của hai khoảng thời gian CPU có thể dùng để đo lường thời gian CPU đang hoạt động.
Hình 5. Hai khoảng thời gian CPU có thể được dùng để đo lường thời gian CPU đang hoạt động.


Ảnh chụp màn hình của một ứng dụng đa luồng có các luồng khác đang hoạt động trong khi luồng chính đang ở trạng thái rảnh.
Hình 6. Một ứng dụng đa luồng có các luồng khác đang hoạt động trong khi luồng chính ở trạng thái rảnh.

Một cách khác để đo lường thời gian CPU đang hoạt động là xem các lát cắt ứng dụng trong kênh CPU. Các lát cắt này cho biết thời điểm CPU đang chạy và tương ứng với các lát cắt Đang chạy.

Ảnh chụp màn hình cho thấy trạng thái đang chạy của một luồng được ghim khớp với kênh CPU.
Hình 7. Trạng thái đang chạy của luồng được ghim khớp với kênh CPU.

Để giúp xác định lát cắt ứng dụng, bạn có thể thêm điểm đánh dấu ATrace vào ứng dụng. Thao tác này sẽ hiển thị các điểm đánh dấu trong kênh CPU của Trình phân tích hệ thống.

Ảnh chụp màn hình các lát cắt ATrace hiển thị trên kênh CPU.
Hình 8. Các lát cắt ATrace hiển thị trên kênh CPU.

Ước tính thời gian kết xuất khung hình của GPU

Để ước tính thời gian khung hình GPU, bạn có thể sử dụng lát cắt GPU hoặc bộ đếm GPU trong Trình phân tích hệ thống. Số liệu ước tính sẽ chính xác hơn khi sử dụng lát cắt GPU.

Lát GPU

Nếu Trình phân tích tài nguyên hệ thống có thông tin về lát cắt GPU, bạn có thể nhận được thông tin rất chính xác về thời gian kết xuất khung hình GPU bằng cách đo lường tổng thời gian ứng dụng của bạn dành cho các tác vụ liên kết với một khung hình.

Thiết bị Mali

Trên các thiết bị Mali, các lát cắt GPU có mảnh, không phải mảnh và đôi khi có các kênh bổ sung không phải mảnh. Đối với các khung hình ít phức tạp hơn, công việc của mảnh và không phải mảnh là tuần tự, vì vậy, bạn có thể phân biệt công việc của một khung hình với khung hình khác bằng cách tìm khoảng trống giữa công việc GPU đang hoạt động.

Ngoài ra, nếu bạn đã quen với công việc đang được gửi đến GPU, thì việc xác định mẫu của các lượt kết xuất đã gửi sẽ cung cấp thông tin về thời điểm bắt đầu và kết thúc khung hình.

Ảnh chụp màn hình nhiều khung hình được thực thi theo trình tự.
Hình 9. Nhiều khung hình được thực thi theo trình tự.
Ảnh chụp màn hình trong đó AGI được phóng to trên một khung hình riêng lẻ.
Hình 10. Phóng to công việc của một khung hình riêng lẻ.

Đối với các ứng dụng có quy trình làm việc GPU song song nhiều hơn, bạn có thể lấy thời gian kết xuất khung hình GPU bằng cách tìm tất cả các khung hình có cùng submissionID trong ngăn Selection (Lựa chọn) cho mỗi lát cắt.

Đối với các ứng dụng dựa trên Vulkan, bạn có thể sử dụng nhiều lần gửi để tạo một khung. Theo dõi các mã gửi bằng cách sử dụng kênh Sự kiện Vulkan. Kênh này chứa một lát cắt cho mỗi lần gửi. Việc chọn một lát cắt gửi sẽ làm nổi bật tất cả các lát cắt hoạt động GPU tương ứng với lát cắt gửi đó.

Ảnh chụp màn hình về khối lượng công việc GPU song song, trong đó công việc trên một khung hình có thể trùng lặp với công việc trên một khung hình khác.
Hình 11. Khối lượng công việc song song trên GPU, trong đó công việc trên một khung hình có thể trùng lặp với công việc trên một khung hình khác.


Ảnh chụp màn hình của một số sự kiện Vulkan được chọn cho một khung.
Hình 12. Một số sự kiện Vulkan được chọn cho một khung hình.

Thiết bị Adreno

Trên các thiết bị Adreno, các lát cắt GPU xuất hiện trong kênh GPU Queue 0 (Hàng đợi GPU 0) và luôn được biểu thị tuần tự, vì vậy, bạn có thể xem tất cả các lát cắt đại diện cho các lượt kết xuất cho một khung hình và sử dụng các lát cắt đó để đo lường thời gian khung hình GPU.

Ảnh chụp màn hình nhiều khung hình được thực thi theo trình tự.
Hình 13. Nhiều khung hình được thực thi theo trình tự.
Ảnh chụp màn hình trong đó AGI được phóng to trên một khung có nhiều lượt kết xuất.
Hình 14. Phóng to một khung hình có nhiều lượt kết xuất.

Tương tự như trường hợp Mali được mô tả trước đó: nếu ứng dụng đang sử dụng Vulkan, thì kênh Vulkan Events (Sự kiện Vulkan) sẽ cung cấp thông tin về công việc đang được gửi để thực thi khung. Để làm nổi bật các lượt kết xuất, hãy nhấp vào các lát cắt Sự kiện Vulkan liên kết với khung.

Ảnh chụp màn hình của một ứng dụng dựa trên Vulkan, trong đó các sự kiện Vulkan của khung được chọn.
Hình 15. Một ứng dụng dựa trên Vulkan, trong đó các sự kiện Vulkan cho một khung hình được chọn.

Có một số trường hợp khó phân biệt ranh giới khung GPU hơn do ứng dụng bị ràng buộc nhiều vào GPU. Trong những trường hợp này, nếu quen thuộc với công việc đang được gửi đến GPU, bạn có thể xác định mẫu mà các lượt kết xuất đang được thực thi và xác định ranh giới khung hình từ thông tin đó.

Ảnh chụp màn hình của một ứng dụng bị ràng buộc nhiều vào GPU với mẫu truyền kết xuất giúp xác định ranh giới khung hình.
Hình 16. Một ứng dụng liên kết nhiều với GPU có mẫu truyền kết xuất giúp xác định ranh giới khung hình.

Bộ đếm GPU

Nếu không có thông tin về lát cắt GPU trong dấu vết, bạn có thể ước tính thời gian khung hình GPU bằng cách sử dụng kênh GPU counter (Bộ đếm GPU).

Thiết bị Mali

Trên các thiết bị Mali, bạn có thể sử dụng kênh Mức sử dụng GPU để ước tính thời gian khung hình GPU cho một ứng dụng không sử dụng nhiều GPU. Khi các ứng dụng ít sử dụng GPU hơn, chúng sẽ có các khoảng thời gian hoạt động GPU cao và thấp đều đặn, thay vì hoạt động cao một cách nhất quán. Để ước tính thời gian kết xuất khung hình GPU bằng cách sử dụng kênh Mức sử dụng GPU, hãy đo lường thời lượng của các khoảng thời gian hoạt động cao trong kênh.

Ảnh chụp màn hình về mức sử dụng GPU và các kênh GPU Queue trên thiết bị Mali.
Hình 17. Các kênh sử dụng GPU và GPU Queue trên thiết bị Mali.

Nếu ứng dụng sử dụng nhiều GPU hơn, thì mức sử dụng GPU có thể luôn ở mức rất cao. Trong trường hợp này, bạn có thể sử dụng các kênh sử dụng hàng đợi mảnhsử dụng hàng đợi không phải mảnh để theo dõi hoạt động của GPU và ước tính thời gian khung hình GPU. Bằng cách tìm kiếm các mẫu trong kênh mảnhkhông phải mảnh, bạn có thể ước tính sơ bộ vị trí ranh giới của một khung hình và sử dụng thông tin đó để đo lường thời gian khung hình GPU.

Ảnh chụp màn hình của các kênh phân mảnh và không phân mảnh.
Hình 18. Các kênh mảnhkhông phải mảnh.

Thiết bị Adreno

Trên các thiết bị Adreno, nếu ứng dụng không sử dụng nhiều GPU, bạn có thể ước tính thời gian khung hình GPU theo cách tương tự như với thiết bị Mali trong phần trước.

Ảnh chụp màn hình về tỷ lệ phần trăm sử dụng GPU và các kênh GPU Queue (hàng đợi GPU) trên thiết bị Adreno.
Hình 19. Tỷ lệ phần trăm mức sử dụng GPU và các kênh GPU Queue trên thiết bị Adreno.

Nếu ứng dụng sử dụng nhiều GPU hơn và tỷ lệ sử dụng GPU của ứng dụng luôn ở mức cao, bạn có thể sử dụng kênh Vertex Instructions / Second (Lệnh đỉnh/giây) và Fragment Instructions / Second (Lệnh mảnh/giây) để ước tính thời gian khung GPU. Bằng cách tìm kiếm các mẫu trong mức độ hoạt động của các kênh này, bạn có thể dự đoán sơ bộ vị trí ranh giới của một khung hình và sử dụng thông tin đó để đo lường thời gian khung hình GPU.

Ảnh chụp màn hình của Vertex Instructions (Hướng dẫn đỉnh)/Second track (Đường dẫn thứ hai).
Hình 20. Bảng điều khiển Vertex Instructions / Second (Hướng dẫn đỉnh/giây).

Các kênh khác này có thể cung cấp thông tin tương tự:

  • Số đỉnh được tô bóng / giây
  • Số mảnh được tô bóng / giây
  • % Thời gian tô bóng đỉnh
  • % Thời gian tô bóng mảnh