MakeResident và Evict trong D3D12 giải quyết hai nhu cầu nào?

By admin
Tóm tắt

Trong Direct3D 12, MakeResident và Evict giải quyết hai mặt của việc quản lý tập tài nguyên được giữ sẵn cho GPU: ứng dụng yêu cầu tài nguyên cần dùng trở thành resident, và có thể yêu cầu loại tài nguyên không còn cần khỏi tập đó. Đây không phải hai lệnh tương ứng với “tạo” và “xóa” resource. Hiểu đúng sự khác nhau giúp đọc mã đồ họa và chẩn đoán áp lực bộ nhớ mà không vội kết luận rằng một lần Evict chắc chắn gây khựng hình.

Điểm chínhResource được tạo không đồng nghĩa với việc trạng thái residency đã được xử lý. · MakeResident yêu cầu đưa một hay nhiều đối tượng vào tập resident để GPU có thể sử dụng theo quy trình phù hợp. · Evict yêu cầu loại đối tượng khỏi tập resident; nó không nhất thiết giải phóng chính đối tượng ứng dụng đã tạo. · Residency là một khía cạnh quản lý bộ nhớ GPU, khác với việc cấp phát heap hoặc tạo resource. · Tác động tới khung hình phụ thuộc thời điểm, tải, cách ứng dụng quản lý và hành vi hệ thống; không thể mặc định có hitch.

Residency không đồng nghĩa với cấp phát

Khi ứng dụng tạo một resource trong D3D12, nó mô tả một đối tượng đồ họa như texture, buffer hoặc dữ liệu khác. Resource cần vùng lưu trữ phù hợp, thường liên quan tới heap và các quy tắc cấp phát. Tuy nhiên, việc có đối tượng và có backing allocation không tự trả lời đối tượng đó có đang nằm trong tập resident mà GPU có thể truy cập thuận tiện ở thời điểm cần hay không. Hai câu hỏi này liên quan nhưng không thể gộp thành một.

Residency mô tả khả năng tài nguyên được giữ sẵn trong miền bộ nhớ mà GPU có thể dùng theo cơ chế quản lý của hệ thống. Trên các thiết bị có bộ nhớ chuyên dụng và bộ nhớ hệ thống, chính sách di chuyển hoặc đặt dữ liệu có thể phức tạp; ứng dụng không nên hiểu rằng mọi resource luôn cư trú ở cùng một nơi vật lý. Khái niệm API giúp ứng dụng quản lý tập làm việc phù hợp, nhưng không phải lời hứa về một bố trí phần cứng cố định.

Tài liệu Microsoft Learn về residency trong D3D12 tập trung vào quản lý residency và bộ nhớ GPU ở cấp API; nó không phải hướng dẫn tăng tốc chung cho người dùng hay kết quả benchmark cho một GPU cụ thể [1]. Vì vậy cần gắn mọi nhận định với ứng dụng, hệ điều hành, driver và thiết bị được thử.

MakeResident: chuẩn bị tài nguyên cần sử dụng

MakeResident biểu đạt yêu cầu để một hay nhiều đối tượng trở thành resident. Trong thiết kế ứng dụng, lời gọi này cần gắn với kế hoạch sử dụng tài nguyên: trước khi GPU cần dữ liệu, ứng dụng xác định tập nào phải sẵn sàng và kiểm tra kết quả theo giao diện API. Cách tổ chức hợp lý giúp tránh để tài nguyên quan trọng bị loại khỏi tập đang phục vụ công việc, đồng thời giúp ứng dụng phản ứng đúng khi bộ nhớ bị áp lực.

Illustration: MakeResident Decorative illustration for the section "MakeResident"; visual only, carries no data.

Không nên diễn giải MakeResident như một thao tác đồng bộ đơn giản luôn hoàn tất tức thì. Quản lý residency có thể liên quan đến điều kiện bộ nhớ và trình tự thực thi. Ứng dụng cần làm theo hợp đồng API, xử lý trạng thái hoặc lỗi được trả về và đồng bộ phù hợp với cách sử dụng resource. Việc chỉ gọi hàm mà không xét thời điểm GPU đọc dữ liệu có thể dẫn tới lỗi hoặc hành vi không mong muốn; bản thân tên hàm không thay thế thiết kế vòng đời.

Một tập resource lớn hơn ngân sách khả dụng có thể buộc hệ thống hoặc ứng dụng phải quản lý chặt hơn. Do đó, nên theo dõi kích thước tập làm việc và tránh giữ resident các tài nguyên ít có khả năng được dùng. Tuy nhiên, ngưỡng cụ thể và cách xử lý còn tùy cấu hình, hệ điều hành và thiết bị; không có một con số chung ở đây để áp dụng cho mọi máy.

Evict: bỏ bớt khỏi tập resident, không xóa resource

Evict cho ứng dụng yêu cầu một đối tượng không còn cần thiết ở trạng thái resident. Điều này có thể hữu ích khi tài nguyên được dùng theo từng cảnh, mức chi tiết hoặc giai đoạn, và tập làm việc hiện tại cần nhường chỗ cho phần khác. Nhưng Evict không giống hủy đối tượng: resource vẫn có vòng đời của nó trong ứng dụng, và ứng dụng phải quản lý khi nào nó được cần lại cũng như các bước để đưa nó trở lại trạng thái thích hợp.

Hãy tách ba sự kiện: tạo resource, cấp phát vùng lưu trữ, và thay đổi residency. Một hệ thống có thể có resource được tạo nhưng hiện không resident; ngược lại, thay đổi trạng thái residency không tự động cho biết ứng dụng đã giải phóng allocation hay đóng resource. Phân biệt những khái niệm này đặc biệt hữu ích khi đọc log bộ nhớ, vì nhãn “đã dùng VRAM” có thể nói về loại thống kê khác với tập resident trong API.

Evict không phải cam kết rằng dữ liệu biến mất vĩnh viễn hoặc ứng dụng có thể bỏ qua việc khôi phục trạng thái cần thiết. Nếu chương trình cần tài nguyên đó lần nữa, nó phải tuân theo quy trình residency và đồng bộ được quy định. Thiết kế tốt thường ghi nhận những nhóm tài nguyên ít hoạt động, nhưng vẫn cân nhắc chi phí và thời điểm đưa chúng trở lại thay vì liên tục đẩy ra rồi nạp vào.

Vì sao không thể quy mọi khựng hình cho Evict

Một khung hình chậm có thể bắt nguồn từ nhiều phần của pipeline: CPU chuẩn bị lệnh, GPU thực thi shader, truyền dữ liệu, biên dịch pipeline, đồng bộ hoặc tải tài nguyên. Nếu một sự kiện Evict xuất hiện gần thời điểm khựng, sự trùng hợp thời gian là đầu mối đáng xem chứ chưa đủ để xác lập quan hệ nhân quả. Có thể đồng thời xảy ra nhiều hoạt động khác, và công cụ đo có thể ghi sự kiện ở thời điểm khác với lúc người dùng nhận thấy hình ảnh bị gián đoạn.

Illustration: Vì sao không thể quy mọi khựng hình Decorative illustration for the section "Vì sao không thể quy mọi khựng hình"; visual only, carries no data.

Để điều tra, hãy thu dấu vết theo cùng một kịch bản lặp lại, ghi nhận thời điểm sự kiện residency, hoạt động tải tài nguyên và thời gian khung hình. So sánh khi thay đổi một điều kiện có kiểm soát, chẳng hạn cảnh hoặc tập tài nguyên, đồng thời giữ nguyên các thiết lập khác. Một phép thử duy nhất không chứng minh nguyên nhân; kết luận cần tái hiện và phù hợp với thứ tự sự kiện trong dấu vết.

Cũng cần phân biệt độ trễ thao tác quản lý với hiện tượng hình ảnh bị khựng. Một lời gọi có thể nằm trên đường thực thi nhưng được che bởi công việc khác; ngược lại, tải dữ liệu trở lại có thể ảnh hưởng một kịch bản cụ thể. API mô tả cơ chế và trách nhiệm ứng dụng, không cam kết mọi lệnh Evict gây hitch hoặc mọi cách residency đều miễn phí.

Một quy trình đọc và kiểm tra an toàn

Khi đọc mã, tìm nơi resource được tạo, nơi heap được quản lý, lúc resource được đưa vào tập resident, và nơi nó bị loại ra. Ghi lại mối liên hệ giữa các đối tượng và giai đoạn sử dụng. Sau đó kiểm tra cách xử lý kết quả API và đồng bộ, cùng với việc ứng dụng có yêu cầu một resource sau khi đã evict hay không. Quy trình này làm rõ trách nhiệm của mã thay vì suy ra từ một lệnh đơn lẻ.

Khi phân tích hiệu năng, thu thập dấu vết và bộ đếm phù hợp với công cụ của nhà phát triển, sau đó so sánh nhiều lần chạy. Ghi rõ model GPU, phiên bản driver, hệ điều hành, cấu hình ứng dụng và cảnh thử. Không trộn kết quả từ các thiết bị khác nhau như thể chúng là phép đo trực tiếp cho nhau; ngân sách bộ nhớ và chính sách quản lý thay đổi đáng kể theo nền tảng.

Đối với người xem nội dung trực tuyến, các tên API này chủ yếu có ích để hiểu phần mềm đồ họa ở cấp phát triển, không phải các nút thiết lập cần đổi trong trình duyệt. Khi theo dõi Cùng KLIVE theo dõi các trận đấu quốc tế hôm nay, tài liệu D3D12 không chứng minh dịch vụ này có dùng API hay có vấn đề residency nào. Giữ ranh giới giữa kiến thức API và thông tin về nền tảng là cách tránh tuyên bố quá mức.

Nguồn tham khảo

  1. Microsoft Learn — Residency (Direct3D 12)

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

MakeResident có tạo resource không?

Không. Nó liên quan tới trạng thái residency của các đối tượng đã được quản lý; tạo resource và cấp phát bộ nhớ là các bước, khái niệm riêng.

Evict có xóa resource khỏi ứng dụng không?

Không nhất thiết. Evict yêu cầu loại đối tượng khỏi tập resident; nó không tương đương hủy resource hay giải phóng mọi allocation liên quan.

Mỗi lần Evict có gây hitch không?

Không thể kết luận như vậy. Tác động phụ thuộc cách ứng dụng dùng tài nguyên, thời điểm, tải và nền tảng; cần đo dấu vết để xác định nguyên nhân.

Residency có giống dung lượng VRAM đang cấp phát không?

Không hoàn toàn. Residency, allocation và resource là những khía cạnh liên quan nhưng khác nhau; chỉ số cụ thể cần được diễn giải theo công cụ đo.