Một GPU pass dài có thể bị ảnh hưởng bởi nhiều draw call nhỏ không?

Tóm tắt

Câu trả lời là có thể, nhưng không phải lúc nào cũng đúng: một GPU pass kéo dài có thể chịu ảnh hưởng của nhiều draw call nhỏ lẻ, đồng thời cũng có thể đến từ chính khối lượng xử lý nặng bên trong pass đó. Chi phí gửi từng công việc nhỏ và thời gian thực thi trên phần cứng là hai nguồn tốn thời gian khác nhau, và chỉ bản ghi chi tiết mới cho biết nguồn nào chiếm phần lớn. Vì vậy, không nên đồng nhất pass dài với số lượng draw call khi chưa đối chiếu nhóm sự kiện trong bản ghi.

Điểm chính

  1. Một pass dài có hai ứng viên gây chậm: chi phí gửi nhiều công việc nhỏ và thời gian thực thi nặng trên GPU.
  2. Số lượng draw call cao gợi ý chi phí gửi lệnh, nhưng bản ghi chi tiết mới xác nhận được nguyên nhân thực sự.
  3. Lệnh thống kê của Unreal Engine giúp đối chiếu phía CPU trước khi đào sâu bản ghi phía GPU.
  4. Nhóm sự kiện trong Radeon GPU Profiler cho biết thời gian phân bổ ở đâu thay vì nhìn vào tổng thời lượng pass.
  5. Mọi kết luận phải gắn với cảnh đo, API và phiên bản công cụ cụ thể, không suy rộng thành quy luật chung.

Hai nguồn tốn thời gian trong một pass

Mỗi draw call nhỏ đều kèm một khoản chi phí gửi việc từ phía CPU xuống hàng đợi của GPU, và khi số lượng lệnh tăng lên thì tổng chi phí này có thể trở nên đáng kể. Song song với đó, bản thân pass có thể chứa các phép tính nặng như đổ bóng phức tạp hay xử lý độ phân giải cao, khiến thời gian thực thi trên phần cứng kéo dài dù số lệnh không nhiều. Hai nguồn này cộng dồn trong cùng một khoảng thời gian của pass nên nhìn từ bên ngoài chỉ thấy một con số tổng dài. [1]

Vì hai nguồn tốn thời gian trộn lẫn trong tổng thời lượng, việc đoán nguyên nhân chỉ dựa vào số lượng draw là không đủ. Một pass có hàng trăm draw nhỏ có thể chậm vì chi phí gửi lệnh, nhưng cũng có pass chỉ vài draw mà vẫn dài vì mỗi draw xử lý khối lượng điểm ảnh lớn. Chỉ khi tách được thời gian gửi việc khỏi thời gian thực thi thì chẩn đoán mới chính xác.

Đối chiếu phía CPU bằng lệnh thống kê

Trước khi mở bản ghi GPU, hãy dùng lệnh thống kê của Unreal Engine để xem phía CPU có dấu hiệu quá tải khi gửi lệnh hay không. Nếu các chỉ số phía CPU cho thấy thời gian chuẩn bị lệnh tăng cao theo số lượng draw, nghi vấn chi phí gửi việc sẽ mạnh lên. Ngược lại, nếu phía CPU vẫn nhẹ nhàng mà pass trên GPU vẫn dài, nghi vấn sẽ hướng sang khối lượng thực thi phía phần cứng. [2]

Illustration: Đối chiếu phía CPU bằng lệnh thống Decorative illustration for the section "Đối chiếu phía CPU bằng lệnh thống"; visual only, carries no data.

Bước đối chiếu này giúp khoanh vùng đúng lớp trước khi đào sâu, tránh việc tối ưu nhầm chỗ. Giảm số draw khi vấn đề thực sự nằm ở shader nặng sẽ không cải thiện bao nhiêu, cũng như tối ưu shader khi vấn đề nằm ở chi phí gửi lệnh cũng vậy. Mỗi hướng tối ưu chỉ hiệu quả khi nhắm đúng nguồn tốn thời gian đã được số liệu chỉ ra.

Đọc nhóm sự kiện trong bản ghi GPU

Trong Radeon GPU Profiler, mỗi pass được chia thành các nhóm sự kiện với thời gian riêng, cho phép nhìn thấy thời gian nằm ở khâu nào thay vì chỉ thấy tổng thời lượng. Hãy so sánh thời gian của các nhóm con với nhau: nhóm nào chiếm phần lớn thì đó là ứng viên cần xử lý trước. Cách đọc này biến một pass dài trừu tượng thành danh sách cụ thể các khâu tốn thời gian có thể kiểm chứng. [1]

Khi đọc, chú ý so sánh các bản ghi trong cùng điều kiện đo: cùng cảnh, cùng thiết lập chất lượng và cùng phiên bản phần mềm. Một pass dài trong cảnh nhiều chi tiết chưa chắc đã dài trong cảnh đơn giản, nên mọi so sánh khác cảnh đều dễ gây hiểu lầm. Ghi lại đầy đủ bối cảnh đo để người đọc sau có thể lặp lại và kiểm tra kết luận của bạn.

Sai lầm cần tránh khi diễn giải

Sai lầm phổ biến nhất là thấy pass dài và nhiều draw nhỏ rồi kết luận ngay rằng draw là thủ phạm, mà bỏ qua khả năng shader hoặc băng thông mới là nguyên nhân chính. Sai lầm ngược lại là cho rằng gom draw luôn vô ích vì từng gặp một pass dài do shader nặng. Cả hai đều là suy rộng từ một trường hợp riêng lẻ thành quy luật chung, trong khi mỗi cảnh và mỗi pass có hồ sơ chi phí riêng.

Illustration: Sai lầm cần tránh khi diễn Decorative illustration for the section "Sai lầm cần tránh khi diễn"; visual only, carries no data.

Sau khi đã nắm cách đọc bản ghi pass và draw, nếu muốn chuyển sang nội dung thể thao giải trí, bạn có thể mở Nơi xem trận đấu bóng đá mới nhất trực tuyến; trang này phục vụ nhu cầu xem nội dung thể thao trực tiếp, không phải tài liệu kỹ thuật để xác minh hiệu năng đồ họa.

Trình tự chẩn đoán gọn nhẹ

Một trình tự gọn nhẹ gồm bốn bước: ghi lại cảnh đo và điều kiện phiên bản, dùng lệnh thống kê để kiểm tra phía CPU, mở bản ghi GPU để xem nhóm sự kiện nào chiếm thời gian, rồi mới quyết định hướng tối ưu. Mỗi bước đều để lại số liệu có thể kiểm chứng thay vì cảm nhận chủ quan. Chỉ khi cả chuỗi đều hướng về cùng một nguyên nhân thì kết luận mới đủ vững. [2] [1]

Khi trình bày kết quả, nêu rõ đây là phát hiện trên một cấu hình và một cảnh cụ thể. Cách viết này giúp người đọc khác biết cần lặp lại phép đo trên hệ thống của họ trước khi áp dụng bất kỳ thay đổi nào, thay vì coi đó là công thức chung cho mọi dự án.

Nguồn tham khảo

  1. AMD GPUOpen — Radeon GPU Profiler
  2. Epic Games — Stat Commands in Unreal Engine

Câu hỏi thường gặp

Nhiều draw call nhỏ có luôn làm pass dài ra không?

Không hẳn. Nhiều draw nhỏ làm tăng chi phí gửi lệnh, nhưng pass cũng có thể dài vì shader nặng hay khối lượng điểm ảnh lớn dù số draw ít. Cần bản ghi chi tiết để xác định nguồn nào chiếm phần lớn thời gian.

Nên kiểm tra phía CPU trước hay mở bản ghi GPU ngay?

Nên kiểm tra phía CPU bằng lệnh thống kê của Unreal Engine trước để khoanh vùng. Nếu phía CPU nhẹ mà pass vẫn dài thì nghi vấn hướng sang phần cứng, lúc đó mới đào sâu bản ghi GPU để xem nhóm sự kiện nào tốn thời gian.

Đọc nhóm sự kiện trong bản ghi thế nào?

Mỗi pass được chia thành các nhóm sự kiện có thời gian riêng. So sánh thời gian các nhóm con với nhau để biết khâu nào chiếm phần lớn, thay vì chỉ nhìn tổng thời lượng của cả pass.

Vì sao phải ghi lại bối cảnh đo?

Vì kết quả phụ thuộc vào cảnh, thiết lập chất lượng, API và phiên bản công cụ. Thiếu bối cảnh thì con số không thể lặp lại hay so sánh được, và mọi kết luận rút ra đều thiếu cơ sở kiểm chứng.