2013-05-10 38 views
7

Tôi đang tìm một cách đáng tin cậy để xác định mức sử dụng bộ nhớ GPU hiện tại tốt nhất là trong C++/C. Tôi đã tìm thấy nhiều cách để lấy sử dụng như các phương pháp sau:Sử dụng bộ nhớ GPU progamatically

  • Direct Draw
  • dxdiag
  • WMI
  • DXGI
  • D3D9

Những phương pháp này không đủ chính xác (nhiều nhất là một trăm megabyte). Tôi đã thử nvapi.h nhưng tôi không thấy bất cứ điều gì mà tôi có thể sử dụng để truy vấn bộ nhớ. Tôi đã suy nghĩ chỉ có các phương pháp được liệt kê ở trên là các lựa chọn duy nhất nhưng sau đó tôi chạy vào một công cụ gọi là GPU-Z cho tôi đọc bộ nhớ chính xác tới megabyte gần nhất ngay cả khi OpenCL chạy gần như đầy tải trên 580GTX của tôi. Tôi có thể xác minh tôi đang ở mức cao nhất trong mức sử dụng bộ nhớ của mình bằng cách phân bổ thêm vài megabyte trước khi OpenCL trả lại mã trả về Object_Allocation fail.

Nhìn vào hàng nhập khẩu từ GPU-Z, tôi thấy không có gì thú vị khác hơn:

kernel32.dll: LoadLibraryA, GetProcAddress, VirtualAlloc, VirtualFree

tôi đoán được LoadLibraryA phải được sử dụng để tải một dll để truy vấn bộ nhớ GPU và cảm biến. Nếu dll này tồn tại, nó tồn tại ở đâu? Tôi đang tìm một giải pháp cho AMD và NVidia nếu có thể (sử dụng các API khác nhau là ok).

+1

"nhất ra một trăm MB của tôi" - những gì được biết đến tài liệu tham khảo tốt mà bạn đang sử dụng? –

+0

Tôi đang sử dụng GPU-Z làm tài liệu tham khảo vì nó mang lại cho tôi độ chính xác mà tôi cần. – roboto1986

+0

Và điều gì mang đến cho bạn sự tự tin rằng GPU-Z đúng nơi những người khác sai? –

Trả lời

9

cudaMemGetInfo (tài liệu here) không yêu cầu gì khác ngoài API thời gian chạy cuda để nhận bộ nhớ miễn phí và bộ nhớ tổng trên thiết bị hiện tại.

Và như Erik đã chỉ ra, có chức năng tương tự trong NVML.

+0

Cảm ơn bạn! Tôi sẽ thử cái này. Tôi sẽ đánh dấu câu trả lời đúng sớm. – roboto1986

+0

Tôi đã thử nó và phương pháp này mang lại cho tôi độ chính xác mà tôi muốn mà không cần phải lắp đặt các sdks khác :) Bây giờ, tôi vẫn không may mắn cho các thẻ ATI. Nếu bạn có một ý tưởng, xin vui lòng cho tôi biết. Khác, tôi có thể chỉ cần đi với phương pháp DX. – roboto1986

1

Kiểm tra chức năng nvmlDeviceGetMemoryInfo trong Thư viện Quản lý NVIDIA https://developer.nvidia.com/nvidia-management-library-nvml:

"Lấy số lượng sử dụng, giải phóng bộ nhớ và tổng sẵn trên thiết bị, tính bằng byte."

Không biết AMD có tương đương hay không.

+0

Cảm ơn thông tin. Tuy nhiên, tôi đã không thể có được một số thiết bị thích hợp bằng cách sử dụng nvmlUnitGetCount() trả về 0 thiết bị. Tôi gọi nvmlInit() và trạng thái trả về thành công và sau đó tôi theo dõi với nvmlUnitGetCount() và trạng thái trả về của nó cũng thành công nhưng nó trả về 0 thiết bị. Ý tưởng nào? – roboto1986

+0

Khi OpenCL cung cấp cho tôi 0 thiết bị/nền tảng, tôi cài đặt lại trình điều khiển hiển thị, thường hoạt động. Khác hơn là tôi không có đề xuất. Lấy làm tiếc. –

1

D3DKMTQueryStatistics là những gì bạn cần.

câu hỏi tương tự đã được yêu cầu ở đây: How to query GPU Usage in DirectX?

+0

Tôi chưa từng thấy điều này trước đây, cảm ơn bạn. Tôi sẽ cần thời gian để kiểm tra nó :) – roboto1986

Các vấn đề liên quan