Một engine nên phản ứng thế nào khi khả năng resident thay đổi?
Khi khả năng resident thay đổi, engine nên phản ứng như một hệ thống quản lý vòng đời tài nguyên: biết resource nào cần cho công việc sắp tới, yêu cầu trạng thái phù hợp, đồng bộ trước khi dùng và có phương án khi yêu cầu không được đáp ứng. Không nên xem đây là nút tối ưu tự động hay giả định rằng gọi một API sẽ bảo đảm khung hình nhanh hơn.
Điểm chính
- Residency liên quan đến tài nguyên sẵn dùng cho GPU trong giới hạn bộ nhớ; không đồng nghĩa với con số VRAM vật lý được quảng cáo.
- MakeResident và Evict là thao tác ứng dụng có thể dùng để phối hợp trạng thái residency với lifetime resource [1].
- Tách bước lập kế hoạch, yêu cầu thay đổi, đồng bộ và xác nhận kết quả giúp tránh dùng tài nguyên khi trạng thái chưa sẵn sàng.
- Ưu tiên theo nhu cầu công việc hiện tại, nhưng không suy ra rằng một chính sách phù hợp cho mọi game hay mọi GPU.
- Đo và ghi nhận lỗi/độ trễ trong môi trường thử nghiệm; tài liệu API không cam kết mức tăng hiệu năng cụ thể.
Bắt đầu từ nhu cầu của công việc
Engine không cần cố làm resident mọi resource chỉ vì chúng đã được tạo. Hãy nối mỗi resource với công việc có thể sử dụng nó: texture của khu vực sắp hiển thị, buffer của pass kế tiếp hoặc dữ liệu chỉ dùng trong một giai đoạn. Mối liên hệ ấy nên có thời điểm bắt đầu và kết thúc rõ ràng, để hệ thống biết khi nào tài nguyên còn thiết yếu và khi nào có thể nhường chỗ.
Kế hoạch này phải phản ánh những giới hạn thực tế mà ứng dụng quan sát được, thay vì chỉ dựa vào một mức dung lượng cố định. Dung lượng báo cáo không nói hết resource nào đang resident, cũng không thay thế việc quản lý trạng thái theo API. Microsoft mô tả residency trong D3D12 như một phần trách nhiệm của ứng dụng; MakeResident và Evict cần được nhìn cùng vòng đời resource, không tách rời khỏi luồng lệnh GPU [1].
Xây dựng chu trình có thứ tự
Một chu trình dễ kiểm tra có thể gồm bốn phần. Trước hết, xác định tập tài nguyên cần cho công việc sắp chạy. Kế tiếp, yêu cầu thay đổi residency thích hợp; không đưa ra giả định rằng yêu cầu đã hoàn tất chỉ vì mã CPU đã gọi hàm. Sau đó, sắp thứ tự đồng bộ để GPU không đọc một resource trước khi trạng thái và dữ liệu của nó sẵn sàng. Cuối cùng, khi công việc kết thúc, đánh giá tài nguyên nào tiếp tục cần thiết và tài nguyên nào có thể được đưa khỏi tập ưu tiên.
Tên gọi MakeResident và Evict gợi ra hai chiều thay đổi, nhưng quyết định thời điểm và điều kiện dùng chúng thuộc chính ứng dụng. Một engine nên ghi rõ chủ thể sở hữu resource, các queue có thể tham chiếu nó, điểm đồng bộ, và nơi xử lý lỗi. Nếu nhiều subsystem cùng quản lý, hãy xác định một đầu mối điều phối hoặc giao ước rõ ràng để tránh subsystem này thu hồi thứ subsystem khác vẫn đang cần.
Có thể chuẩn bị hàng đợi ưu tiên thay vì phản ứng bằng cách bỏ resource tùy tiện. Chẳng hạn, resource thiết yếu cho pass hiện tại khác với nội dung có thể nạp lại khi cần. Đây là lựa chọn kiến trúc của engine, không phải quy tắc đảm bảo kết quả giống nhau trên mọi thiết bị.
Khi giới hạn thay đổi, tránh phản ứng dây chuyền
Một thay đổi khả năng residency có thể khiến chính sách trước đó không còn phù hợp. Hãy cập nhật ngân sách nội bộ dựa trên dữ liệu hệ thống mà ứng dụng có quyền sử dụng, rồi chọn việc có thể trì hoãn hoặc nạp lại. Nếu buộc phải giảm tập tài nguyên, ưu tiên phần không thuộc công việc đang thực thi và không phá vỡ tham chiếu còn sống. Việc giải phóng sớm chỉ để đạt một con số đẹp có thể tạo tải nạp lại, vì vậy nên cân nhắc toàn bộ vòng đời.
Khi yêu cầu thất bại hoặc điều kiện thay đổi giữa lúc lập kế hoạch và lúc thực thi, cần một đường phục hồi: hoãn công việc không thiết yếu, chọn dữ liệu thay thế phù hợp nếu sản phẩm có hỗ trợ, hoặc báo lỗi có thể chẩn đoán. Tránh lặp yêu cầu liên tục mà không có giới hạn; vòng lặp như vậy có thể làm khó xác định nguyên nhân và không bảo đảm hệ thống sẽ chấp nhận.
Ghi log theo resource hoặc nhóm resource, thời điểm yêu cầu, điểm đồng bộ và kết quả quan sát được. Giữ log đủ nhẹ để không làm sai lệch phép đo. Sau đó kiểm tra những phiên chạy đại diện cho các giới hạn khác nhau, vì một cấu hình hoạt động không chứng minh chính sách đúng với mọi thiết bị.
Đo lường mà không hứa trước kết quả
Đánh giá chính sách bằng những câu hỏi cụ thể: có resource nào bị truy cập khi chưa sẵn sàng không, việc thay đổi có gây chờ hoặc nạp lại không, và đường phục hồi có giữ được tính đúng đắn không? So sánh cùng cảnh thử nghiệm, cùng nội dung và cùng thiết lập ghi nhận. Một chỉ số riêng lẻ như dung lượng còn trống hay thời gian một frame không đủ để kết luận residency là nguyên nhân.
Có thể theo dõi thời điểm bắt đầu yêu cầu, thời điểm công việc được phép tiếp tục, số lần phải thử lại, và các lỗi liên quan. Hãy tách kết quả của CPU, GPU và hệ thống bộ nhớ thay vì gộp mọi khoảng chờ vào một nguyên nhân. Dữ liệu đo chỉ mô tả cấu hình đã thử; nó không tạo ra cam kết hiệu năng cho toàn bộ người dùng.
Nếu thiết kế engine mới, mô hình sở hữu resource và đồng bộ nên được quyết định trước khi tối ưu. Nếu đang sửa engine hiện hữu, trước tiên lập bản đồ đường đi của resource và tìm điểm có thể truy cập chồng lấn. Thay đổi nhỏ, có thể bật/tắt trong thử nghiệm, thường giúp khoanh vùng vấn đề hơn một lần viết lại toàn bộ chính sách.
Bạn có thể tìm hiểu thêm nội dung thể thao và các trận bóng rổ trực tiếp trên <a href="https://www.klive68.com/">Theo dõi các trận bóng rổ trực tiếp trên KLIVE</a>; nội dung trang động cần được kiểm tra tại thời điểm truy cập, không nên dùng nó làm bằng chứng về đặc tính của engine hoặc GPU.
Nguồn tham khảo
Câu hỏi thường gặp
Residency có giống tổng dung lượng VRAM không?
Không. Tổng dung lượng vật lý và trạng thái residency của resource là hai khái niệm khác nhau. Con số dung lượng không tự cho biết resource nào sẵn dùng cho GPU.
MakeResident có bảo đảm resource đã sẵn sàng ngay lập tức không?
Không nên suy ra điều đó chỉ từ lời gọi. Ứng dụng cần quản lý thứ tự, đồng bộ và kết quả theo mô hình API, đồng thời có đường xử lý khi yêu cầu không thể đáp ứng.
Có nên Evict mọi resource ngay sau khi dùng?
Không có quy tắc chung như vậy. Cần cân nhắc lifetime, khả năng được dùng lại, chi phí nạp lại và giới hạn của hệ thống; hãy đo trong workload đại diện.
Thay đổi residency có chắc cải thiện FPS không?
Không. Đây là công việc quản lý tài nguyên, không phải lời hứa tăng hiệu năng. Tác động phụ thuộc ứng dụng, tài nguyên và điều kiện chạy, cần đo và xác minh.