用NVAPI获取GPU信息

通过nvapi可以获得GPU的温度和性能参数。主页在这里:https://developer.nvidia.com/nvapi

我的代码基础是来自互联网,不过略加变化。首先是获取物理GPU,然后是获取温度,最后是获取GPU性能。另外,获取GPU性能不需要自己通过offset从dll中导出函数。


#include "stdafx.h"
#include "R313-developer/nvapi.h"


int _tmain(int argc, _TCHAR* argv[])
{
    NvAPI_Status ret = NVAPI_OK;
    int i=0;

    NvDisplayHandle hDisplay_a[NVAPI_MAX_PHYSICAL_GPUS*2] = {0};

    ret = NvAPI_Initialize();

    if (!ret == NVAPI_OK){
        NvAPI_ShortString str;
        NvAPI_GetErrorMessage(ret, str);
        printf("NVAPI NvAPI_Initialize: %s\n", str);
		return 1;
    }

    NvAPI_ShortString ver;

    NvAPI_GetInterfaceVersionString(ver);
    printf("NVAPI Version: %s\n", ver);

    NvU32 cnt;

    NvPhysicalGpuHandle phys;

    ret = NvAPI_EnumPhysicalGPUs(&phys, &cnt);

    if (!ret == NVAPI_OK){
        NvAPI_ShortString string;
        NvAPI_GetErrorMessage(ret, string);
        printf("NVAPI NvAPI_EnumPhysicalGPUs: %s\n", string);
		return 1;
    }

    NvAPI_ShortString name;

    NV_GPU_THERMAL_SETTINGS thermal;

    ret = NvAPI_GPU_GetFullName(phys, name);
    if (!ret == NVAPI_OK){
        NvAPI_ShortString string;
        NvAPI_GetErrorMessage(ret, string);
        printf("NVAPI NvAPI_GPU_GetFullName: %s\n", string);
		return 1;
    }

    printf("Name: %s\n", name);
    thermal.version = NV_GPU_THERMAL_SETTINGS_VER;
    ret = NvAPI_GPU_GetThermalSettings(phys,0, &thermal);

    if (!ret == NVAPI_OK){
        NvAPI_ShortString string;
        NvAPI_GetErrorMessage(ret, string);
        printf("NVAPI NvAPI_GPU_GetThermalSettings: %s\n", string);
		return 1;
    }
	
	printf("Temp: %u C\n", static_cast<unsigned>(thermal.sensor[0].currentTemp));

	NV_GPU_DYNAMIC_PSTATES_INFO_EX infoEx;
	infoEx.version = NV_GPU_DYNAMIC_PSTATES_INFO_EX_VER;
	ret = NvAPI_GPU_GetDynamicPstatesInfoEx(phys, &infoEx);

	if (!ret == NVAPI_OK) {
        NvAPI_ShortString string;
        NvAPI_GetErrorMessage(ret, string);
        printf("NVAPI NvAPI_GPU_GetDynamicPstatesInfoEx: %s\n", string);
		return 1;
	}

	//printf("Physical GPU utilization%s", infoEx.utilization[0].);	
    return 0;


获取服务器显卡信息,可以使用Java程序访问操作系统的API或者使用第三方库来获取。下面是一个使用JNA库获取显卡信息的示例代码: ```java import com.sun.jna.Library; import com.sun.jna.Native; import com.sun.jna.Structure; import com.sun.jna.ptr.IntByReference; import com.sun.jna.win32.StdCallLibrary; public class GPUInfo { public static void main(String[] args) { try { GPUInfo.GPU gpu = GPUInfo.getGPU(); System.out.println(gpu.toString()); } catch (Exception e) { e.printStackTrace(); } } public static GPU getGPU() throws Exception { GPU gpu = new GPU(); NVAPI.NvAPI_Initialize(); NvPhysicalGpuHandle gpuHandle = new NvPhysicalGpuHandle(); NVAPI.NvAPI_EnumPhysicalGPUs(gpuHandle); NV_DISPLAY_DRIVER_MEMORY_INFO memInfo = new NV_DISPLAY_DRIVER_MEMORY_INFO(); memInfo.version = NV_DISPLAY_DRIVER_MEMORY_INFO_VER; NVAPI.NvAPI_GPU_GetMemoryInfo(gpuHandle, memInfo); gpu.memoryTotal = memInfo.memorySize; gpu.memoryUsed = memInfo.memoryUsed; gpu.memoryFree = gpu.memoryTotal - gpu.memoryUsed; return gpu; } public static class GPU { public int memoryTotal; public int memoryUsed; public int memoryFree; @Override public String toString() { return "GPU{" + "memoryTotal=" + memoryTotal + ", memoryUsed=" + memoryUsed + ", memoryFree=" + memoryFree + '}'; } } public interface NVAPI extends Library { int NVAPI_MAX_PHYSICAL_GPUS = 64; int NVAPI_MAX_USAGES_PER_GPU = 34; int NVAPI_INTERFACE_VERSION = 0x0100E900; int NVAPI_GENERIC_STRING_MAX = 4096; int ERROR_SUCCESS = 0; int ERROR_INVALID_PARAMETER = -1; int ERROR_NOT_SUPPORTED = -2; int ERROR_NVIDIA_DEVICE_NOT_FOUND = -3; int ERROR_FUNCTION_NOT_FOUND = -4; int ERROR_NVIDIA_DRIVER_NOT_LOADED = -5; NVAPI INSTANCE = (NVAPI) Native.loadLibrary("nvapi64", NVAPI.class); int NvAPI_Initialize(); int NvAPI_EnumPhysicalGPUs(NvPhysicalGpuHandle[] gpuHandles); int NvAPI_GPU_GetMemoryInfo(NvPhysicalGpuHandle gpuHandle, NV_DISPLAY_DRIVER_MEMORY_INFO pMemoryInfo); } public interface NV_DISPLAY_DRIVER_MEMORY_INFO_VER { } public static class NvPhysicalGpuHandle extends Structure { public byte[] data = new byte[4]; } public static class NV_DISPLAY_DRIVER_MEMORY_INFO extends Structure { public int version; public int values[]; } } ``` 需要注意的是,这个代码只能在Windows系统上运行,并且需要安装NVIDIA显卡驱动程序。如果你的服务器使用的是其他操作系统或者其他显卡品牌,需要使用相应的API或者库来获取显卡信息
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值