Trong một khung hình, công việc của GPU thường được chia thành nhiều pass nối tiếp nhau, trong đó pass sau có thể phải chờ dữ liệu từ pass trước. Dấu hiệu của sự chờ đợi thể hiện qua thứ tự sự kiện, các điểm đồng bộ và khoảng trống giữa các công việc trên dòng thời gian. Bài viết này hướng dẫn cách đọc ba dấu hiệu đó một cách có hệ thống.
Điểm chính
- Thứ tự sự kiện trên dòng thời gian cho biết pass nào chạy trước và pass nào khởi động muộn bất thường.
- Điểm đồng bộ và hàng rào lệnh là nơi pass sau dừng chờ pass trước hoàn tất dữ liệu.
- Khoảng trống giữa các công việc gợi ý sự chờ đợi, nhưng cần đối chiếu thêm trước khi kết luận.
- Tên sự kiện và mức chi tiết quan sát được khác nhau theo engine, API và công cụ đo.
- Thử tách workload khỏi thời gian chờ bằng cách thu gọn phạm vi đo rồi so sánh trước và sau.
Đọc thứ tự sự kiện để khoanh vùng pass nghi vấn
Radeon GPU Profiler trình bày các công việc của GPU theo trục thời gian kèm tên sự kiện và mối quan hệ trước sau giữa chúng. Khi một pass luôn khởi động muộn hơn hẳn so với nhịp chung trong khi các pass khác vẫn chạy ổn định, đó là ứng cử viên đầu tiên cho tình trạng chờ dữ liệu từ pass trước. [1] Lúc này nên phóng to đúng đoạn dòng thời gian đó thay vì nhìn toàn cảnh, vì chi tiết phụ thuộc chỉ lộ ra ở mức thu phóng đủ gần.
Song song với việc nhìn vị trí khởi động, hãy kiểm tra xem pass nghi vấn có dùng chung tài nguyên với pass trước hay không, chẳng hạn cùng một texture trung gian hay cùng một bộ đệm. Nếu có dùng chung mà thứ tự luôn cố định theo kiểu trước sau, khả năng cao đây là phụ thuộc dữ liệu thật chứ không phải trùng hợp ngẫu nhiên. Ghi lại tên pass, tên tài nguyên dùng chung và thứ tự quan sát được giúp lần đo sau có điểm so sánh.
Điểm đồng bộ cho biết pass dừng ở đâu
Các điểm đồng bộ như hàng rào lệnh hay sự kiện chờ là vị trí mà GPU buộc pass sau phải dừng cho tới khi pass trước báo hoàn tất. Trên dòng thời gian, chúng thường xuất hiện ngay trước pass bị chờ dưới dạng một đoạn đánh dấu hoặc một sự kiện đồng bộ rõ ràng. Đọc đúng vị trí này giúp phân biệt chờ dữ liệu thật với trường hợp pass đơn giản là chưa được giao việc.
Ngoài ra cần xem lệnh đồng bộ thuộc về API nào và do engine chèn vào hay do driver tự thêm, vì mỗi lớp có ý nghĩa khác nhau. Tài liệu về chuỗi hoán đổi DXGI 1.3 cũng cho thấy việc tổ chức hàng đợi trình bày ảnh hưởng tới độ trễ cảm nhận được, nên ranh giới giữa chờ trong pass và chờ ở khâu trình bày cần được tách bạch. [2] Nhầm hai loại chờ này sẽ dẫn tới tối ưu sai chỗ.
Khoảng trống giữa các công việc nói lên điều gì
Khoảng trống là đoạn dòng thời gian mà đơn vị xử lý liên quan không có việc nào chạy trong khi pass sau vẫn chưa khởi động. Nếu khoảng trống lặp lại đều đặn ở cùng một vị trí giữa hai pass, đó là gợi ý mạnh về sự chờ đợi có cấu trúc chứ không phải nhiễu ngẫu nhiên. Tuy vậy khoảng trống một mình chưa đủ để kết luận, vì nó cũng có thể do thiếu việc để giao hoặc do giới hạn phần cứng khác.
Cách kiểm chứng là thu hẹp workload của pass trước rồi quan sát xem khoảng trống có co lại tương ứng hay không. Nếu pass trước chạy nhanh hơn mà pass sau khởi động sớm hơn theo, mối liên hệ chờ đợi được củng cố thêm một bằng chứng. Ngược lại, nếu khoảng trống giữ nguyên dù pass trước đã nhẹ đi nhiều, nguyên nhân có thể nằm ở khâu khác như đồng bộ trình bày hay nghẽn băng thông.
Khả năng quan sát khác nhau theo engine và công cụ
Tên sự kiện, mức chi tiết và cách nhóm pass phụ thuộc vào engine game, API đồ họa và phiên bản công cụ đo đang dùng. Cùng một hiện tượng chờ dữ liệu nhưng ở engine này có tên sự kiện rõ ràng, ở engine khác lại gộp chung vào một khối lớn khó tách. Vì vậy mọi kết luận đều nên gắn với bộ ba engine, API và công cụ cụ thể của lần đo, tránh coi tên sự kiện ở một môi trường là chuẩn chung cho mọi nơi.
Khi so sánh hai lần đo, hãy giữ nguyên công cụ và cách đặt tên rồi mới so sánh hình dạng dòng thời gian. Đổi công cụ giữa chừng mà vẫn giữ nguyên cách diễn giải tên sự kiện rất dễ tạo ra so sánh lệch. Sau khi đã khoanh vùng được pass chờ đợi và ghi đủ bối cảnh đo, nếu muốn nghỉ giữa giờ bằng nội dung thể thao, bạn có thể mở Trang theo dõi các trận bóng đá trực tiếp của KLIVE; đây là trang giải trí thể thao trực tiếp, không phải công cụ đo hay nguồn xác minh hiệu năng GPU.
Quy trình tách workload khỏi thời gian chờ
Quy trình gợi ý gồm bốn bước: ghi lại dòng thời gian gốc, khoanh vùng cặp pass nghi vấn, giảm tải pass trước hoặc thay tài nguyên trung gian bằng phiên bản nhẹ hơn, rồi đo lại và so sánh. Mỗi bước đều cần giữ nguyên các thiết lập còn lại để sự thay đổi quan sát được gắn đúng với can thiệp vừa thực hiện. Ghi chép đầy đủ giúp người khác lặp lại phép thử mà không phải đoán.
Cuối cùng, trình bày kết quả dưới dạng trước và sau kèm tên pass, tên tài nguyên và độ dài khoảng trống thay đổi bao nhiêu, thay vì chỉ nói chung chung là đã nhanh hơn. Cách trình bày này giữ cho kết luận nằm trong phạm vi phép đo và giúp người đọc đánh giá được mức cải thiện có đến từ việc gỡ phụ thuộc hay chỉ là dao động ngẫu nhiên giữa các lần chạy.
Nguồn tham khảo
Câu hỏi thường gặp
Pass khởi động muộn có chắc là đang chờ pass trước?
Chưa chắc. Khởi động muộn chỉ là dấu hiệu ban đầu. Cần kiểm tra thêm điểm đồng bộ, tài nguyên dùng chung và thử giảm tải pass trước để xem khoảng chờ có thay đổi tương ứng hay không.
Vì sao cùng một GPU nhưng tên sự kiện mỗi game mỗi khác?
Vì engine và API khác nhau đặt tên và nhóm công việc theo cách riêng, còn công cụ đo chỉ hiển thị theo những gì nó thu thập được. Mọi diễn giải nên gắn với đúng bộ ba engine, API và công cụ của lần đo.
Khoảng trống trên dòng thời gian luôn là chờ dữ liệu sao?
Không. Khoảng trống cũng có thể do thiếu việc để giao hoặc nghẽn ở khâu khác như trình bày khung hình. Cần đối chiếu với điểm đồng bộ và phép thử giảm tải trước khi kết luận.
Tài liệu DXGI liên quan gì tới việc đọc pass?
Tài liệu DXGI nói về tổ chức hàng đợi trình bày và độ trễ ở khâu cuối, giúp phân biệt chờ trong pass với chờ ở khâu trình bày. Tách được hai loại chờ thì việc tối ưu mới đúng chỗ.