如何获取显卡的GPU占用率和显存占用情况

http://blog.csdn.net/paopaoc/article/details/9093125


在游戏的性能调优过程中,经常会需要获取CPU占用率、IO、显卡GPU占用率等基础性能数据,下面就简述一下获取nvdia显卡GPU占用率的方法。 nvdia 显卡在驱动安装后,可以通过nvapi.dll来获取显卡的相关信息。有关nvdia、AMD显卡sdk的相关资料在它们的网站上均有下载,但貌似非注册开发者可获取到的信息有限。

下面提供一个简单封装了的用来获取显卡信息的c++类,由于代码是根据网上可找到的有限资料写成,难免可能存在错误,如有问题欢迎指出。

 

[cpp] view plaincopy
 
  1. // KGpuMon.h  源代码  
  2. #pragma once  
  3.   
  4. #define MAX_GPU_NUM     4L      // 监控的GPU个数(NVIDIA定义的最多GPU个数是64,这里最多只监控4个)  
  5. #define MY_PROCESS_ERROR(Condition) do { if (!(Condition)) goto Exit0; } while (false)  
  6.   
  7. #define MAX_DISPLAY_CARDS               4       // 最多监控4块显卡(暂时应该够了吧)  
  8. // 常量定义  
  9. #define MAX_PHYSICAL_GPUS               64  
  10. #define SHORT_STRING_MAX                64  
  11. #define MAX_THERMAL_SENSORS_PER_GPU     3  
  12. #define MAX_CLOCKS_PER_GPU              0x120  
  13. #define MAX_PSTATES_PER_GPU             8  
  14. #define MAX_USAGES_PER_GPU              33  
  15. #define MAX_COOLER_PER_GPU              20  
  16. #define MAX_MEMORY_VALUES_PER_GPU       5  
  17.   
  18. // 接口ID值  
  19. #define ID_NvAPI_Initialize                     0x0150E828  
  20. #define ID_NvAPI_GPU_GetFullName                0xCEEE8E9F  
  21. #define ID_NvAPI_GPU_GetThermalSettings         0xE3640A56  
  22. #define ID_NvAPI_EnumNvidiaDisplayHandle        0x9ABDD40D  
  23. #define ID_NvAPI_GetPhysicalGPUsFromDisplay     0x34EF9506  
  24. #define ID_NvAPI_EnumPhysicalGPUs               0xE5AC921F  
  25. #define ID_NvAPI_GPU_GetTachReading             0x5F608315  
  26. #define ID_NvAPI_GPU_GetAllClocks               0x1BD69F49  
  27. #define ID_NvAPI_GPU_GetPStates                 0x60DED2ED  
  28. #define ID_NvAPI_GPU_GetUsages                  0x189A1FDF  
  29. #define ID_NvAPI_GPU_GetCoolerSettings          0xDA141340  
  30. #define ID_NvAPI_GPU_SetCoolerLevels            0x891FA0AE  
  31. #define ID_NvAPI_GPU_GetMemoryInfo              0x774AA982  
  32. #define ID_NvAPI_GetDisplayDriverVersion        0xF951A4D1  
  33. #define ID_NvAPI_GetInterfaceVersionString      0x01053FA5  
  34. #define ID_NvAPI_GPU_GetPCIIdentifiers          0x2DDFB66E  
  35.   
  36. // 版本号参数定义  
  37. #define GPU_THERMAL_SETTINGS_VER                (sizeof(NvGPUThermalSettings) | 0x10000)  
  38. #define GPU_CLOCKS_VER                          (sizeof(NvClocks) | 0x20000)  
  39. #define GPU_PSTATES_VER                         (sizeof(NvPStates) | 0x10000)  
  40. #define GPU_USAGES_VER                          (sizeof(NvUsages) | 0x10000)  
  41. #define GPU_COOLER_SETTINGS_VER                 (sizeof(NvGPUCoolerSettings) | 0x20000)  
  42. #define GPU_MEMORY_INFO_VER                     (sizeof(NvMemoryInfo) | 0x20000)  
  43. #define DISPLAY_DRIVER_VERSION_VER              (sizeof(NvDisplayDriverVersion) | 0x10000)  
  44. #define GPU_COOLER_LEVELS_VER                   (sizeof(NvGPUCoolerLevels) | 0x10000)  
  45.   
  46. enum NvStatus  
  47. {  
  48.     enumNvStatus_OK = 0,  
  49.     enumNvStatus_ERROR = -1,  
  50.     enumNvStatus_LIBRARY_NOT_FOUND = -2,  
  51.     enumNvStatus_NO_IMPLEMENTATION = -3,  
  52.     enumNvStatus_API_NOT_INTIALIZED = -4,  
  53.     enumNvStatus_INVALID_ARGUMENT = -5,  
  54.     enumNvStatus_NVIDIA_DEVICE_NOT_FOUND = -6,  
  55.     enumNvStatus_END_ENUMERATION = -7,  
  56.     enumNvStatus_INVALID_HANDLE = -8,  
  57.     enumNvStatus_INCOMPATIBLE_STRUCT_VERSION = -9,  
  58.     enumNvStatus_HANDLE_INVALIDATED = -10,  
  59.     enumNvStatus_OPENGL_CONTEXT_NOT_CURRENT = -11,  
  60.     enumNvStatus_NO_GL_EXPERT = -12,  
  61.     enumNvStatus_INSTRUMENTATION_DISABLED = -13,  
  62.     enumNvStatus_EXPECTED_LOGICAL_GPU_HANDLE = -100,  
  63.     enumNvStatus_EXPECTED_PHYSICAL_GPU_HANDLE = -101,  
  64.     enumNvStatus_EXPECTED_DISPLAY_HANDLE = -102,  
  65.     enumNvStatus_INVALID_COMBINATION = -103,  
  66.     enumNvStatus_NOT_SUPPORTED = -104,  
  67.     enumNvStatus_PORTID_NOT_FOUND = -105,  
  68.     enumNvStatus_EXPECTED_UNATTACHED_DISPLAY_HANDLE = -106,  
  69.     enumNvStatus_INVALID_PERF_LEVEL = -107,  
  70.     enumNvStatus_DEVICE_BUSY = -108,  
  71.     enumNvStatus_NV_PERSIST_FILE_NOT_FOUND = -109,  
  72.     enumNvStatus_PERSIST_DATA_NOT_FOUND = -110,  
  73.     enumNvStatus_EXPECTED_TV_DISPLAY = -111,  
  74.     enumNvStatus_EXPECTED_TV_DISPLAY_ON_DCONNECTOR = -112,  
  75.     enumNvStatus_NO_ACTIVE_SLI_TOPOLOGY = -113,  
  76.     enumNvStatus_SLI_RENDERING_MODE_NOTALLOWED = -114,  
  77.     enumNvStatus_EXPECTED_DIGITAL_FLAT_PANEL = -115,  
  78.     enumNvStatus_ARGUMENT_EXCEED_MAX_SIZE = -116,  
  79.     enumNvStatus_DEVICE_SWITCHING_NOT_ALLOWED = -117,  
  80.     enumNvStatus_TESTING_CLOCKS_NOT_SUPPORTED = -118,  
  81.     enumNvStatus_UNKNOWN_UNDERSCAN_CONFIG = -119,  
  82.     enumNvStatus_TIMEOUT_RECONFIGURING_GPU_TOPO = -120,  
  83.     enumNvStatus_DATA_NOT_FOUND = -121,  
  84.     enumNvStatus_EXPECTED_ANALOG_DISPLAY = -122,  
  85.     enumNvStatus_NO_VIDLINK = -123,  
  86.     enumNvStatus_REQUIRES_REBOOT = -124,  
  87.     enumNvStatus_INVALID_HYBRID_MODE = -125,  
  88.     enumNvStatus_MIXED_TARGET_TYPES = -126,  
  89.     enumNvStatus_SYSWOW64_NOT_SUPPORTED = -127,  
  90.     enumNvStatus_IMPLICIT_SET_GPU_TOPOLOGY_CHANGE_NOT_ALLOWED = -128,  
  91.     enumNvStatus_REQUEST_USER_TO_CLOSE_NON_MIGRATABLE_APPS = -129,  
  92.     enumNvStatus_OUT_OF_MEMORY = -130,  
  93.     enumNvStatus_WAS_STILL_DRAWING = -131,  
  94.     enumNvStatus_FILE_NOT_FOUND = -132,  
  95.     enumNvStatus_TOO_MANY_UNIQUE_STATE_OBJECTS = -133,  
  96.     enumNvStatus_INVALID_CALL = -134,  
  97.     enumNvStatus_D3D10_1_LIBRARY_NOT_FOUND = -135,  
  98.     enumNvStatus_FUNCTION_NOT_FOUND = -136  
  99. };  
  100.   
  101. enum NvThermalController  
  102. {  
  103.     enumNvThermalController_NONE = 0,  
  104.     enumNvThermalController_GPU_INTERNAL,  
  105.     enumNvThermalController_ADM1032,  
  106.     enumNvThermalController_MAX6649,  
  107.     enumNvThermalController_MAX1617,  
  108.     enumNvThermalController_LM99,  
  109.     enumNvThermalController_LM89,  
  110.     enumNvThermalController_LM64,  
  111.     enumNvThermalController_ADT7473,  
  112.     enumNvThermalController_SBMAX6649,  
  113.     enumNvThermalController_VBIOSEVT,  
  114.     enumNvThermalController_OS,  
  115.     enumNvThermalController_UNKNOWN = -1,  
  116. };  
  117.   
  118. enum NvThermalTarget  
  119. {  
  120.     enumNvThermalTarget_NONE = 0,  
  121.     enumNvThermalTarget_GPU = 1,  
  122.     enumNvThermalTarget_MEMORY = 2,  
  123.     enumNvThermalTarget_POWER_SUPPLY = 4,  
  124.     enumNvThermalTarget_BOARD = 8,  
  125.     enumNvThermalTarget_ALL = 15,  
  126.     enumNvThermalTarget_UNKNOWN = -1  
  127. };  
  128.   
  129. typedef struct _NvSensor  
  130. {  
  131.     NvThermalController Controller;  
  132.     unsigned int DefaultMinTemp;  
  133.     unsigned int DefaultMaxTemp;  
  134.     unsigned int CurrentTemp;  
  135.     NvThermalTarget Target;  
  136. }NvSensor;  
  137.   
  138. typedef struct _NvGPUThermalSettings  
  139. {  
  140.     unsigned int Version;  
  141.     unsigned int Count;  
  142.     NvSensor Sensor[MAX_THERMAL_SENSORS_PER_GPU];  
  143. }NvGPUThermalSettings;  
  144.   
  145. typedef struct _NvClocks  
  146. {  
  147.     unsigned int Version;  
  148.     unsigned int Clock[MAX_CLOCKS_PER_GPU];  
  149. }NvClocks;  
  150.   
  151. typedef struct _NvPState  
  152. {  
  153.     bool Present;  
  154.     int Percentage;  
  155. }NvPState;  
  156.   
  157. typedef struct _NvPStates  
  158. {  
  159.     unsigned int Version;  
  160.     unsigned int Flags;  
  161.     NvPState PStates[MAX_PSTATES_PER_GPU];  
  162. }NvPStates;  
  163.   
  164. typedef struct _NvUsages  
  165. {  
  166.     unsigned 再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net
原文地址:https://www.cnblogs.com/skiwnchiwns/p/10137980.html