nvidia显卡信息获取以及配置

  1. 获取温度
		memset(&Config, 0, sizeof(Config));
		Config.version = NV_GPU_THERMAL_SETTINGS_VER;
		Stat = _NvAPI_GPU_GetThermalSettings(m_hNvGpu[i], NVAPI_THERMAL_TARGET_ALL, &Config);
		if(Stat == NVAPI_OK)
		{
			fTemp = (float)Config.sensor[0].currentTemp;
			sprintf(szName, "GpuTemperature#%d", i);
			SetProp(szName, fTemp);
		}
  1. 获取TDP(最大功耗)默认值
	NV_GPU_POWER_POLICY_INFO_PARAMS_V1	gppinfo1 = {};
	gppinfo1.version = NV_GPU_POWER_POLICY_INFO_PARAMS_VER_1;
	gppinfo1.policyMask = -1;
	gppinfo1.policyRelMask = -1;
	Stat = _NvAPI_GPU_PowerPolicyGetInfo(hGpu, (NV_GPU_POWER_POLICY_INFO_PARAMS *)&gppinfo1);
	if(Stat == NVAPI_OK)
	{
		for(i=0; i<NV_GPU_POWER_POLICY_MAX_POLICIES_V1; i++)
		{
			if(gppinfo1.policies[i].type != NV_GPU_POWER_POLICY_TYPE_TOTAL_GPU)
				continue;
			m_nNvTdpDef = gppinfo1.policies[i].limitRated;
			m_nNvTdpMin = gppinfo1.policies[i].limitMin;
			m_nNvTdpMax = gppinfo1.policies[i].limitMax;
			s_fDefTdp = m_nNvTdpDef / 1000.0f;
			plIdx = i;
			break;
		}
	}
  1. 获取TDP设置值(当前值)
	gppc.version = NV_GPU_POWER_POLICY_CONTROL_PARAMS_VER_1;
	gppc.policyMask = NV_GPU_POWER_POLICY_TYPE_HW_THRESHOLD;
	gppc.policyMask = (1<<plIdx);
	Stat = _NvAPI_GPU_PowerPolicyGetControl(hGpu, (NV_GPU_POWER_POLICY_CONTROL_PARAMS *)&gppc);
	if(Stat == NVAPI_OK)
	{
		for(i=0; i<NV_GPU_POWER_POLICY_MAX_POLICIES_V1; i++)
		{
			if(gppc.policies[i].type != NV_GPU_POWER_POLICY_TYPE_TOTAL_GPU)
				continue;
			if(gppc.policies[i].limitCurr == 0)
				continue;

			m_nNvTdpCur = gppc.policies[i].limitCurr;
			s_fCurTdp = m_nNvTdpCur / 1000.0f;
			break;
		}
	}
  1. 获取当前功耗百分比, 功耗值=默认TDP*百分比
		NV_GPU_CLIENT_POWER_TOPOLOGY_STATUS	gcptstat = {};
		gcptstat.version = NV_GPU_CLIENT_POWER_TOPOLOGY_STATUS_VER;
		gcptstat.numChannels	= 2;
		gcptstat.channels[0].channelId = NV_GPU_CLIENT_POWER_TOPOLOGY_CHANNEL_ID_TOTAL_GPU_POWER;
		gcptstat.channels[1].channelId = NV_GPU_CLIENT_POWER_TOPOLOGY_CHANNEL_ID_NORMALIZED_TOTAL_POWER;
		Stat = _NvAPI_GPU_ClientPowerTopologyGetStatus(m_hNvGpu[i], &gcptstat);		//	功率百分比
		if(Stat == NVAPI_OK)
		{
			fPowerPst = gcptstat.channels[0].power.mp/1000.0f;	//	GPU功率%
			sprintf(szName, "GpuPowPst#%d", i);
			sprintf(szValue, "%.1f", fPowerPst);
			SetProp(szName, szValue);
		}
  1. 修改TDP(功耗墙)
	limitCurr = NData::ftoi(nNvTdpDef * fTdpPst);
	gppcp2.policies[plIdx].limitCurr = limitCurr;
	Stat = _NvAPI_GPU_PowerPolicySetControl(hGpu, (NV_GPU_POWER_POLICY_CONTROL_PARAMS *)&gppcp2);
	if(Stat != NVAPI_OK)
		return FALSE;

部分驱动使用 _NvAPI_GPU_PowerPolicySetControl 导致系统卡死, 可以用_NvAPI_GPU_ClientPowerPoliciesGetStatus, _NvAPI_GPU_ClientPowerPoliciesSetStatus 替换

  1. 显卡温度限制墙-范围
    _NvAPI_GPU_ClientThermalPoliciesGetInfo

  2. 显卡温度限制墙-获取,修改
    _NvAPI_GPU_ClientThermalPoliciesGetStatus
    _NvAPI_GPU_ClientThermalPoliciesSetStatus

  3. 修改核心频率
    一般只修改最大负载情况频率, 也就是 NVAPI_GPU_PERF_PSTATE_P0
    _NvAPI_GPU_GetPstates20
    _NvAPI_GPU_SetPstates20
    其中包括范围, 和当前值

posted @ 2023-01-18 12:37  Yofoo  阅读(371)  评论(0编辑  收藏  举报