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

转自:http://blog.csdn.net/pizi0475/article/details/45056605

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

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

[cpp]  view plain copy
  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 int Version;  
  167.     unsigned int Usages[MAX_USAGES_PER_GPU];  
  168. }NvUsages;  
  169.   
  170. typedef struct _NvCooler  
  171. {  
  172.     int Type;  
  173.     int Controller;  
  174.     int DefaultMin;  
  175.     int DefaultMax;  
  176.     int CurrentMin;  
  177.     int CurrentMax;  
  178.     int CurrentLevel;  
  179.     int DefaultPolicy;  
  180.     int CurrentPolicy;  
  181.     int Target;  
  182.     int ControlType;  
  183.     int Active;  
  184. }NvCooler;  
  185.   
  186. typedef struct _NvGPUCoolerSettings  
  187. {  
  188.     unsigned int Version;  
  189.     unsigned int Count;  
  190.     NvCooler Coolers[MAX_COOLER_PER_GPU];  
  191. }NvGPUCoolerSettings;  
  192.   
  193. typedef struct _NvLevel  
  194. {  
  195.     int Level;  
  196.     int Policy;  
  197. }NvLevel;  
  198.   
  199. typedef struct _NvGPUCoolerLevels  
  200. {  
  201.     unsigned int Version;  
  202.     NvLevel Levels[MAX_COOLER_PER_GPU];  
  203. }NvGPUCoolerLevels;  
  204.   
  205. typedef struct _NvMemoryInfo  
  206. {  
  207.     unsigned int Version;  
  208.     unsigned int Values[MAX_MEMORY_VALUES_PER_GPU];  
  209. }NvMemoryInfo;  
  210.   
  211. typedef struct _NvDisplayDriverVersion  
  212. {  
  213.     unsigned int Version;  
  214.     unsigned int DriverVersion;  
  215.     unsigned int BldChangeListNum;      
  216.     char szBuildBranch[SHORT_STRING_MAX];  
  217.     char szAdapter[SHORT_STRING_MAX];  
  218. }NvDisplayDriverVersion;  
  219.   
  220. typedef int NvPhysicalGpuHandle;  
  221. typedef int NvDisplayHandle;  
  222.   
  223. // 函数定义  
  224. typedef void* (*nvapi_QueryInterfaceType)(unsigned int uiInterfaceID);  
  225. typedef NvStatus (*NvAPI_InitializeType)();  
  226. typedef NvStatus (*NvAPI_GPU_GetFullNameType)(const NvPhysicalGpuHandle gpuHandle, char *pszName);  
  227. typedef NvStatus (*NvAPI_GPU_GetThermalSettingsType)(const NvPhysicalGpuHandle gpuHandle, int sensorIndex, NvGPUThermalSettings *pnvGPUThermalSettings);  
  228. typedef NvStatus (*NvAPI_EnumNvidiaDisplayHandleType)(const int thisEnum, NvDisplayHandle *pDisplayHandle);  
  229. typedef NvStatus (*NvAPI_GetPhysicalGPUsFromDisplayType)(const NvDisplayHandle displayHandle, NvPhysicalGpuHandle *pGpuHandles, unsigned int *pGpuCount);  
  230. typedef NvStatus (*NvAPI_EnumPhysicalGPUsType)(NvPhysicalGpuHandle *pGpuHandles, int *pGpuCount);  
  231. typedef NvStatus (*NvAPI_GPU_GetTachReadingType)(const NvPhysicalGpuHandle gpuHandle, int *pnValue);  
  232. typedef NvStatus (*NvAPI_GPU_GetAllClocksType)(const NvPhysicalGpuHandle gpuHandle, NvClocks *pnvClocks);  
  233. typedef NvStatus (*NvAPI_GPU_GetPStatesType)(const NvPhysicalGpuHandle gpuHandle, NvPStates *pnvPStates);  
  234. typedef NvStatus (*NvAPI_GPU_GetUsagesType)(const NvPhysicalGpuHandle gpuHandle, NvUsages *pnvUsages);  
  235. typedef NvStatus (*NvAPI_GPU_GetCoolerSettingsType)(const NvPhysicalGpuHandle gpuHandle, int coolerIndex, NvGPUCoolerSettings *pnvGPUCoolerSettings);  
  236. typedef NvStatus (*NvAPI_GPU_SetCoolerLevelsType)(const NvPhysicalGpuHandle gpuHandle, int coolerIndex, NvGPUCoolerLevels *pnvGPUCoolerLevels);  
  237. typedef NvStatus (*NvAPI_GPU_GetMemoryInfoType)(const NvDisplayHandle displayHandle, NvMemoryInfo *pnvMemoryInfo);  
  238. typedef NvStatus (*NvAPI_GetDisplayDriverVersionType)(const NvDisplayHandle displayHandle, NvDisplayDriverVersion *pnvDisplayDriverVersion);  
  239. typedef NvStatus (*NvAPI_GetInterfaceVersionStringType)(char *pszVersion);  
  240. typedef NvStatus (*NvAPI_GPU_GetPCIIdentifiersType)(  
  241.     const NvPhysicalGpuHandle gpuHandle,   
  242.     unsigned int *puiDeviceId,   
  243.     unsigned int *puiSubSystemId,   
  244.     unsigned int *puiRevisionId,   
  245.     unsigned int *puiExtDeviceId  
  246.     );  
  247.   
  248. //*****************************以下是类内部使用的结构体************************************//  
  249. /* 
  250. * @brief GPU信息 
  251. */  
  252. typedef struct _GPU_INFO  
  253. {  
  254.     NvPhysicalGpuHandle     nvGpuHandle;        // GPU句柄  
  255.     int                     nUsage;             // GPU占用率  
  256. }GPU_INFO;  
  257.   
  258. /* 
  259. * @brief 显卡信息 
  260. */  
  261. typedef struct _DISPLAY_CARD_INFO  
  262. {  
  263.     NvDisplayHandle nvDisplayHandle;            // 显卡句柄  
  264.     int             nGpuCount;                  // Gpu个数  
  265.     DWORD           dwTotalMemory;              // 总显存大小(KB)  
  266.     DWORD           dwFreeMemory;               // 空闲显存大小(KB)  
  267.   
  268.     GPU_INFO        sGpuInfo[MAX_GPU_NUM];      // GPU信息  
  269. }DISPLAY_CARD_INFO;  
  270. //*****************************************************************************************//  
  271.   
  272. /* 
  273. * @brief 显卡相关信息(可用于导出的结构体) 
  274. */  
  275. typedef struct _DISPLAY_INFO  
  276. {  
  277.     int         nGpuCount;                  // Gpu个数  
  278.     int         nGpuUsages[MAX_GPU_NUM];    // Gpu占用率  
  279.     DWORD       dwTotalMemory;              // 总显存大小(KB)  
  280.     DWORD       dwFreeMemory;               // 空闲显存大小(KB)  
  281. }DISPLAY_INFO;  
  282.   
  283. class KGpuMon  
  284. {  
  285. public:  
  286.     KGpuMon(void);  
  287.     ~KGpuMon(void);  
  288.   
  289.     BOOL Init();  
  290.     BOOL Unit();  
  291.   
  292.     int GetDisplayCardCount();  
  293.     BOOL GetDisplayInfo(const int nCardIndex, DISPLAY_INFO *pDisplayInfo);  
  294. private:  
  295.     int     EnumDisplayCards();  
  296.     BOOL    GetGpuHandles(const NvDisplayHandle nvDisplayHandle, DISPLAY_CARD_INFO *pCardInfo);  
  297.   
  298.     BOOL    GetDisplayCardGpuUsages(const NvDisplayHandle nvDisplayHandle, DISPLAY_CARD_INFO *pCardInfo);  
  299.     BOOL    GetDisplayCardMemoryInfo(const NvDisplayHandle nvDisplayHandle, DISPLAY_CARD_INFO *pCardInfo);  
  300. private:  
  301.     nvapi_QueryInterfaceType m_pfnNvapi_QueryInterface;  
  302.     NvAPI_InitializeType m_pfnNvAPI_Initialize;  
  303.     NvAPI_GPU_GetFullNameType m_pfnNvAPI_GPU_GetFullName;  
  304.     NvAPI_GPU_GetThermalSettingsType m_pfnNvAPI_GPU_GetThermalSettings;  
  305.     NvAPI_EnumNvidiaDisplayHandleType m_pfnNvAPI_EnumNvidiaDisplayHandle;  
  306.     NvAPI_GetPhysicalGPUsFromDisplayType m_pfnNvAPI_GetPhysicalGPUsFromDisplay;  
  307.     NvAPI_EnumPhysicalGPUsType m_pfnNvAPI_EnumPhysicalGPUs;  
  308.     NvAPI_GPU_GetTachReadingType m_pfnNvAPI_GPU_GetTachReading;  
  309.     NvAPI_GPU_GetAllClocksType m_pfnNvAPI_GPU_GetAllClocks;  
  310.     NvAPI_GPU_GetPStatesType m_pfnNvAPI_GPU_GetPStates;  
  311.     NvAPI_GPU_GetUsagesType m_pfnNvAPI_GPU_GetUsages;  
  312.     NvAPI_GPU_GetCoolerSettingsType m_pfnNvAPI_GPU_GetCoolerSettings;  
  313.     NvAPI_GPU_SetCoolerLevelsType m_pfnNvAPI_GPU_SetCoolerLevels;  
  314.     NvAPI_GPU_GetMemoryInfoType m_pfnNvAPI_GPU_GetMemoryInfo;  
  315.     NvAPI_GetDisplayDriverVersionType m_pfnNvAPI_GetDisplayDriverVersion;  
  316.     NvAPI_GetInterfaceVersionStringType m_pfnNvAPI_GetInterfaceVersionString;  
  317.     NvAPI_GPU_GetPCIIdentifiersType m_pfnNvAPI_GPU_GetPCIIdentifiers;  
  318.   
  319.       
  320.     int                 m_nDisplayCardCount;  
  321.     DISPLAY_CARD_INFO*  m_pDisplayCards;  
  322.     HMODULE             m_hNvApiDll;  
  323. };  
  324.   
  325.   
  326. //**************************************************************************************************/  
  327. // KGpuMon.cpp 源代码  
  328. #include "StdAfx.h"  
  329. #include "KGpuMon.h"  
  330.   
  331. KGpuMon::KGpuMon(void)  
  332. {  
  333.     m_hNvApiDll = NULL;  
  334.     m_nDisplayCardCount = 0;  
  335.     m_pDisplayCards = NULL;  
  336. }  
  337.   
  338. KGpuMon::~KGpuMon(void)  
  339. {  
  340.     Unit();  
  341. }  
  342.   
  343. BOOL KGpuMon::Init()  
  344. {  
  345.     BOOL bResult = FALSE;  
  346.     BOOL bRetCode = FALSE;  
  347.   
  348.     int nIndex = 0;  
  349.     int nResult = 0;  
  350.   
  351.     m_hNvApiDll = LoadLibrary(_T("nvapi.dll"));  
  352.     if (m_hNvApiDll)  
  353.     {  
  354.         m_pfnNvapi_QueryInterface = (nvapi_QueryInterfaceType)GetProcAddress(m_hNvApiDll, "nvapi_QueryInterface");  
  355.         if (m_pfnNvapi_QueryInterface)  
  356.         {  
  357.             m_pfnNvAPI_Initialize = (NvAPI_InitializeType)m_pfnNvapi_QueryInterface(ID_NvAPI_Initialize);  
  358.             m_pfnNvAPI_GPU_GetFullName = (NvAPI_GPU_GetFullNameType)m_pfnNvapi_QueryInterface(ID_NvAPI_GPU_GetFullName);  
  359.             m_pfnNvAPI_GPU_GetThermalSettings = (NvAPI_GPU_GetThermalSettingsType)m_pfnNvapi_QueryInterface(ID_NvAPI_GPU_GetThermalSettings);  
  360.             m_pfnNvAPI_EnumNvidiaDisplayHandle = (NvAPI_EnumNvidiaDisplayHandleType)m_pfnNvapi_QueryInterface(ID_NvAPI_EnumNvidiaDisplayHandle);  
  361.             m_pfnNvAPI_GetPhysicalGPUsFromDisplay = (NvAPI_GetPhysicalGPUsFromDisplayType)m_pfnNvapi_QueryInterface(ID_NvAPI_GetPhysicalGPUsFromDisplay);  
  362.             m_pfnNvAPI_EnumPhysicalGPUs = (NvAPI_EnumPhysicalGPUsType)m_pfnNvapi_QueryInterface(ID_NvAPI_EnumPhysicalGPUs);  
  363.             m_pfnNvAPI_GPU_GetTachReading = (NvAPI_GPU_GetTachReadingType)m_pfnNvapi_QueryInterface(ID_NvAPI_GPU_GetTachReading);  
  364.             m_pfnNvAPI_GPU_GetAllClocks = (NvAPI_GPU_GetAllClocksType)m_pfnNvapi_QueryInterface(ID_NvAPI_GPU_GetAllClocks);  
  365.             m_pfnNvAPI_GPU_GetPStates = (NvAPI_GPU_GetPStatesType)m_pfnNvapi_QueryInterface(ID_NvAPI_GPU_GetPStates);  
  366.             m_pfnNvAPI_GPU_GetUsages = (NvAPI_GPU_GetUsagesType)m_pfnNvapi_QueryInterface(ID_NvAPI_GPU_GetUsages);  
  367.             m_pfnNvAPI_GPU_GetCoolerSettings = (NvAPI_GPU_GetCoolerSettingsType)m_pfnNvapi_QueryInterface(ID_NvAPI_GPU_GetCoolerSettings);  
  368.             m_pfnNvAPI_GPU_SetCoolerLevels = (NvAPI_GPU_SetCoolerLevelsType)m_pfnNvapi_QueryInterface(ID_NvAPI_GPU_SetCoolerLevels);  
  369.             m_pfnNvAPI_GPU_GetMemoryInfo = (NvAPI_GPU_GetMemoryInfoType)m_pfnNvapi_QueryInterface(ID_NvAPI_GPU_GetMemoryInfo);  
  370.             m_pfnNvAPI_GetDisplayDriverVersion = (NvAPI_GetDisplayDriverVersionType)m_pfnNvapi_QueryInterface(ID_NvAPI_GetDisplayDriverVersion);  
  371.             m_pfnNvAPI_GetInterfaceVersionString = (NvAPI_GetInterfaceVersionStringType)m_pfnNvapi_QueryInterface(ID_NvAPI_GetInterfaceVersionString);  
  372.             m_pfnNvAPI_GPU_GetPCIIdentifiers = (NvAPI_GPU_GetPCIIdentifiersType)m_pfnNvapi_QueryInterface(ID_NvAPI_GPU_GetPCIIdentifiers);  
  373.   
  374.             if (m_pfnNvAPI_Initialize)  
  375.             {  
  376.                 nResult = m_pfnNvAPI_Initialize();  
  377.                 if (enumNvStatus_OK == nResult)  
  378.                 {  
  379.                     m_pDisplayCards = new DISPLAY_CARD_INFO[MAX_DISPLAY_CARDS];  
  380.                     ZeroMemory(m_pDisplayCards, MAX_DISPLAY_CARDS * sizeof(DISPLAY_CARD_INFO));  
  381.   
  382.                     // 获取显卡个数  
  383.                     nResult = EnumDisplayCards();  
  384.                     MY_PROCESS_ERROR(nResult > 0);  
  385.   
  386.                     // 获取每块显卡的GPU个数  
  387.                     for (nIndex = 0; nIndex < m_nDisplayCardCount; ++nIndex)  
  388.                     {  
  389.                         bRetCode = GetGpuHandles(m_pDisplayCards[nIndex].nvDisplayHandle, &m_pDisplayCards[nIndex]);  
  390.                         MY_PROCESS_ERROR(bRetCode);  
  391.                     }  
  392.   
  393.                     bResult = TRUE;  
  394.                 }  
  395.             }  
  396.         }  
  397.     }  
  398. Exit0:  
  399.     return bResult;  
  400. }  
  401.   
  402. BOOL KGpuMon::Unit()  
  403. {  
  404.     m_nDisplayCardCount = 0;  
  405.   
  406.     if (m_pDisplayCards)  
  407.     {  
  408.         delete []m_pDisplayCards;  
  409.         m_pDisplayCards = NULL;  
  410.     }  
  411.   
  412.     if (m_hNvApiDll)  
  413.     {  
  414.         FreeLibrary(m_hNvApiDll);  
  415.         m_hNvApiDll = NULL;  
  416.     }  
  417.   
  418.     return TRUE;  
  419. }  
  420.   
  421. BOOL KGpuMon::GetDisplayInfo(const int nCardIndex, DISPLAY_INFO *pDisplayInfo)  
  422. {  
  423.     BOOL bResult = FALSE;  
  424.   
  425.     int nIndex = 0;  
  426.   
  427.     if (nCardIndex < m_nDisplayCardCount)  
  428.     {  
  429.         bResult = GetDisplayCardGpuUsages(m_pDisplayCards[nCardIndex].nvDisplayHandle, &m_pDisplayCards[nCardIndex]);  
  430.         MY_PROCESS_ERROR(bResult);  
  431.   
  432.         pDisplayInfo->nGpuCount = m_pDisplayCards[nCardIndex].nGpuCount;  
  433.         for (nIndex = 0; nIndex < pDisplayInfo->nGpuCount; ++nIndex)  
  434.         {  
  435.             pDisplayInfo->nGpuUsages[nIndex] = m_pDisplayCards[nCardIndex].sGpuInfo[nIndex].nUsage;  
  436.         }  
  437.   
  438.         bResult = GetDisplayCardMemoryInfo(m_pDisplayCards[nCardIndex].nvDisplayHandle, &m_pDisplayCards[nCardIndex]);  
  439.         MY_PROCESS_ERROR(bResult);  
  440.   
  441.         pDisplayInfo->dwTotalMemory = m_pDisplayCards[nCardIndex].dwTotalMemory;  
  442.         pDisplayInfo->dwFreeMemory = m_pDisplayCards[nCardIndex].dwFreeMemory;  
  443.     }  
  444. Exit0:  
  445.     return bResult;  
  446. }  
  447.   
  448. int KGpuMon::GetDisplayCardCount()  
  449. {  
  450.     return m_nDisplayCardCount;  
  451. }  
  452.   
  453. int KGpuMon::EnumDisplayCards()  
  454. {  
  455.     NvStatus nvResult;  
  456.     NvDisplayHandle nvDisplayCardHandle;  
  457.   
  458.     int nIndex = 0;  
  459.   
  460.     m_nDisplayCardCount = 0;  
  461.     if (m_pfnNvAPI_EnumNvidiaDisplayHandle)  
  462.     {  
  463.         for (nIndex = 0; nIndex < MAX_DISPLAY_CARDS; ++nIndex)  
  464.         {  
  465.             nvResult = m_pfnNvAPI_EnumNvidiaDisplayHandle(nIndex, &nvDisplayCardHandle);  
  466.             if (enumNvStatus_OK == nvResult)  
  467.             {  
  468.                 m_pDisplayCards[m_nDisplayCardCount].nvDisplayHandle = nvDisplayCardHandle;  
  469.                 ++m_nDisplayCardCount;  
  470.             }  
  471.         }  
  472.     }  
  473.   
  474.     return m_nDisplayCardCount;  
  475. }  
  476.   
  477. BOOL KGpuMon::GetGpuHandles(const NvDisplayHandle nvDisplayHandle, DISPLAY_CARD_INFO *pCardInfo)  
  478. {  
  479.     BOOL bResult = FALSE;  
  480.   
  481.     NvStatus nvStatus;  
  482.     NvPhysicalGpuHandle *pnvHandles = NULL;  
  483.   
  484.     int nIndex = 0;  
  485.     unsigned int uiGpuCount = 0;  
  486.   
  487.     if (m_pfnNvAPI_GetPhysicalGPUsFromDisplay)  
  488.     {  
  489.         pnvHandles = new NvPhysicalGpuHandle[MAX_PHYSICAL_GPUS];  
  490.         nvStatus = m_pfnNvAPI_GetPhysicalGPUsFromDisplay(nvDisplayHandle, pnvHandles, &uiGpuCount);  
  491.         if (enumNvStatus_OK == nvStatus)  
  492.         {  
  493.             pCardInfo->nGpuCount = min(uiGpuCount, MAX_GPU_NUM);  
  494.             for (nIndex = 0; nIndex < pCardInfo->nGpuCount; ++nIndex)  
  495.             {  
  496.                 pCardInfo->sGpuInfo[nIndex].nvGpuHandle = pnvHandles[nIndex];  
  497.             }  
  498.   
  499.             bResult = TRUE;  
  500.         }  
  501.   
  502.         delete []pnvHandles;  
  503.         pnvHandles = NULL;  
  504.     }  
  505.   
  506.     return bResult;  
  507. }  
  508.   
  509. BOOL KGpuMon::GetDisplayCardGpuUsages(const NvDisplayHandle nvDisplayHandle, DISPLAY_CARD_INFO *pCardInfo)  
  510. {  
  511.     BOOL bResult = FALSE;  
  512.   
  513.     int nIndex = 0;  
  514.   
  515.     NvStatus nvStatus = enumNvStatus_ERROR;  
  516.     NvUsages *pnvUsages = NULL;  
  517.   
  518.     if (m_pfnNvAPI_GPU_GetUsages)  
  519.     {  
  520.         pnvUsages = new NvUsages;  
  521.         pnvUsages->Version = GPU_USAGES_VER;  
  522.         for (nIndex = 0; nIndex < pCardInfo->nGpuCount; ++nIndex)  
  523.         {  
  524.             nvStatus = m_pfnNvAPI_GPU_GetUsages(pCardInfo->sGpuInfo[nIndex].nvGpuHandle, pnvUsages);  
  525.             if (enumNvStatus_OK == nvStatus)  
  526.             {  
  527.                 pCardInfo->sGpuInfo[nIndex].nUsage = pnvUsages->Usages[2];  
  528.             }  
  529.         }  
  530.   
  531.         delete pnvUsages;  
  532.         pnvUsages = NULL;  
  533.   
  534.         bResult = (enumNvStatus_OK == nvStatus) ? TRUE : FALSE;  
  535.     }  
  536.   
  537.     return bResult;  
  538. }  
  539.   
  540. BOOL KGpuMon::GetDisplayCardMemoryInfo(const NvDisplayHandle nvDisplayHandle, DISPLAY_CARD_INFO *pCardInfo)  
  541. {  
  542.     BOOL bResult = FALSE;  
  543.   
  544.     int nIndex = 0;  
  545.   
  546.     NvStatus nvStatus = enumNvStatus_ERROR;  
  547.     NvUsages *pnvUsages = NULL;  
  548.     NvMemoryInfo sMemoryInfo;  
  549.   
  550.     if (m_pfnNvAPI_GPU_GetMemoryInfo)  
  551.     {  
  552.         sMemoryInfo.Version = GPU_MEMORY_INFO_VER;  
  553.         nvStatus = m_pfnNvAPI_GPU_GetMemoryInfo(nvDisplayHandle, &sMemoryInfo);  
  554.         if (enumNvStatus_OK == nvStatus)  
  555.         {  
  556.             pCardInfo->dwTotalMemory = (DWORD)(sMemoryInfo.Values[0]);  
  557.             pCardInfo->dwFreeMemory = (DWORD)(sMemoryInfo.Values[4]);  
  558.   
  559.             bResult = TRUE;  
  560.         }  
  561.     }  
  562.   
  563.     return bResult;  
  564. }  

注意:32位程序使用LoadLibiary加载的是“nvapi.dll”,64位程序要使用“nvapi64.dll”;

            记得先调用Init();

     nviapi参考页:http://docs.nvidia.com/gameworks/content/gameworkslibrary/coresdk/nvapi/index.html

你可能感兴趣的:(如何获取显卡的GPU占用率和显存占用情况)